def __init__(self, subcode_enable=False, subcode_indented=False):
        ColorDelegator.__init__(self)

        self.set_enable(subcode_enable)
        self.set_indented(subcode_indented)

        self.subcodeprog = SubcodeColorDelegator.subcodeprog
Beispiel #2
0
    def __init__(self, subcode_enable=False, subcode_indented=False):
        ColorDelegator.__init__(self)

        self.set_enable(subcode_enable)
        self.set_indented(subcode_indented)



        self.subcodeprog = SubcodeColorDelegator.subcodeprog
Beispiel #3
0
    def __init__(我, tx= None):

        file_mp3= '_gtts_tc_yinyang.mp3'
        if sys.platform=='darwin':
            file_mp3= '_gtts_tc_yinyang.ogg' # mac 上 pygame 不吃 .mp3,只吃.ogg
        
        L= 55560 # time length of mp3, in ms
        sumT= sum([x[2] for x in timeText])
        
        if tx==None:
            tx= Text()
            tx.pack()
            Percolator(tx).insertfilter(ColorDelegator())
        
        tx.tag_configure('highlight', background='yellow')#, relief='raised')
                
        accT= 0
        Z=[]
        for x in timeText:
            z= [x[0], x[2], accT, accT+x[2], '1.0', '1.0'] 
            # 最後2個: z[4], z[5] , 預留給文字在螢幕上的位置 idx1, idx2
            accT += x[2]
            Z += [z]
        
        pygame.mixer.pre_init(frequency= 16000, channels=1, size=-16)
        pygame.mixer.init()
        pygame.mixer.music.load(file_mp3) #'_gtts_tc_yinyang.mp3')
        
        我.Z= Z
        我.L= L
        我.sumT= sumT
        我.tx= tx
Beispiel #4
0
    def setup_gui(self):
        self.root = root = tk.Tk()

        main_pane = tk.PanedWindow(root, orient=tk.HORIZONTAL, showhandle=True)
        main_pane.pack(fill=tk.BOTH, expand=True)
        left_frame = tk.Frame(main_pane)
        main_pane.add(left_frame)
        left_frame.grid_columnconfigure(0, weight=1)
        left_frame.grid_rowconfigure(0, weight=1)
        left_frame.grid_rowconfigure(1, weight=1)
        left_frame.grid_rowconfigure(2, weight=0)
        self.text = text = tk.Text(left_frame)
        text.grid(row=0, column=0, sticky=tk.N + tk.S + tk.E + tk.W)
        for l in self.source:
            text.insert(tk.END, '  ')
            text.insert(tk.END, l)
        text.config(state=tk.DISABLED)
        Percolator(self.text).insertfilter(ColorDelegator())
        self.canvas = canvas = tk.Canvas(main_pane, bg='white')
        main_pane.add(canvas)

        stdout_text = tk.Text(left_frame)
        stdout_text.grid(row=1, column=0, sticky=tk.N + tk.S + tk.E + tk.W)
        stdout_text.config(state=tk.DISABLED)
        sys.stdout = TkTextStream(stdout_text)
        button = tk.Button(left_frame, text="Step", command=root.quit)
        button.grid(row=2, column=0)
        root.bind("<KeyPress>", self._keydown)
        self.image = None
        self.last_line = None
Beispiel #5
0
    def __init__(self, *args, **kwargs):
        super(ConsoleText, self).__init__(*args, **kwargs)
        # The shared queue of the PRODUCER-CONSUMER model.
        self.__queue    = Queue.Queue()
        self.text.tag_configure('STDOUT',   foreground='black')
        self.text.tag_configure('STDERR',   foreground='red')
        self.text.tag_configure('TIP', foreground='forestgreen')
        self.text.tag_configure('HISTORY',   foreground='purple')
        self.text.tag_configure('RETVAL',    foreground='orange')
        
        self.text.bind('<KeyPress>', self.onKeyPress)

        
        # Experimenting with idlelib.AutoComplete
        #############################################################
        self.indentwidth    = 4
        self.tabwidth       = 4
        self.context_use_ps1    = '>>> '
        self.__autoComplete = AutoComplete(self)  
        #############################################################
                
        # Syntax highlight is implemented by idlelib
        #############################################################                
        self.percolator = Percolator(self.text)
        self.colorDelegator = ColorDelegator()
        self.percolator.insertfilter(self.colorDelegator)   
        #############################################################                        
        self.promptSymbol = '>>> '    
    def subcode_recolorize_main(self):

        # monkey patch update to avoid flickering of subcode markers
        _update = self.update
        try:
            self.update = lambda: None
            ColorDelegator.recolorize_main(self)
        finally:
            self.update = _update  # must restore update function

        item = self.tag_nextrange("TODO", '1.0')
        if item:
            self.update()
            return  # colorizer didn't finish labeling MAYBESUBCODE, abort

        # colorize the MAYBESUBCODE as SUBCODE if it is, else comment
        next = "1.0"
        while True:
            item = self.tag_nextrange("MAYBESUBCODE", next)
            if not item:
                break
            # remove MAYBESUBCODE and replace with COMMENT
            head, tail = item
            self.tag_remove("MAYBESUBCODE", head, tail)
            self.tag_add("COMMENT", head, tail)

            chars = self.get(head, tail)
            #print 'consider', repr(chars)

            # tag multiline comments then subcode markers
            m = self.subcodeprog.search(chars)

            while m:
                value = m.groupdict()['SUBCODE']
                if value:
                    a, b = m.span("SUBCODE")
                    start = head + "+%dc" % a
                    stop = head + "+%dc" % b
                    if not chars[:a].strip(
                    ):  # fix subtle bug for ##  ## lines
                        self.tag_remove("COMMENT", start, stop)
                        self.tag_add("SUBCODE", start, stop)

                m = self.subcodeprog.search(chars, m.end())
            next = tail

        self.update()
Beispiel #7
0
 def LoadTagDefs(self):
     ColorDelegator.LoadTagDefs(self)
     theme = idleConf.GetOption('main', 'Theme', 'name')
     self.tagdefs.update({'stdin': {'background': None,'foreground': None},'stdout': idleConf.GetHighlight(theme, 'stdout'),
        'stderr': idleConf.GetHighlight(theme, 'stderr'),
        'console': idleConf.GetHighlight(theme, 'console')
        })
     return
Beispiel #8
0
    def subcode_recolorize_main(self):

        # monkey patch update to avoid flickering of subcode markers
        _update = self.update
        try:
            self.update = lambda:None
            ColorDelegator.recolorize_main(self)
        finally:
            self.update = _update  # must restore update function

        item = self.tag_nextrange("TODO", '1.0')
        if item:
            self.update()
            return  # colorizer didn't finish labeling MAYBESUBCODE, abort

        # colorize the MAYBESUBCODE as SUBCODE if it is, else comment
        next = "1.0"
        while True:
            item = self.tag_nextrange("MAYBESUBCODE", next)
            if not item:
                break
            # remove MAYBESUBCODE and replace with COMMENT
            head, tail = item
            self.tag_remove("MAYBESUBCODE", head, tail)
            self.tag_add("COMMENT", head, tail)

            chars = self.get(head, tail)
            #print 'consider', repr(chars)

            # tag multiline comments then subcode markers
            m = self.subcodeprog.search(chars)

            while m:
                value = m.groupdict()['SUBCODE']
                if value:
                    a, b = m.span("SUBCODE")
                    start = head + "+%dc" % a
                    stop = head + "+%dc" % b
                    if not chars[:a].strip(): # fix subtle bug for ##  ## lines
                        self.tag_remove("COMMENT",start, stop)
                        self.tag_add("SUBCODE", start, stop)

                m = self.subcodeprog.search(chars, m.end())
            next = tail

        self.update()
 def LoadTagDefs(self):
     ColorDelegator.LoadTagDefs(self)
     theme = idleConf.GetOption('main','Theme','name')
     self.tagdefs.update({
         "stdin": {'background':None,'foreground':None},
         "stdout": idleConf.GetHighlight(theme, "stdout"),
         "stderr": idleConf.GetHighlight(theme, "stderr"),
         "console": idleConf.GetHighlight(theme, "console"),
     })
Beispiel #10
0
    def config_colors(self):

        if COLOR_ADAPT:
            try:
                self.set_subcode_colors()
            except Exception as err:
                print('color_adapt', err)

        font=(idleConf.GetOption('main', 'EditorWindow', 'font'),
              idleConf.GetOption('main', 'EditorWindow', 'font-size'),
              'bold')


        self.tagdefs['SUBCODE'] = self.tagdefs['COMMENT'].copy()
        self.tagdefs['SUBCODE'].update({'background': SUBCODE_BACKGROUND,
                                'font':font,
                                })

        self.tagdefs['MAYBESUBCODE'] = self.tagdefs['COMMENT']

        ColorDelegator.config_colors(self)

        self.tag_raise('SUBCODE')
        self.tag_raise('sel')  # 2011-12-29 - bug fix for highlighting
    def config_colors(self):

        if COLOR_ADAPT:
            try:
                self.set_subcode_colors()
            except Exception as err:
                print('color_adapt', err)

        font = (idleConf.GetOption('main', 'EditorWindow', 'font'),
                idleConf.GetOption('main', 'EditorWindow',
                                   'font-size'), 'bold')

        self.tagdefs['SUBCODE'] = self.tagdefs['COMMENT'].copy()
        self.tagdefs['SUBCODE'].update({
            'background': SUBCODE_BACKGROUND,
            'font': font,
        })

        self.tagdefs['MAYBESUBCODE'] = self.tagdefs['COMMENT']

        ColorDelegator.config_colors(self)

        self.tag_raise('SUBCODE')
        self.tag_raise('sel')  # 2011-12-29 - bug fix for highlighting
Beispiel #12
0
    def makeInputText(self, root):
        inputFm = Frame(root)
        self.inputText = Text(inputFm, height=10)
        inputScrollbar = Scrollbar(inputFm, orient=VERTICAL)
        self.inputText.pack(side="left", fill=BOTH, expand=YES)
        inputScrollbar.pack(side="left", fill=Y)
        self.inputText.config(yscrollcommand=inputScrollbar.set)
        inputScrollbar.config(command=self.inputText.yview)
        Percolator(self.inputText).insertfilter(ColorDelegator())
        self.inputText.bind('<Control-Shift-B>', self.runCmd)

        # 右键弹出式菜单
        popupCmd = [{
            "label": "执行命令",
            "cmd": self.runCmd
        }, {
            "label": "执行脚本",
            "cmd": self.runScript
        }]
        self.popup = Menu(root, tearoff=0)
        for item in popupCmd:
            self.popup.add_command(label=item["label"], command=item["cmd"])
        self.inputText.bind('<Button-3>', self.makePopupMenu)

        # 跟踪插入光标的行列信息
        self.inputText.bind('<KeyRelease>', self.updateInsertPos)
        self.inputText.bind('<ButtonRelease>', self.updateInsertPos)

        # 读取默认测试脚本
        if os.path.exists(os.getcwd() + "\\testsuite\default.py"):
            f = open(os.getcwd() + "\\testsuite\default.py")
            testsuite = f.read()
            f.close
            self.inputText.insert("1.0", testsuite)

        return inputFm
Beispiel #13
0
 def add_colors_to_text(text):
     color_config(text)
     p = Percolator(text)
     d = ColorDelegator()
     p.insertfilter(d)
class CodeBrowser:

    menudefs = [
        ('edit', [
            None,
            ('Toggle Code _Browser', '<<toggle-classdefbrowser>>'),
        ]),
    ]

    def __init__(self, editwin):
        self.editwin = editwin
        self.text = self.editwin.text
        self.text.bind('<<toggle-classdefbrowser>>', self.toggle_classdef)
        self.text.bind('<<toggle-keywordbrowser>>', self.toggle_keyword)
        #self.text.bind('<Button-1>', self.button_click, '+')
        self.browser_text = []
        self.init_status_bar()
        self.hidden = True
        self.after_id = None

    def close(self):
        if self.after_id is not None:
            self.text.after_cancel(self.after_id)

    def init_status_bar(self):
        sb = self.editwin.status_bar
        sb.set_label('ClassDefBrowser', text="Code Browser")
        L = sb.labels['ClassDefBrowser']
        L.bind('<Button-1>', self.toggle_classdef)
        L.bind('<Button-3>', self.toggle_keyword)
        ToolTip(L, "Click to Show Classes and Definitions in buffer")

    def font_timer_event(self):
        if self.hidden:
            return
        # taken from CodeContext.py
        newtextfont = self.editwin.text["font"]
        if self.textln and newtextfont != self.textfont:
            self.textfont = newtextfont
            self.textln["font"] = self.textfont
        self.after_id = self.text.after(FONTUPDATEINTERVAL,
                                        self.font_timer_event)

    def toggle_classdef(self, ev=None):
        tag_filter = {'KEYWORD': ['def', 'class']}
        self.text.after(1, lambda: self.toggle(tag_filter))

    def toggle_keyword(self, ev=None):
        tag_filter = {'KEYWORD': ['def', 'class'], 'COMMENT': True}

        #self.toggle(tag_filter)
        self.text.after(1, lambda: self.toggle(tag_filter))

    def toggle(self, tag_filter=None):
        if self.hidden:
            self.show(tag_filter)
        else:
            self.hide()

    def button_click(self, ev=None):
        print('button_click')
        # TODO - goto defintion on Ctrl+Click

    def show(self, tag_filter=None):

        if self.hidden == False:
            self.hide()
            return

        self.hidden = False

        # add a text widget, left of code text widget
        self.text_frame = text_frame = Frame(self.editwin.text_frame)
        self.vbar = vbar = Scrollbar(text_frame, name='vbar')
        vbar.pack(side=RIGHT, fill=Y)

        theme = idleConf.GetOption('main', 'Theme', 'name')
        normal_colors = idleConf.GetHighlight(theme, 'normal')
        text_options = {
            'padx': 5,
            'wrap': 'none',
            'cursor': 'arrow',
            'wrap': 'none',
            'foreground': normal_colors['foreground'],
            'background': normal_colors['background'],
        }

        self.textln = textln = Text(text_frame, **text_options)
        textln.pack(side='left', fill=BOTH, expand=YES)
        vbar['command'] = textln.yview
        textln['yscrollcommand'] = vbar.set

        # adjust font

        textln.config(
            font=(idleConf.GetOption('main', 'EditorWindow', 'font'),
                  idleConf.GetOption('main', 'EditorWindow', 'font-size')))

        textln.bind("<ButtonRelease>", self.focus_in_event)
        textln.bind("<Return>", self.enter_callback)
        textln.bind("<Escape>", self.escape_callback)
        textln.bind('<FocusOut>', self.focus_out, '+')

        # pass through keybindings for classdefbrowser
        keydefs = idleConf.GetExtensionBindings('CodeBrowser')
        for event, keylist in list(keydefs.items()):
            for k in keylist:

                def passthru(event, evName=event, text=self.text):
                    text.event_generate(evName)

                try:
                    textln.bind(k, passthru)
                except TclError as err:
                    print(err)
                    pass

        # start the line numbers
        self.per = per = Percolator(textln)
        self.color = ColorDelegator()

        self.per.insertfilter(self.color)

        self.line_delegator = LineDelegator()
        per.insertfilter(self.line_delegator)
        textln._insert = self.line_delegator.delegate.insert
        textln._delete = self.line_delegator.delegate.delete

        self.update_display(tag_filter)
        self.textfont = ""
        self.font_timer_event()

        self.nearest()

        text_frame.place(x=0, rely=1, relheight=1, relwidth=1, anchor=SW)
        text_frame.lift()

    def nearest(self):
        """ Enter ClassDefBrowser """
        # scroll textln to the nearest keyword found in text
        text = self.text
        textln = self.textln

        text_insert, text_col = sp(text.index(INSERT))

        text_end, col = sp(text.index(END))
        text_end -= 1
        text_top = (text.yview()[0] * text_end)
        text_bot = (text.yview()[1] * text_end)

        if text_top <= text_insert <= text_bot:
            pass
        else:
            text_insert = round((text_bot + text_top) / 2.0)
            for i in reversed(self.taglines):
                if i[0] <= text_insert:
                    text_insert = i[0]
                    break

        n = 0
        for n, i in enumerate(self.taglines):
            if i[0] > text_insert:
                target_line = n
                break
        else:
            target_line = n + 1

        textln.tag_add("NEAREST", '%i.0' % target_line,
                       '%i.0' % (target_line + 1))
        theme = idleConf.GetOption('main', 'Theme', 'name')
        hilite = idleConf.GetHighlight(theme, "hilite")
        textln.tag_configure("NEAREST", **hilite)
        textln.tag_raise('NEAREST')

        # place cursor at beginning of line text
        tline = min(target_line - 1, len(self.taglines) - 1)
        if self.taglines:
            origline, txt = self.taglines[tline]
            text_col = txt.find(txt.strip())
            textln.mark_set(INSERT, '%i.%i' % (target_line, text_col))

        offset = text_insert - round(text_top) - 1
        textln.yview(target_line - offset)

        textln.focus_set()

    def focus_out(self, ev=None):
        self.hide()

    def hide(self, event=None):
        if self.color:
            self.per.removefilter(self.color)
        self.text_frame.destroy()
        self.browser_text = None
        self.hidden = True
        self.text.focus_set()

    def enter_callback(self, ev=None):
        self.focus_in_event()

    def escape_callback(self, ev=None):
        self.hide()

    def focus_in_event(self, event=None):
        """ Leaves ClassDefBrowser, returns to source code."""
        if self.hidden:
            return

        # don't leave on scroll wheel events
        if event and event.state != 256:  # FIXME
            return

        t = self.textln
        line, col = list(map(int, t.index(INSERT).split('.')))

        ind = line - TEXTOFFSET
        if 0 <= ind < len(self.taglines):
            L = self.taglines[ind][0]

            self.text.mark_set(INSERT, '%i.%i' % (L, col))
            self.editwin.set_line_and_column()

            line_end, col_end = sp(self.textln.index(END))

            d = self.textln.yview()[0] * line_end
            offset = L - line + round(d // 1) + 1

            text_end, col_end = sp(self.text.index(END))
            self.text.yview(offset)

        self.hide()

    def nextrange(self, taglist, marker):
        text = self.text

        L = []
        for tag in taglist:
            n = text.tag_nextrange(tag, marker)
            if n:
                L.append((sp(n[0]), sp(n[1]), tag))

        if L:
            # find nearest range
            L.sort()
            line, col, tag = L[0]

            return (jn(*line), jn(*col)), tag

        else:
            return None, None

    def update_display(self, tag_filter=None):
        if self.hidden:
            return

        if tag_filter is None:
            tag_filter = {'KEYWORD': ['def', 'class'], 'COMMENT': True}

        text = self.text
        marker = "1.0"
        taglines = []
        lastline = 0
        lasttag = None
        while True:
            c, tag = self.nextrange(list(tag_filter.keys()), marker)

            if not c:
                break

            line, col = sp(c[0])

            if line == lastline:
                #if tag == lasttag:
                marker = c[1]
                continue

            lastline = line
            lasttag == tag

            tagtxt = text.get(c[0], c[1])

            filt = tag_filter[tag]
            if filt == True or tagtxt in filt:
                txt = text.get('%i.0' % line, '%i.0 lineend' % (line))
                taglines.append((line, txt))
            marker = c[1]

        textln = self.textln
        VIEW = textln.yview()

        text = self.editwin.text

        code_items = []

        for n, i in enumerate(taglines):
            line, t = i
            code_items.append('%4i  %s' % i)

        code_items.extend([''] * 5)
        code_text = '\n'.join(code_items)

        if not code_text.strip():
            code_text = '\nCode Browser found no classes or definitions.\nPress Escape to return to editing.'

        if self.browser_text != code_text:  # check if I need to update the display, avoid flickering
            textln._delete(1.0, END)
            textln._insert(END, code_text)
            self.color.recolorize_main()
            self.browser_text = code_text
            self.taglines = taglines

        self.nearest()
    def show(self, tag_filter=None):

        if self.hidden == False:
            self.hide()
            return

        self.hidden = False

        # add a text widget, left of code text widget
        self.text_frame = text_frame = Frame(self.editwin.text_frame)
        self.vbar = vbar = Scrollbar(text_frame, name='vbar')
        vbar.pack(side=RIGHT, fill=Y)

        theme = idleConf.GetOption('main', 'Theme', 'name')
        normal_colors = idleConf.GetHighlight(theme, 'normal')
        text_options = {
            'padx': 5,
            'wrap': 'none',
            'cursor': 'arrow',
            'wrap': 'none',
            'foreground': normal_colors['foreground'],
            'background': normal_colors['background'],
        }

        self.textln = textln = Text(text_frame, **text_options)
        textln.pack(side='left', fill=BOTH, expand=YES)
        vbar['command'] = textln.yview
        textln['yscrollcommand'] = vbar.set

        # adjust font

        textln.config(
            font=(idleConf.GetOption('main', 'EditorWindow', 'font'),
                  idleConf.GetOption('main', 'EditorWindow', 'font-size')))

        textln.bind("<ButtonRelease>", self.focus_in_event)
        textln.bind("<Return>", self.enter_callback)
        textln.bind("<Escape>", self.escape_callback)
        textln.bind('<FocusOut>', self.focus_out, '+')

        # pass through keybindings for classdefbrowser
        keydefs = idleConf.GetExtensionBindings('CodeBrowser')
        for event, keylist in list(keydefs.items()):
            for k in keylist:

                def passthru(event, evName=event, text=self.text):
                    text.event_generate(evName)

                try:
                    textln.bind(k, passthru)
                except TclError as err:
                    print(err)
                    pass

        # start the line numbers
        self.per = per = Percolator(textln)
        self.color = ColorDelegator()

        self.per.insertfilter(self.color)

        self.line_delegator = LineDelegator()
        per.insertfilter(self.line_delegator)
        textln._insert = self.line_delegator.delegate.insert
        textln._delete = self.line_delegator.delegate.delete

        self.update_display(tag_filter)
        self.textfont = ""
        self.font_timer_event()

        self.nearest()

        text_frame.place(x=0, rely=1, relheight=1, relwidth=1, anchor=SW)
        text_frame.lift()
Beispiel #16
0
    def __init__(self, filename=None):
        self.root = root = turtle._root = Tk()
        root.title('Python turtle-graphics examples')
        root.wm_protocol("WM_DELETE_WINDOW", self._destroy)

        if darwin:
            import subprocess
            # Make sure we are the currently activated OS X application
            # so that our menu bar appears.
            p = subprocess.Popen(
                [
                    'osascript',
                    '-e',
                    'tell application "System Events"',
                    '-e',
                    'set frontmost of the first process whose '
                    'unix id is {} to true'.format(os.getpid()),
                    '-e',
                    'end tell',
                ],
                stderr=subprocess.DEVNULL,
                stdout=subprocess.DEVNULL,
            )

        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.grid_columnconfigure(1, minsize=90, weight=1)
        root.grid_columnconfigure(2, minsize=90, weight=1)
        root.grid_columnconfigure(3, minsize=90, weight=1)

        self.mBar = Menu(root, relief=RAISED, borderwidth=2)
        self.mBar.add_cascade(menu=self.makeLoadDemoMenu(self.mBar),
                              label='Examples',
                              underline=0)
        self.mBar.add_cascade(menu=self.makeFontMenu(self.mBar),
                              label='Fontsize',
                              underline=0)
        self.mBar.add_cascade(menu=self.makeHelpMenu(self.mBar),
                              label='Help',
                              underline=0)
        root['menu'] = self.mBar

        pane = PanedWindow(orient=HORIZONTAL,
                           sashwidth=5,
                           sashrelief=SOLID,
                           bg='#ddd')
        pane.add(self.makeTextFrame(pane))
        pane.add(self.makeGraphFrame(pane))
        pane.grid(row=0, columnspan=4, sticky='news')

        self.output_lbl = Label(root,
                                height=1,
                                text=" --- ",
                                bg="#ddf",
                                font=("Arial", 16, 'normal'),
                                borderwidth=2,
                                relief=RIDGE)
        self.start_btn = Button(root,
                                text=" START ",
                                font=btnfont,
                                fg="white",
                                disabledforeground="#fed",
                                command=self.startDemo)
        self.stop_btn = Button(root,
                               text=" STOP ",
                               font=btnfont,
                               fg="white",
                               disabledforeground="#fed",
                               command=self.stopIt)
        self.clear_btn = Button(root,
                                text=" CLEAR ",
                                font=btnfont,
                                fg="white",
                                disabledforeground="#fed",
                                command=self.clearCanvas)
        self.output_lbl.grid(row=1, column=0, sticky='news', padx=(0, 5))
        self.start_btn.grid(row=1, column=1, sticky='ew')
        self.stop_btn.grid(row=1, column=2, sticky='ew')
        self.clear_btn.grid(row=1, column=3, sticky='ew')

        Percolator(self.text).insertfilter(ColorDelegator())
        self.dirty = False
        self.exitflag = False
        if filename:
            self.loadfile(filename)
        self.configGUI(DISABLED, DISABLED, DISABLED,
                       "Choose example from menu", "black")
        self.state = STARTUP
Beispiel #17
0
 def recolorize_main(self):
     self.tag_remove('TODO', '1.0', 'iomark')
     self.tag_add('SYNC', '1.0', 'iomark')
     ColorDelegator.recolorize_main(self)
Beispiel #18
0
    def __init__(我, filename=None):

        #turtleOld._root=
        我.root = root = turtle._root = Tk()  #Toplevel() #Tk()

        root.title('傳統漢字 (Traditional Chinese, tc) 龜作圖 範例集')

        root.wm_protocol("WM_DELETE_WINDOW", 我._destroy)

        if darwin:
            import subprocess
            # Make sure we are the currently activated OS X application
            # so that our menu bar appears.
            p = subprocess.Popen(
                [
                    'osascript',
                    '-e',
                    'tell application "System Events"',
                    '-e',
                    'set frontmost of the first process whose '
                    'unix id is {} to true'.format(os.getpid()),
                    '-e',
                    'end tell',
                ],
                stderr=subprocess.DEVNULL,
                stdout=subprocess.DEVNULL,
            )

        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.grid_columnconfigure(1, weight=1, minsize=90)
        root.grid_columnconfigure(2, weight=1, minsize=90)
        root.grid_columnconfigure(3, weight=1, minsize=90)

        我.mBar = Menu(root, relief=RAISED, borderwidth=2)
        我.mBar.add_cascade(label='範例',
                           menu=我.makeLoadDemoMenu(我.mBar))  #, underline=0)
        我.mBar.add_cascade(label='字體',
                           menu=我.makeFontMenu(我.mBar))  #, underline=0)
        我.mBar.add_cascade(label='求助',
                           menu=我.makeHelpMenu(我.mBar))  #, underline=0)
        我.mBar.add_cascade(label='新功能',
                           menu=我.新功能選單(我.mBar))  #, underline=0) # (1)
        root['menu'] = 我.mBar

        pane = PanedWindow(
            orient=HORIZONTAL,
            bg='black')  #'#ddd') #sashwidth=6, #sashrelief=SOLID,
        pane.add(我.makeTextFrame(pane))  # for English program display
        pane.add(我.makeTextFrame2(pane))  # for 漢字程式 展示 及修改
        pane.add(我.makeGraphFrame(pane))  # for 畫圖

        pane.grid(row=0, columnspan=4, sticky='news')

        我.output_lbl = Label(root,
                             text="---",
                             font=btnfont,
                             bg="#ddf",
                             borderwidth=2,
                             relief=RIDGE)
        我.start_btn = Button(root,
                             text="開始",
                             command=我.startDemo,
                             font=btnfont,
                             fg="white",
                             disabledforeground="#fed")
        我.stop_btn = Button(root,
                            text="停止",
                            command=我.stopIt,
                            font=btnfont,
                            fg="white",
                            disabledforeground="#fed")
        我.clear_btn = Button(root,
                             text="清除",
                             command=我.clearCanvas,
                             font=btnfont,
                             fg="white",
                             disabledforeground="#fed")

        我.output_lbl.grid(row=1, column=0, sticky='news', padx=(0, 3))
        我.start_btn.grid(row=1, column=1, sticky='ew')
        我.stop_btn.grid(row=1, column=2, sticky='ew')
        我.clear_btn.grid(row=1, column=3, sticky='ew')

        # 讓 程式內文 有 語法 顏色,超酷的!
        Percolator(我.text).insertfilter(ColorDelegator())
        Percolator(我.text2).insertfilter(ColorDelegator())

        我.dirty = False
        我.exitflag = False

        if filename:
            我.loadfile(filename)

        我.configGUI(DISABLED, DISABLED, DISABLED, "由選單 選範例", "black")
        我.state = STARTUP

        # 在 桌面上 建一個 _tcDir 來存放翻譯的檔案。
        dektopDir = os.path.join(os.path.expanduser('~'), 'Desktop')
        我.tcDir = tcDir = os.path.join(dektopDir, '_tcDir')  ## 用底線代表用過可丟。
        if not os.path.exists(tcDir):
            os.mkdir(tcDir)
        if tcDir not in sys.path: sys.path += [tcDir]

        # 順便 把 turtle_tc.py 們 copy 過去,方便在裡面 修改 學習。
        import shutil
        for f in [
                'turtle_tc.py', 'turtle_tc_alias.py',
                'turtle_docstringdict_tc.py'
        ]:
            srcfile = os.path.join(os.path.dirname(__file__), f)
            tgtfile = os.path.join(tcDir, f)
            if not os.path.exists(tgtfile): shutil.copy(srcfile, tcDir)
Beispiel #19
0
    def __init__(self):
        self.root = Tk(className="EDITOR")

        self.python_files = PythonFiles(self)

        self.root.geometry("%dx%d+%d+%d" % (
            self.root.winfo_screenwidth() * 0.5,
            self.root.winfo_screenheight() * 0.4,
            # self.root.winfo_screenwidth() * 0.1, self.root.winfo_screenheight() * 0.1
            0,
            0))

        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)

        self.base_title = "PyEditor v%s" % __version__
        self.root.title(self.base_title)

        self.text_frame = Frame(master=self.root)

        self.text = ScrolledText(master=self.root, background="white")
        self.text.bind("<Tab>", self.tab_event)
        self.text.grid(row=0, column=0, sticky=NSEW)

        #TODO: find a right height
        self.exec_output = ScrolledText(master=self.root,
                                        height=10,
                                        state=DISABLED,
                                        background="#dddddd")

        # for information text like load/save/run:
        self.exec_output.tag_config(
            "info",
            foreground="#0000ff",
            #background="#eeeeee"
        )

        self.exec_output.grid(row=1, column=0, sticky=NSEW)

        self.text.focus_set()

        # self.script_list = ScriptList(self)

        p = Percolator(self.text)
        d = ColorDelegator()
        p.insertfilter(d)

        # add statusbar to window
        self.init_statusbar()

        # add menu to window
        self.init_menu()

        # Add special RPi/Minecraft features, if available
        self.rpi = MinecraftSpecials(self)

        if self.rpi.mcpi_available:
            # minecraft is available
            self.set_content(DEFAULT_MCPI_SCRIPT)
            if not self.rpi.is_running:
                self.rpi.startup_minecraft()
        else:
            # no minecraft available
            self.set_content(DEFAULT_SCRIPT)

        self.root.update()
Beispiel #20
0
class CodeBrowser:

    menudefs = [
        ('edit', [None,
               ('Toggle Code _Browser', '<<toggle-classdefbrowser>>'),
       ]),]

    def __init__(self, editwin):
        self.editwin = editwin
        self.text = self.editwin.text
        self.text.bind('<<toggle-classdefbrowser>>', self.toggle_classdef)
        self.text.bind('<<toggle-keywordbrowser>>', self.toggle_keyword)
        #self.text.bind('<Button-1>', self.button_click, '+')
        self.browser_text = []
        self.init_status_bar()
        self.hidden = True
        self.after_id = None

    def close(self):
        if self.after_id is not None:
            self.text.after_cancel(self.after_id)

    def init_status_bar(self):
        sb = self.editwin.status_bar
        sb.set_label('ClassDefBrowser', text="Code Browser")
        L = sb.labels['ClassDefBrowser']
        L.bind('<Button-1>', self.toggle_classdef)
        L.bind('<Button-3>', self.toggle_keyword)
        ToolTip(L, "Click to Show Classes and Definitions in buffer")

    def font_timer_event(self):
        if self.hidden:
            return
        # taken from CodeContext.py
        newtextfont = self.editwin.text["font"]
        if self.textln and newtextfont != self.textfont:
            self.textfont = newtextfont
            self.textln["font"] = self.textfont
        self.after_id = self.text.after(FONTUPDATEINTERVAL,
                                        self.font_timer_event)


    def toggle_classdef(self, ev=None):
        tag_filter = {'KEYWORD': ['def', 'class']}
        self.text.after(1, lambda: self.toggle(tag_filter))

    def toggle_keyword(self, ev=None):
        tag_filter = {'KEYWORD': ['def', 'class'],
               'COMMENT': True}

        #self.toggle(tag_filter)
        self.text.after(1, lambda: self.toggle(tag_filter))

    def toggle(self, tag_filter=None):
        if self.hidden:
            self.show(tag_filter)
        else:
            self.hide()


    def button_click(self, ev=None):
        print('button_click')
        # TODO - goto defintion on Ctrl+Click


    def show(self, tag_filter=None):

        if self.hidden == False:
            self.hide()
            return

        self.hidden = False

        # add a text widget, left of code text widget
        self.text_frame = text_frame = Frame(self.editwin.text_frame)
        self.vbar = vbar = Scrollbar(text_frame, name='vbar')
        vbar.pack(side=RIGHT, fill=Y)

        theme = idleConf.GetOption('main','Theme','name')
        normal_colors = idleConf.GetHighlight(theme, 'normal')
        text_options = {
                'padx': 5,
                'wrap': 'none',
                'cursor': 'arrow',
                'wrap': 'none',
                'foreground':normal_colors['foreground'],
                'background':normal_colors['background'],
                }

        self.textln = textln = Text(text_frame, **text_options)
        textln.pack(side='left',fill=BOTH, expand=YES)
        vbar['command'] = textln.yview
        textln['yscrollcommand'] = vbar.set

        # adjust font

        textln.config(font=(idleConf.GetOption('main', 'EditorWindow', 'font'),
                          idleConf.GetOption('main', 'EditorWindow', 'font-size')))



        textln.bind("<ButtonRelease>", self.focus_in_event)
        textln.bind("<Return>", self.enter_callback)
        textln.bind("<Escape>", self.escape_callback)
        textln.bind('<FocusOut>', self.focus_out, '+')

        # pass through keybindings for classdefbrowser
        keydefs = idleConf.GetExtensionBindings('CodeBrowser')
        for event, keylist in list(keydefs.items()):
            for k in keylist:
                def passthru(event, evName=event, text=self.text):
                    text.event_generate(evName)
                try:
                    textln.bind(k, passthru)
                except TclError as err:
                    print(err)
                    pass



        # start the line numbers
        self.per = per = Percolator(textln)
        self.color = ColorDelegator()

        self.per.insertfilter(self.color)

        self.line_delegator = LineDelegator()
        per.insertfilter(self.line_delegator)
        textln._insert = self.line_delegator.delegate.insert
        textln._delete = self.line_delegator.delegate.delete

        self.update_display(tag_filter)
        self.textfont = ""
        self.font_timer_event()

        self.nearest()


        text_frame.place(x=0, rely=1, relheight=1, relwidth=1, anchor=SW)
        text_frame.lift()


    def nearest(self):
        """ Enter ClassDefBrowser """
        # scroll textln to the nearest keyword found in text
        text = self.text
        textln = self.textln

        text_insert, text_col = sp(text.index(INSERT))

        text_end, col = sp(text.index(END))
        text_end -= 1
        text_top = (text.yview()[0] * text_end)
        text_bot = (text.yview()[1] * text_end)

        if text_top <= text_insert <= text_bot:
            pass
        else:
            text_insert = round((text_bot + text_top) / 2.0)
            for i in reversed(self.taglines):
                if i[0] <= text_insert:
                    text_insert = i[0]
                    break

        n = 0
        for n, i in enumerate(self.taglines):
            if i[0] > text_insert:
                target_line = n
                break
        else:
            target_line = n + 1


        textln.tag_add("NEAREST", '%i.0' % target_line, '%i.0' % (target_line+1))
        theme = idleConf.GetOption('main','Theme','name')
        hilite = idleConf.GetHighlight(theme, "hilite")
        textln.tag_configure("NEAREST", **hilite)
        textln.tag_raise('NEAREST')


        # place cursor at beginning of line text
        tline = min(target_line-1, len(self.taglines)-1)
        if self.taglines:
            origline, txt = self.taglines[tline]
            text_col = txt.find(txt.strip())
            textln.mark_set(INSERT, '%i.%i' % (target_line, text_col))


        offset = text_insert - round(text_top) - 1
        textln.yview(target_line - offset)

        textln.focus_set()

    def focus_out(self, ev=None):
        self.hide()


    def hide(self, event=None):
        if self.color:
            self.per.removefilter(self.color)
        self.text_frame.destroy()
        self.browser_text = None
        self.hidden = True
        self.text.focus_set()


    def enter_callback(self, ev=None):
        self.focus_in_event()


    def escape_callback(self, ev=None):
        self.hide()


    def focus_in_event(self, event=None):
        """ Leaves ClassDefBrowser, returns to source code."""
        if self.hidden:
            return

        # don't leave on scroll wheel events
        if event and event.state != 256: # FIXME
            return

        t = self.textln
        line, col = list(map(int, t.index(INSERT).split('.')))

        ind = line - TEXTOFFSET
        if 0 <= ind < len(self.taglines):
            L = self.taglines[ind][0]

            self.text.mark_set(INSERT, '%i.%i' % (L, col))
            self.editwin.set_line_and_column()

            line_end, col_end = sp(self.textln.index(END))

            d = self.textln.yview()[0] * line_end
            offset = L - line + round(d//1) + 1

            text_end, col_end = sp(self.text.index(END))
            self.text.yview(offset)


        self.hide()

    def nextrange(self, taglist, marker):
        text = self.text

        L = []
        for tag in taglist:
            n = text.tag_nextrange(tag, marker)
            if n:
                L.append((sp(n[0]), sp(n[1]), tag))

        if L:
            # find nearest range
            L.sort()
            line, col, tag = L[0]

            return (jn(*line), jn(*col)), tag


        else:
            return None, None


    def update_display(self, tag_filter=None):
        if self.hidden:
            return

        if tag_filter is None:
            tag_filter = {'KEYWORD': ['def', 'class'],
                           'COMMENT': True}

        text = self.text
        marker = "1.0"
        taglines = []
        lastline = 0
        lasttag = None
        while True:
            c, tag = self.nextrange(list(tag_filter.keys()), marker)

            if not c:
                break

            line, col = sp(c[0])

            if line == lastline:
                #if tag == lasttag:
                marker = c[1]
                continue

            lastline = line
            lasttag == tag

            tagtxt = text.get(c[0], c[1])

            filt = tag_filter[tag]
            if filt == True or tagtxt in filt:
                txt = text.get('%i.0' % line, '%i.0 lineend' % (line))
                taglines.append((line, txt))
            marker = c[1]


        textln = self.textln
        VIEW = textln.yview()

        text = self.editwin.text

        code_items = []

        for n, i in enumerate(taglines):
            line, t = i
            code_items.append('%4i  %s' % i)

        code_items.extend(['']*5)
        code_text = '\n'.join(code_items)

        if not code_text.strip():
            code_text = '\nCode Browser found no classes or definitions.\nPress Escape to return to editing.'

        if self.browser_text != code_text:  # check if I need to update the display, avoid flickering
            textln._delete(1.0, END)
            textln._insert(END, code_text)
            self.color.recolorize_main()
            self.browser_text = code_text
            self.taglines = taglines

        self.nearest()
 def __init__(self):
     ColorDelegator.__init__(self)
     self.LoadTagDefs()
Beispiel #22
0
 def recolorize_main(self):
     if not self.subcode_enable:
         return ColorDelegator.recolorize_main(self)
     else:
         return self.subcode_recolorize_main()
Beispiel #23
0
    def __init__(我, filename=None):
        我.root = root = turtle._root = Tk()

        root.title(
            'Python 傳統漢字 (Traditional Chinese, tc) 龜作圖 (turtle-graphics) 範例集 (examples)'
        )

        root.wm_protocol("WM_DELETE_WINDOW", 我._destroy)

        if darwin:
            import subprocess
            # Make sure we are the currently activated OS X application
            # so that our menu bar appears.
            p = subprocess.Popen(
                [
                    'osascript',
                    '-e',
                    'tell application "System Events"',
                    '-e',
                    'set frontmost of the first process whose '
                    'unix id is {} to true'.format(os.getpid()),
                    '-e',
                    'end tell',
                ],
                stderr=subprocess.DEVNULL,
                stdout=subprocess.DEVNULL,
            )

        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.grid_columnconfigure(1, minsize=90, weight=1)
        root.grid_columnconfigure(2, minsize=90, weight=1)
        root.grid_columnconfigure(3, minsize=90, weight=1)

        我.mBar = Menu(root, relief=RAISED, borderwidth=2)
        我.mBar.add_cascade(menu=我.makeLoadDemoMenu(我.mBar),
                           label='範例',
                           underline=0)
        我.mBar.add_cascade(menu=我.makeFontMenu(我.mBar),
                           label='字體',
                           underline=0)
        我.mBar.add_cascade(menu=我.makeHelpMenu(我.mBar),
                           label='求助',
                           underline=0)

        我.mBar.add_cascade(menu=我.make翻譯Menu(我.mBar), label='翻譯',
                           underline=0)  # (1)

        root['menu'] = 我.mBar

        pane = PanedWindow(orient=HORIZONTAL,
                           sashwidth=5,
                           sashrelief=SOLID,
                           bg='#ddd')
        pane.add(我.makeTextFrame(pane))
        pane.add(我.makeGraphFrame(pane))

        pane.grid(row=0, columnspan=5, sticky='news')

        我.output_lbl = Label(root,
                             height=1,
                             text=" --- ",
                             bg="#ddf",
                             font=("Arial", 16, 'normal'),
                             borderwidth=2,
                             relief=RIDGE)

        我.翻譯_btn = Button(root,
                          text=" 翻譯 ",
                          font=btnfont,
                          fg="blue",
                          disabledforeground="#fed",
                          command=我.翻譯檔案)

        我.start_btn = Button(root,
                             text=" 開始 ",
                             font=btnfont,
                             fg="white",
                             disabledforeground="#fed",
                             command=我.startDemo)

        我.stop_btn = Button(root,
                            text=" 停止 ",
                            font=btnfont,
                            fg="white",
                            disabledforeground="#fed",
                            command=我.stopIt)

        我.clear_btn = Button(root,
                             text=" 清除 ",
                             font=btnfont,
                             fg="white",
                             disabledforeground="#fed",
                             command=我.clearCanvas)

        我.output_lbl.grid(row=1, column=0, sticky='news', padx=(0, 5))

        我.翻譯_btn.grid(row=1, column=1, sticky='ew')

        我.start_btn.grid(row=1, column=2, sticky='ew')
        我.stop_btn.grid(row=1, column=3, sticky='ew')
        我.clear_btn.grid(row=1, column=4, sticky='ew')

        Percolator(我.text).insertfilter(ColorDelegator())
        我.dirty = False
        我.exitflag = False
        if filename:
            我.loadfile(filename)
        我.configGUI(DISABLED, DISABLED, DISABLED, "由選單 選 範例", "black")
        我.state = STARTUP
Beispiel #24
0
 def recolorize_main(self):
     self.tag_remove('TODO', '1.0', 'iomark')
     self.tag_add('SYNC', '1.0', 'iomark')
     ColorDelegator.recolorize_main(self)
Beispiel #25
0
    def __init__(self, filename=None):
        self.root = root = turtle._root = Tk()
        root.title('Python turtle-graphics examples')
        root.wm_protocol("WM_DELETE_WINDOW", self._destroy)

        root.grid_rowconfigure(1, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.grid_columnconfigure(1, minsize=90, weight=1)
        root.grid_columnconfigure(2, minsize=90, weight=1)
        root.grid_columnconfigure(3, minsize=90, weight=1)

        self.mBar = Frame(root, relief=RAISED, borderwidth=2)
        self.ExamplesBtn = self.makeLoadDemoMenu()
        self.OptionsBtn = self.makeHelpMenu()
        self.mBar.grid(row=0, columnspan=4, sticky='news')

        pane = PanedWindow(orient=HORIZONTAL,
                           sashwidth=5,
                           sashrelief=SOLID,
                           bg='#ddd')
        pane.add(self.makeTextFrame(pane))
        pane.add(self.makeGraphFrame(pane))
        pane.grid(row=1, columnspan=4, sticky='news')

        self.output_lbl = Label(root,
                                height=1,
                                text=" --- ",
                                bg="#ddf",
                                font=("Arial", 16, 'normal'),
                                borderwidth=2,
                                relief=RIDGE)
        self.start_btn = Button(root,
                                text=" START ",
                                font=btnfont,
                                fg="white",
                                disabledforeground="#fed",
                                command=self.startDemo)
        self.stop_btn = Button(root,
                               text=" STOP ",
                               font=btnfont,
                               fg="white",
                               disabledforeground="#fed",
                               command=self.stopIt)
        self.clear_btn = Button(root,
                                text=" CLEAR ",
                                font=btnfont,
                                fg="white",
                                disabledforeground="#fed",
                                command=self.clearCanvas)
        self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0, 5))
        self.start_btn.grid(row=2, column=1, sticky='ew')
        self.stop_btn.grid(row=2, column=2, sticky='ew')
        self.clear_btn.grid(row=2, column=3, sticky='ew')

        Percolator(self.text).insertfilter(ColorDelegator())
        self.dirty = False
        self.exitflag = False
        if filename:
            self.loadfile(filename)
        self.configGUI(NORMAL, DISABLED, DISABLED, DISABLED,
                       "Choose example from menu", "black")
        self.state = STARTUP
Beispiel #26
0
    def 建立文字區(self):
        """
        建立兩個Text區跟龜模組畫圖區並建立快捷鍵        
        """
        setup={}
        pane= PanedWindow(orient=HORIZONTAL, bg='black')
        text_frame= Frame(pane)
        self.text=text= Text(text_frame, name='text', padx=5,wrap='none', width=45,  bg='white', font= tuple(txtfont),tabs=('4c'),undo=True)
        text.name="text"
        vbar= Scrollbar(text_frame, name='vbar')
        
        vbar['command'] = text.yview
        vbar.pack(side=RIGHT, fill=Y)
        hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL)
        hbar['command'] = text.xview
        hbar.pack(side=BOTTOM, fill=X)
        
        text.pack(side=LEFT, fill=BOTH, expand=1)
 
        pane.add(text_frame)  
        
        
        text_frame2= Frame(pane)
        self.text2=text2= Text(text_frame2, name='text', padx=5,wrap='none', width=45, bg='white',font= tuple(txtfont),undo=True)
        text.name="text2"
        vbar= Scrollbar(text_frame2, name='vbar')
        vbar['command'] = text2.yview
        vbar.pack(side=RIGHT, fill=Y)
        hbar = Scrollbar(text_frame2, name='hbar', orient=HORIZONTAL)
        hbar['command'] = text2.xview
        hbar.pack(side=BOTTOM, fill=X)
        text2.pack(side=LEFT, fill=BOTH, expand=1)
        pane.add(text_frame2) 
        
        self.canvwidth= 800 
        self.canvheight= 600 
        turtle._Screen._root= self.root
        turtle._Screen._canvas= canvas= self._canvas= turtle.ScrolledCanvas(self.root, 800, 600, 1000, 800)
        canvas.adjustScrolls()
        canvas._rootwindow.bind('<Configure>', self.onResize)
        canvas._canvas['borderwidth'] = 0
        self.screen =screen = turtle.Screen()
        turtle.TurtleScreen.__init__(screen, screen._canvas)
        self.scanvas=scanvas= screen._canvas
        turtle.RawTurtle.screens = [screen]
        canvas.pack(side=LEFT, fill=BOTH, expand=1)
        pane.add(canvas) # for 畫圖
        # self.scanvas.bind('<Button-1>',self.焦點轉移)
        
        pane.pack(side=TOP, expand=1, fill=BOTH)
        
        Percolator(text).insertfilter(ColorDelegator())
        Percolator(text2).insertfilter(ColorDelegator())
        
        text.bind('<Control-MouseWheel>', self.滑鼠滾輪)
        text.bind('<Control-Button-4>', self.字體放大)
        text.bind('<Control-Button-5>', self.字體縮小)
        text2.bind('<Control-MouseWheel>', self.滑鼠滾輪)
        text2.bind('<Control-Button-4>', self.字體放大)
        text2.bind('<Control-Button-5>', self.字體縮小)
        text.bind('<Button-3>',self.選取標記)
        text2.bind('<Button-3>',self.選取標記)
        text.bind("<KeyRelease>", self.行號更新)
        text.bind("<ButtonRelease>", self.行號更新)
        text2.bind("<KeyRelease>", self.行號更新)
        text2.bind("<ButtonRelease>", self.行號更新)
Beispiel #27
0
def main00():

    Z=[] 
    # 這個 Z 存放音文同步資訊(進一步處理),
    # 將在 ryShowText 中設定,rySync01 中使用。
    
    file_mp3= '_gtts_tc_yinyang.mp3'
    L= 55560 # time length of mp3, in ms
    #
    # 這個 L 是 file_mp3 的 時間長度,還不知道如何自動找出來,
    # 目前是用 ryPlay() 先 播放一次,找到 lastPos 記錄下來得知。
    # 可能有點不準,自動方法要再研究。
    #
    
    sumT= sum([x[2] for x in timeText])
    #
    # 這個 timeText 來自 ryGoogleTTS.py,
    # 從那邊跑出結果,再貼進來這裡,
    # 半手動半自動做些字串處理
    #
    # sumT=  221472
    # print('sumT= ', sumT)
    #
    # 這個 sumT 是 從ryGoogleTTS.py 弄回來的 mp3 之檔案長度 (in bytes)
    #
    # 我覺得 L 與 sumT 應該有正比關係,經過1天的實驗,果然如此。
    #

    #
    # 學會 tkinter.Text 的 高亮 (highlight) 技巧,
    # 再配合 pygame.mixer.music 的播放聲音(mp3)
    # 於是音文同步就做出來了。
    #
    tx= Text()
    tx.pack()
    tx.tag_configure('highlight', background='yellow')#, relief='raised')
    #
    # 把 文字的第5列,從頭(0)到尾(end)加標籤,此處標籤意指高亮(底色變黃)
    # 方法如下2行
    #
    # tx.tag_add('highlight','5.0','5.end')
    # tx.tag_remove('highlight','5.0','5.end')
    #
    # 上述方法 參考這裡很多,http://www.tkdocs.com/tutorial/text.html
    #
    
    # 讓 程式內文 有 語法 顏色,超酷的!
    Percolator(tx).insertfilter(ColorDelegator())

    def ryMain():
    
        ryShowText()
        ryInit()
        #rySync01()
        #rySync02()
        rySync03()
        
        setButtons()
        
    def ryShowText():
        nonlocal Z

        tx.delete('1.0','end')
        
        accT= 0
        Z=[]
        for x in timeText:
            z= [x[0], x[2], accT, accT+x[2], '1.0', '1.0'] 
            # 最後2個: z[4], z[5] , 預留給文字在螢幕上的位置 idx1, idx2
            accT += x[2]
            Z += [z]
        
        ''' Z=[
            ('from', 3312, 0, 3312),
            ('turtle_tc', 8640, 3312, 11952),
            ('import', 3168, 11952, 15120),
            ('def', 3024, 15120, 18144),
            ('陰', 2880, 18144, 21024),
            ('半徑', 3456, 21024, 24480),
            ('顏色1', 5040, 24480, 29520),
            ('顏色2', 3888, 29520, 33408),
            ...
            ]
        '''
        
        '''
        for n,z in enumerate(Z):
        
            #text= '%s:%04d:%s:%d\n'%(idx,n,z[0],len(z[0]))#'%s'%(z[0])
            text= '%s\n'%(str(z))
            tx.insert('end','%s'%(text))
        '''
        
        text= tc_yinyang_py
        tx.insert('end',text)
            
    def ryHighLight():
        nonlocal Z
        tx.delete('1.0','end')
        
        Y= []

        for n,z in enumerate(Z):
        
            #text= '%s:%04d:%s:%d\n'%(idx,n,z[0],len(z[0]))#'%s'%(z[0])
            xxxx= '\n' if n%4==0 else '\t'
            text= '%s%s'%(z[0],xxxx)
            
            idx1= tx.index('insert')
            tx.insert('insert',text)            
            idx2= tx.index('insert')
            
            y= (text, idx1, idx2)
            
            Y += [y]
        
        #print(Y)
            
        for i,y in enumerate(Y):

            idx1= y[1]
            idx2= y[2]
            
            tx.tag_add('highlight',idx1,idx2)
            tx.see(idx1)
            tx.update()
            
            time.sleep(0.5)
            
            tx.tag_remove('highlight',idx1,idx2)
            tx.update()
            
    def ryInit():
        nonlocal file_mp3
        
        pygame.mixer.pre_init(frequency= 16000, channels=1, size=-16)
        pygame.mixer.init()
        pygame.mixer.music.load(file_mp3) #'_gtts_tc_yinyang.mp3')
    
    def ryPlay():
        pygame.mixer.music.play()
        pos=  pygame.mixer.music.get_pos()
        lastPos= pos
        while pos != -1:
            pos=  pygame.mixer.music.get_pos()
            if pos != -1: lastPos= pos
            if pos%1000==0:
                ryPos(pos)

        tx.delete('1.0','1.end')
        tx.insert('1.0','lastPos= %d'%int(lastPos))
        tx.update()

    def ryPos(pos=0):
        if pos!=0: pos=  pygame.mixer.music.get_pos()
        tx.delete('1.0','1.end')
        tx.insert('1.0','%d'%int(pos))
        tx.update()

    def rySync01(): # 這裡還有很多其他改的空間,故名稱加上 01
        nonlocal Z

        for n,z in enumerate(Z):
            idx='%d.0'%(n+1)
            
            #text= '%s:%04d:%s:%d\n'%(idx,n,z[0],len(z[0]))#'%s'%(z[0])
            text= '%s\n'%(z[0])
            
            tx.insert(idx,'%s'%(text))
            
        pygame.mixer.music.play()
        
        n=0
        tmpBool= True
        #busy= pygame.mixer.music.get_busy()
        pos=  pygame.mixer.music.get_pos()
        while pos!=-1:#busy: # pos 正常情形會傳回聲音的時間位置(ms),聲音結束時,pos==-1
            #busy= pygame.mixer.music.get_busy()
            pos=  pygame.mixer.music.get_pos() # in msec
            
            #print('pos= ',pos/L*sumT)

            iPos= int(pos/L*sumT) # 這就是我說的「正比關係」!!
            
            if n<len(Z):
                if iPos>=Z[n][2] and iPos<=Z[n][3] and tmpBool==True:

                    #print(Z[n][0], iPos)
                    
                    #tx.delete('1.0','1.end')
                    #tx.insert('1.0','%s'%(Z[n][0]))
                    
                    #
                    # 目前先採用「整行高亮」的方式,
                    # 隨後再改成依照文字排版的方式來高亮
                    #

                    if n>=1:
                        tx.tag_remove('highlight','%d.0'%(n),'%d.end'%(n))
                    tx.tag_add('highlight','%d.0'%(n+1),'%d.end'%(n+1))
                    tx.see('%d.0'%(n+1)) # 加這行,才能自動捲軸。
                    tx.update()
                    
                    tmpBool= False
                    
                elif iPos >= Z[n][3]:
                    n+=1
                    tmpBool= True

    def rySync02(): # 這裡還有很多其他改的空間,故名稱加上 02
        nonlocal Z

        tx.delete('1.0','end')
        
        #
        # 把文字依 「某種格式」 擺在 螢幕上,其位置存入 Z[4], Z[5]
        #
        # 參考:  Text widget indices
        # http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/text-index.html
        #
        # idx= 'line.column'
        #
        # tk.INSERT
        #   The position of the insertion cursor in the text widget. 
        #   This constant is equal to the string 'insert'.
        #
        
        #Y= []
        for n,z in enumerate(Z):
        
            #
            # 暫時假設文字格式為 每列 (line) 4 個 text
            #
            xxxx= '\n' if (n+1)%4==0 else '\t'
            text= '%s%s'%(z[0],xxxx)
            
            #
            # 一邊把文字插入 tx, 一邊記錄其在螢幕上的位置 idx1, idx2
            #
            idx1= tx.index('insert')
            tx.insert('insert',text)            
            idx2= tx.index('insert')
            
            #y= (idx1, idx2)
            #Z[n] += (idx1, idx2) # 這組 index 資訊就存入 Z[n][4], Z[n][5]
            Z[n][4], Z[n][5]= idx1, idx2
            
            #Y += [y]
        
        #print(Z)
        '''
        Z= [
            ('from', 3312, 0, 3312, '1.0', '1.5'), 
            ('turtle_tc', 8640, 3312, 11952, '1.5', '1.15'), 
            ('import', 3168, 11952, 15120, '1.15', '1.22'), 
            ('def', 3024, 15120, 18144, '1.22', '2.0'), 
            ('陰', 2880, 18144, 21024, '2.0', '2.2'), 
            ('半徑', 3456, 21024, 24480, '2.2', '2.5'), 
            ('顏色1', 5040, 24480, 29520, '2.5', '2.9'), 
            ('顏色2', 3888, 29520, 33408, '2.9', '3.0'),
            ...
            ]
        '''
        
        pygame.mixer.music.play()
        
        n=0
        tmpBool= True

        pos=  pygame.mixer.music.get_pos()
        while pos!=-1:

            pos=  pygame.mixer.music.get_pos() # in msec
            
            #print('pos= ',pos/L*sumT)

            # 重要音文同步計算公式
            iPos= int(pos/L*sumT) # 這就是我說的「正比關係」!!
            
            if n<len(Z):
                if iPos>=Z[n][2] and iPos<=Z[n][3] and tmpBool==True:

                    if n>=1:
                        tx.tag_remove('highlight',Z[n-1][4],Z[n-1][5])
                    tx.tag_add('highlight',Z[n][4],Z[n][5])
                    
                    tx.see(Z[n][5]) # 加這行,才能自動捲軸。
                    tx.update()     # 加這行,才能即時顯示效果。
                    
                    tmpBool= False
                    
                elif iPos >= Z[n][3]:
                    n+=1
                    tmpBool= True
 

    def rySync03(): # 這裡還有很多其他改的空間,故名稱加上 03
        nonlocal Z

        tx.delete('1.0','end')
        
        #
        # 把文字依 「某種格式」 擺在 螢幕上,其位置存入 Z[4], Z[5]
        #
        # 參考:  Text widget indices
        # http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/text-index.html
        #
        # idx= 'line.column'
        #
        # tk.INSERT
        #   The position of the insertion cursor in the text widget. 
        #   This constant is equal to the string 'insert'.
        #
        
        tcPy= tc_yinyang_py
        tx.insert('insert',tcPy)
        
        #Y= []
        idx2= '1.0'
        for n,z in enumerate(Z):
            '''
            #
            # 暫時假設文字格式為 每列 (line) 4 個 text
            #
            xxxx= '\n' if (n+1)%10==0 else '\t'
            text= '%s%s'%(z[0],xxxx)
            
            #
            # 一邊把文字插入 tx, 一邊記錄其在螢幕上的位置 idx1, idx2
            #
            idx1= tx.index('insert')
            tx.insert('insert',text)            
            idx2= tx.index('insert')
            '''
            
            #
            # 如何 根據 text= z[0] 在 tcPy 中 「循序」找到 idx1, idx2 
            #
            text= z[0]
            idx1= tx.search(text, idx2) # idx2= '1.0' for init
            idx2= idx1 + ' + %d chars'%len(text)
            idx2= tx.index(idx2)
            
            
            #y= (idx1, idx2)

            #Z[n] += (idx1, idx2) # 這組 index 資訊就存入 Z[n][4], Z[n][5]
            Z[n][4], Z[n][5]= idx1, idx2
            
            #Y += [y]
        
        #print(Z)
        '''
        Z= [
            ('from', 3312, 0, 3312, '1.0', '1.5'), 
            ('turtle_tc', 8640, 3312, 11952, '1.5', '1.15'), 
            ('import', 3168, 11952, 15120, '1.15', '1.22'), 
            ('def', 3024, 15120, 18144, '1.22', '2.0'), 
            ('陰', 2880, 18144, 21024, '2.0', '2.2'), 
            ('半徑', 3456, 21024, 24480, '2.2', '2.5'), 
            ('顏色1', 5040, 24480, 29520, '2.5', '2.9'), 
            ('顏色2', 3888, 29520, 33408, '2.9', '3.0'),
            ...
            ]
        '''
        
        pygame.mixer.music.play()
        
        n=0
        tmpBool= True

        pos=  pygame.mixer.music.get_pos()
        while pos!=-1:

            pos=  pygame.mixer.music.get_pos() # in msec
            
            #print('pos= ',pos/L*sumT)

            # 重要音文同步計算公式
            iPos= int(pos/L*sumT) # 這就是我說的「正比關係」!!
            
            if n<len(Z):
                if iPos>=Z[n][2] and iPos<=Z[n][3] and tmpBool==True:

                    if n>=1:
                        tx.tag_remove('highlight',Z[n-1][4],Z[n-1][5])
                    tx.tag_add('highlight',Z[n][4],Z[n][5])
                    
                    tx.see(Z[n][5]) # 加這行,才能自動捲軸。
                    tx.update()     # 加這行,才能即時顯示效果。
                    
                    tmpBool= False
                    
                elif iPos >= Z[n][3]:
                    n+=1
                    tmpBool= True
  
    def ryQuit():
        pygame.mixer.music.stop()
        pygame.mixer.quit()

    def setButtons():
        
        bnShowText=  Button(text= 'ryShowText',  command= ryShowText)
        bnHighLight= Button(text= 'ryHighLight', command= ryHighLight)
        bnInit=      Button(text= 'ryInit',      command= ryInit)
        bnQuit=      Button(text= 'ryQuit',      command= ryQuit)
        bnPlay=      Button(text= 'ryPlay',      command= ryPlay)
        bnSync01=    Button(text= 'rySync01',    command= rySync01)
        bnSync02=    Button(text= 'rySync02',    command= rySync02)
        bnSync03=    Button(text= 'rySync03',    command= rySync03)


        bnShowText.pack( side='left')
        bnHighLight.pack(side='left')
        bnInit.pack(     side='left')
        bnQuit.pack(     side='left')
        bnPlay.pack(     side='left')
        bnSync01.pack(   side='left')
        bnSync02.pack(   side='left')
        bnSync03.pack(   side='left')


    #########################
    ryMain() # 真正執行在此。
Beispiel #28
0
 def __init__(self, master, rpcclt=None):
     self.text = master
     self.color_delegator = ColorDelegator()
     self.auto_complete = SimpleAutoComplete(master=master, rpcclt=rpcclt)
 def recolorize_main(self):
     if not self.subcode_enable:
         return ColorDelegator.recolorize_main(self)
     else:
         return self.subcode_recolorize_main()
 def recolorize_main(self):
     self.tag_remove("TODO", "1.0", "iomark")
     self.tag_add("SYNC", "1.0", "iomark")
     ColorDelegator.recolorize_main(self)
 def __init__(self):
     ColorDelegator.__init__(self)
     self.LoadTagDefs()
Beispiel #32
0
    def show(self, tag_filter=None):

        if self.hidden == False:
            self.hide()
            return

        self.hidden = False

        # add a text widget, left of code text widget
        self.text_frame = text_frame = Frame(self.editwin.text_frame)
        self.vbar = vbar = Scrollbar(text_frame, name='vbar')
        vbar.pack(side=RIGHT, fill=Y)

        theme = idleConf.GetOption('main','Theme','name')
        normal_colors = idleConf.GetHighlight(theme, 'normal')
        text_options = {
                'padx': 5,
                'wrap': 'none',
                'cursor': 'arrow',
                'wrap': 'none',
                'foreground':normal_colors['foreground'],
                'background':normal_colors['background'],
                }

        self.textln = textln = Text(text_frame, **text_options)
        textln.pack(side='left',fill=BOTH, expand=YES)
        vbar['command'] = textln.yview
        textln['yscrollcommand'] = vbar.set

        # adjust font

        textln.config(font=(idleConf.GetOption('main', 'EditorWindow', 'font'),
                          idleConf.GetOption('main', 'EditorWindow', 'font-size')))



        textln.bind("<ButtonRelease>", self.focus_in_event)
        textln.bind("<Return>", self.enter_callback)
        textln.bind("<Escape>", self.escape_callback)
        textln.bind('<FocusOut>', self.focus_out, '+')

        # pass through keybindings for classdefbrowser
        keydefs = idleConf.GetExtensionBindings('CodeBrowser')
        for event, keylist in list(keydefs.items()):
            for k in keylist:
                def passthru(event, evName=event, text=self.text):
                    text.event_generate(evName)
                try:
                    textln.bind(k, passthru)
                except TclError as err:
                    print(err)
                    pass



        # start the line numbers
        self.per = per = Percolator(textln)
        self.color = ColorDelegator()

        self.per.insertfilter(self.color)

        self.line_delegator = LineDelegator()
        per.insertfilter(self.line_delegator)
        textln._insert = self.line_delegator.delegate.insert
        textln._delete = self.line_delegator.delegate.delete

        self.update_display(tag_filter)
        self.textfont = ""
        self.font_timer_event()

        self.nearest()


        text_frame.place(x=0, rely=1, relheight=1, relwidth=1, anchor=SW)
        text_frame.lift()
 def recolorize_main(self):
     self.tag_remove("TODO", "1.0", "iomark")
     self.tag_add("SYNC", "1.0", "iomark")
     ColorDelegator.recolorize_main(self)
Beispiel #34
0
    def __init__(self, filename=None):  #, root=None):
        self.root = root = turtle._root = Tk()
        root.wm_protocol("WM_DELETE_WINDOW", self._destroy)

        #################
        self.mBar = Frame(root, relief=RAISED, borderwidth=2)
        self.mBar.pack(fill=X)

        self.ExamplesBtn = self.makeLoadDemoMenu()
        self.OptionsBtn = self.makeHelpMenu()
        self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn)  #, QuitBtn)

        root.title('Python turtle-graphics examples')
        #################
        self.left_frame = left_frame = Frame(root)
        self.text_frame = text_frame = Frame(left_frame)
        self.vbar = vbar = Scrollbar(text_frame, name='vbar')
        self.text = text = Text(text_frame,
                                name='text',
                                padx=5,
                                wrap='none',
                                width=45)
        vbar['command'] = text.yview
        vbar.pack(side=LEFT, fill=Y)
        #####################
        self.hbar = hbar = Scrollbar(text_frame,
                                     name='hbar',
                                     orient=HORIZONTAL)
        hbar['command'] = text.xview
        hbar.pack(side=BOTTOM, fill=X)
        #####################
        text['yscrollcommand'] = vbar.set
        text.config(font=txtfont)
        text.config(xscrollcommand=hbar.set)
        text.pack(side=LEFT, fill=Y, expand=1)
        #####################
        self.output_lbl = Label(left_frame,
                                height=1,
                                text=" --- ",
                                bg="#ddf",
                                font=("Arial", 16, 'normal'))
        self.output_lbl.pack(side=BOTTOM, expand=0, fill=X)
        #####################
        text_frame.pack(side=LEFT, fill=BOTH, expand=0)
        left_frame.pack(side=LEFT, fill=BOTH, expand=0)
        self.graph_frame = g_frame = Frame(root)

        turtle._Screen._root = g_frame
        turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000,
                                                       800)
        #xturtle.Screen._canvas.pack(expand=1, fill="both")
        self.screen = _s_ = turtle.Screen()
        #####
        turtle.TurtleScreen.__init__(_s_, _s_._canvas)
        #####
        self.scanvas = _s_._canvas
        #xturtle.RawTurtle.canvases = [self.scanvas]
        turtle.RawTurtle.screens = [_s_]

        self.scanvas.pack(side=TOP, fill=BOTH, expand=1)

        self.btn_frame = btn_frame = Frame(g_frame, height=100)
        self.start_btn = Button(btn_frame,
                                text=" START ",
                                font=btnfont,
                                fg="white",
                                disabledforeground="#fed",
                                command=self.startDemo)
        self.start_btn.pack(side=LEFT, fill=X, expand=1)
        self.stop_btn = Button(btn_frame,
                               text=" STOP ",
                               font=btnfont,
                               fg="white",
                               disabledforeground="#fed",
                               command=self.stopIt)
        self.stop_btn.pack(side=LEFT, fill=X, expand=1)
        self.clear_btn = Button(btn_frame,
                                text=" CLEAR ",
                                font=btnfont,
                                fg="white",
                                disabledforeground="#fed",
                                command=self.clearCanvas)
        self.clear_btn.pack(side=LEFT, fill=X, expand=1)

        self.btn_frame.pack(side=TOP, fill=BOTH, expand=0)
        self.graph_frame.pack(side=TOP, fill=BOTH, expand=1)

        Percolator(text).insertfilter(ColorDelegator())
        self.dirty = False
        self.exitflag = False
        if filename:
            self.loadfile(filename)
        self.configGUI(NORMAL, DISABLED, DISABLED, DISABLED,
                       "Choose example from menu", "black")
        self.state = STARTUP
    def __init__(self, filename=None):  #, root=None):
        self.root = root = turtle._root = Tk()
        root.wm_protocol("WM_DELETE_WINDOW", self._destroy)
        root.resizable(width=FALSE, height=FALSE)

        #################
        self.mBar = Frame(root, relief=RAISED, borderwidth=2)
        self.mBar.pack(fill=X)

        root.title('PonyGE GUI')
        #################
        self.left_frame = left_frame = Frame(root)
        self.text_frame = text_frame = Frame(left_frame)
        self.vbar = vbar = Scrollbar(text_frame, name='vbar')
        self.text = text = Text(text_frame,
                                name='text',
                                padx=5,
                                wrap='none',
                                width=45)
        vbar['command'] = text.yview
        vbar.pack(side=LEFT, fill=Y)
        #####################
        self.hbar = hbar = Scrollbar(text_frame,
                                     name='hbar',
                                     orient=HORIZONTAL)
        hbar['command'] = text.xview
        hbar.pack(side=BOTTOM, fill=X)
        #####################
        text['yscrollcommand'] = vbar.set
        text.config(font=txtfont)
        text.config(xscrollcommand=hbar.set)
        text.pack(side=LEFT, fill=Y, expand=1)
        #####################
        self.output_lbl = Label(left_frame,
                                height=1,
                                text=" --- ",
                                bg="#ddf",
                                font=("Arial", 16, 'normal'))
        self.output_lbl.pack(side=BOTTOM, expand=0, fill=X)
        #####################
        text_frame.pack(side=LEFT, fill=BOTH, expand=0)
        left_frame.pack(side=LEFT, fill=BOTH, expand=0)
        self.graph_frame = g_frame = Frame(root)

        turtle._Screen._root = g_frame
        turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 700, 700, 700,
                                                       700)
        #xturtle.Screen._canvas.pack(expand=1, fill="both")
        self.screen = _s_ = turtle.Screen()
        #####
        turtle.TurtleScreen.__init__(_s_, _s_._canvas)
        #####
        self.scanvas = _s_._canvas
        #xturtle.RawTurtle.canvases = [self.scanvas]
        turtle.RawTurtle.screens = [_s_]

        turtle.ht()

        self.scanvas.pack(side=TOP, fill=BOTH, expand=1)

        self.btn_frame = btn_frame = Frame(g_frame, height=100)
        self.next_btn = Button(btn_frame,
                               text=" NEXT ",
                               font=btnfont,
                               fg="white",
                               disabledforeground="#fed",
                               command=self.nextGeneration)
        self.next_btn.pack(side=LEFT, fill=X, expand=1)
        self.save_btn = Button(btn_frame,
                               text=" SAVE ",
                               font=btnfont,
                               fg="white",
                               disabledforeground="#fed",
                               command=self.savecb)
        self.save_btn.pack(side=LEFT, fill=X, expand=1)
        self.redisplay_btn = Button(btn_frame,
                                    text=" REDISPLAY ",
                                    font=btnfont,
                                    fg="white",
                                    disabledforeground="#fed",
                                    command=self.redisplaycb)
        self.redisplay_btn.pack(side=LEFT, fill=X, expand=1)
        self.stop_btn = Button(btn_frame,
                               text=" STOP ",
                               font=btnfont,
                               fg="white",
                               disabledforeground="#fed",
                               command=self.stopIt)
        self.stop_btn.pack(side=LEFT, fill=X, expand=1)

        self.btn_frame.pack(side=TOP, fill=BOTH, expand=0)
        self.graph_frame.pack(side=TOP, fill=BOTH, expand=1)

        # Grid size, giving population
        self.n = 3
        self.m = 3
        # Set up PonyGE
        self.ge = GE(GRAMMAR_FILE)
        self.fitness = [0.0 for i in range(self.n) for j in range(self.m)]

        Percolator(text).insertfilter(ColorDelegator())
        self.dirty = False
        self.exitflag = False
        self.configGUI(NORMAL, DISABLED, DISABLED, DISABLED, DISABLED,
                       DISABLED, INSTRUCTIONS)

        # bring the window to front
        root.attributes('-topmost', 1)
        root.attributes('-topmost', 0)
        # none of these succeeds in bringing to front
        # root.lift()
        # root.tkraise()
        # none of these succeeds in focussing
        # root.focus()
        # root.focus_force()
        # self.next_btn.focus_force()

        self.state = STARTUP
        self.nextGeneration()