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
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
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
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()
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
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"), })
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
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
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()
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
def recolorize_main(self): self.tag_remove('TODO', '1.0', 'iomark') self.tag_add('SYNC', '1.0', 'iomark') ColorDelegator.recolorize_main(self)
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)
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()
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()
def recolorize_main(self): if not self.subcode_enable: return ColorDelegator.recolorize_main(self) else: return self.subcode_recolorize_main()
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
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
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.行號更新)
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() # 真正執行在此。
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): self.tag_remove("TODO", "1.0", "iomark") self.tag_add("SYNC", "1.0", "iomark") ColorDelegator.recolorize_main(self)
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 __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()