def __init__(self, frame, fig, width=16): # Base class initialization Frame.__init__(self, frame) self.frame = frame self.fig = fig # Instance variable for tkinter canvas self.tk_cnv = Canvas(self.frame, highlightthickness=0) self.tk_cnv.pack(side="left", anchor="nw", fill="both", expand=True) # Instance variable for the scroll-bar v_scroll = Scrollbar(self.frame) v_scroll.pack(side="right", anchor="ne", fill="y", expand=False) v_scroll.config(command=self.tk_cnv.yview, width=width) v_scroll.activate("slider") # Instance variable for the matplotlib canvas self.mpl_cnv = FigCanvas(fig, self.frame) self.mpl_cnv_widget = self.mpl_cnv.get_tk_widget() self.tk_cnv.config(yscrollcommand=v_scroll.set) self.tk_cnv.bind("<Configure>", self.__fill_canvas) # self.bind("<Enter>", self._bound_to_mousewheel) # self.bind("<Leave>", self._unbound_to_mousewheel) # Assign frame generated by the class to the canvas # and create a scrollable window for it. self.windows_item = \ self.tk_cnv.create_window(-80, 900, window=self.mpl_cnv_widget, anchor="nw", tag="self.mpl_widget") self.tk_cnv.config(scrollregion=self.tk_cnv.bbox("all"))
def create_text_area(self): self.textbox = Text(self.master, height=10, width=79, wrap='word') vertscroll = Scrollbar(self.master) vertscroll.config(command=self.textbox.yview) self.textbox.config(yscrollcommand=vertscroll.set) self.textbox.grid(column=0, row=1, padx=(30, 0)) vertscroll.grid(column=2, row=1, sticky='NSE')
class TextViewer(Toplevel): "A simple text viewer dialog for IDLE." def __init__(self, parent, title, text, modal=True, _htest=False, _utest=False): """Show the given text in a scrollable window with a 'close' button. If modal is left True, users cannot interact with other windows until the textview window is closed. _htest - bool; change box location when running htest. _utest - bool; don't wait_window when running unittest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) # Place dialog below parent if running htest. self.geometry("=%dx%d+%d+%d" % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) # TODO: get fg/bg from theme. self.bg = '#ffffff' self.fg = '#000000' self.CreateWidgets() self.title(title) self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() # Bind keys for closing this dialog. self.bind('<Return>',self.Ok) self.bind('<Escape>',self.Ok) self.textView.insert(0.0, text) self.textView.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() if not _utest: self.wait_window() def CreateWidgets(self): "Create Frame with Text (with vertical Scrollbar) and Button." frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', command=self.Ok, takefocus=FALSE) self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, takefocus=FALSE) self.textView = Text(frameText, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbarView.config(command=self.textView.yview) self.textView.config(yscrollcommand=self.scrollbarView.set) self.buttonOk.pack() self.scrollbarView.pack(side=RIGHT,fill=Y) self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) frameButtons.pack(side=BOTTOM,fill=X) frameText.pack(side=TOP,expand=TRUE,fill=BOTH) def Ok(self, event=None): self.destroy()
def manage_command_output(cli, stdout, stderr): """Display stdin or stderr and close the connection""" stdout.channel.recv_exit_status() if stderr is not None: errs = stderr.readlines() for err in errs: print(err) cli.close() lines = stdout.readlines() loading = True while loading is True: progress.pack(anchor='center') bar() response = "" for line in lines: response = response + line cli.close() loading = False progress.pack_forget() root = Tk() root.title('Response') scroll = Scrollbar(root) scroll.pack(side=tk.RIGHT, fill=tk.Y) text = Text(root) text.pack(side=tk.LEFT, fill=tk.Y) scroll.config(command=text.yview) text.config(yscrollcommand=scroll.set) text.insert(INSERT, response) root.mainloop()
def init_frame(self): self.title('Просмотр записей') self.geometry('440x392+%d+%d' % (self.x + 180, self.y + 65)) self.resizable(False, False) # НИЖНЯЯ ПАНЕЛЬ для КОЛИЧЕСТВА ЗАПИСЕЙ; TB_BOT = Frame(self, bg='#EDF0F5', bd=1) TB_BOT.pack(side=BOTTOM, fill=X) # ВЫВОД КОЛИЧЕСТВА ЗАПИСЕЙ на НИЖНЮЮ ПАНЕЛЬ; self.count = Label(TB_BOT, background='#EDF0F5', foreground='#425370') self.count.pack() _yscroll_ = Scrollbar(self) self.tree = Treeview(self, columns=('id', 'name'), height=18, show='headings', yscrollcommand=_yscroll_.set) _yscroll_.config(command=self.tree.yview) self.tree.column('id', width=50, anchor=CENTER) self.tree.column('name', width=370) self.tree.heading('id', text='№') self.tree.heading('name', text='Название') _yscroll_.pack(side=RIGHT, fill=Y) self.tree.pack() self.tree.bind('<Button-1>', lambda event: 'break' if self.tree.identify_region(event.x, event.y) == 'separator' else None) # УДЕРЖИВАЕМ НАШЕ ДИАЛОГОВОЕ ОКНО 'НА ВЕРХУ'; self.grab_set() self.focus_set()
def update_accidents_table(): for widget in accidents_tab.winfo_children(): widget.destroy() headers = ['Cars', 'Lap', 'Session', '', ''] scrollbar = Scrollbar(accidents_tab, orient='vertical') scrollbar.grid(row=0, column=1, sticky='ns') canvas = Canvas(accidents_tab, yscrollcommand=scrollbar.set) canvas.create_image(0, 0, anchor='ne') canvas['scrollregion'] = (0, 0, 0, (len(listed_accidents) + 1) * 30) canvas['width'] = 565 canvas['height'] = 370 canvas.grid(row=0, column=0) scrollbar.config(command=canvas.yview) canvas.config(scrollregion=canvas.bbox("all")) table = Frame(canvas) for j, column in enumerate(headers): label = Label(table, text=column, width=15, height=2, font='Helvetica 8 bold') label.grid(row=0, column=j, sticky="nsew", padx=1, pady=1) table.grid_columnconfigure(j, weight=1) for i, row in enumerate(listed_accidents): for j, column in enumerate(row): label = Label(table, text=column, bg='Light Gray', height=1) label.grid(row=i + 1, column=j, sticky="nsew", padx=1, pady=1) table.grid_columnconfigure(j, weight=1) if j == 2: dismiss_button = Button( table, text="Racing Incident", bg='medium sea green', width=5, command=lambda row=i: dismiss_accident(row)) penalty_button = Button(table, text="Penalty", bg='indian red', width=5, command=lambda row=i: add_penalty(row)) dismiss_button.grid(row=i + 1, column=j + 1, padx=1, pady=1, sticky="nsew") penalty_button.grid(row=i + 1, column=j + 2, padx=1, pady=1, sticky="nsew") table.grid_columnconfigure(j + 1, weight=1) canvas.create_window((0, 0), window=table, anchor='nw')
class TextViewer(Toplevel): """A simple text viewer dialog for IDLE """ def __init__(self, parent, title, text, modal=True, _htest=False): """Show the given text in a scrollable window with a 'close' button If modal option set to False, user can interact with other windows, otherwise they will be unable to interact with other windows until the textview window is closed. _htest - bool; change box location when running htest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) # place dialog below parent if running htest self.geometry("=%dx%d+%d+%d" % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) #elguavas - config placeholders til config stuff completed self.bg = '#ffffff' self.fg = '#000000' self.CreateWidgets() self.title(title) self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() #key bindings for this dialog self.bind('<Return>',self.Ok) #dismiss dialog self.bind('<Escape>',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', command=self.Ok, takefocus=FALSE) self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, takefocus=FALSE) self.textView = Text(frameText, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbarView.config(command=self.textView.yview) self.textView.config(yscrollcommand=self.scrollbarView.set) self.buttonOk.pack() self.scrollbarView.pack(side=RIGHT,fill=Y) self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) frameButtons.pack(side=BOTTOM,fill=X) frameText.pack(side=TOP,expand=TRUE,fill=BOTH) def Ok(self, event=None): self.destroy()
class TextViewer(Toplevel): """A simple text viewer dialog for IDLE """ def __init__(self, parent, title, text, modal=True, _htest=False): """Show the given text in a scrollable window with a 'close' button If modal option set to False, user can interact with other windows, otherwise they will be unable to interact with other windows until the textview window is closed. _htest - bool; change box location when running htest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) # place dialog below parent if running htest self.geometry("=%dx%d+%d+%d" % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) #elguavas - config placeholders til config stuff completed self.bg = '#ffffff' self.fg = '#000000' self.CreateWidgets() self.title(title) self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() #key bindings for this dialog self.bind('<Return>',self.Ok) #dismiss dialog self.bind('<Escape>',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) frameButtons = Frame(self) self.buttonOk = Button(frameButtons, text='Close', command=self.Ok, takefocus=FALSE) self.scrollbarView = Scrollbar(frameText, orient=VERTICAL, takefocus=FALSE) self.textView = Text(frameText, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbarView.config(command=self.textView.yview) self.textView.config(yscrollcommand=self.scrollbarView.set) self.buttonOk.pack() self.scrollbarView.pack(side=RIGHT,fill=Y) self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH) frameButtons.pack(side=BOTTOM,fill=X) frameText.pack(side=TOP,expand=TRUE,fill=BOTH) def Ok(self, event=None): self.destroy()
def progress( self ): o=os.popen("cd {0} && snakemake --dryrun --rerun-incomplete > {0}/Reports/checkpoint".format(self.workpath.get())) o.close() F=open("{0}/Reports/checkpoint".format(self.workpath.get()),"r").read() rules2={} rules=re.findall(r'rule .+:',F) for i in rules: i=re.sub("rule ","",i) i=re.sub(":","",i) rules2[i]=0 F=open("{0}/Reports/{1}.dot".format(self.workpath.get(), self.Pipeline.get() ),"r").read() for i in rules2.keys(): F=re.sub(r'('+i+')(\".+?)\".+?\"',r'\1_pending\2"0.0 0.0 0.0"',F) # F=re.sub(i,"",F) G=open("{0}/Reports/{1}-{2}.dot".format(self.workpath.get(),self.Pipeline.get(),"progress"),"w") G.write(F) G.close() o=os.popen("cd {0}/Reports && dot -Tpng -o {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.dot;convert {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.gif".format(self.workpath.get(),self.Pipeline.get())) # tkinter.messagebox.showerror("o",o) PL=self.Pipeline.get() #pipelineget() gf=Toplevel() gf.title("CCBR Pipeliner: {0} Progress Graph".format(PL)) cgf = Canvas(gf,bg="white") # gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,1000,5000)) try: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) except: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
def progress( self ): o=os.popen("cd {0} && snakemake --dryrun --rerun-incomplete > {0}/Reports/checkpoint".format(self.workpath.get())) o.close() F=open("{0}/Reports/checkpoint".format(self.workpath.get()),"r").read() rules2={} rules=re.findall(r'rule .+:',F) for i in rules: i=re.sub("rule ","",i) i=re.sub(":","",i) rules2[i]=0 F=open("{0}/Reports/{1}.dot".format(self.workpath.get(), self.Pipeline.get() ),"r").read() for i in rules2.keys(): F=re.sub(r'('+i+')(\".+?)\".+?\"',r'\1_pending\2"0.0 0.0 0.0"',F) # F=re.sub(i,"",F) G=open("{0}/Reports/{1}-{2}.dot".format(self.workpath.get(),self.Pipeline.get(),"progress"),"w") G.write(F) G.close() o=os.popen("cd {0}/Reports && dot -Tpng -o {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.dot;convert {0}/Reports/{1}-progress.png {0}/Reports/{1}-progress.gif".format(self.workpath.get(),self.Pipeline.get())) # tkinter.messagebox.showerror("o",o) PL=self.Pipeline.get() #pipelineget() gf=Toplevel() gf.title("CCBR Pipeliner: {0} Progress Graph".format(PL)) cgf = Canvas(gf,bg="white") # gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,1000,5000)) try: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) except: time.sleep(5) img = PhotoImage(file="{0}/Reports/{1}-progress.gif".format(self.workpath.get(),PL)) cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) sbar = Scrollbar(self) list = Listbox(self) sbar.config(command=list.yview) list.config(yscrollcommand=sbar.set) sbar.pack(side='right', fill='y') list.pack(side='left', expand='yes', fill='both') list.bind('<<ListboxSelect>>', self._on_listbox_click) self.__list_click_callback = None self.__list = list self.__sbar = sbar
def __init__(self, parent, manager): """ CsvFrame constructor """ top = self.top = tkinter.Toplevel(parent) self.__parent = parent self.__manager = manager top_frame = tkinter.Frame(top, borderwidth=2, relief=tkinter.GROOVE) top_frame.pack(side=tkinter.TOP, fill=tkinter.X, padx=5, pady=5) label_data = Label(top_frame, text="Data: ") label_data.grid(row=1, column=1, padx=5, pady=5) data_select_combo3 = tkinter.StringVar() self.combo_data = Combobox(top_frame, textvariable=data_select_combo3, values=manager.get_field_names(), state='readonly', postcommand=lambda: self.combo_data.configure(values=manager.get_field_names())) self.combo_data.grid(row=1, column=2, padx=5, pady=5) edit_button = Button(top_frame, text="Edit header", command=self.edit_header, width=20) edit_button.grid(row=1, column=3, columnspan=1, rowspan=1, padx=5, pady=5) # TODO change values for combobox transform_select_combo4 = tkinter.StringVar() self.combo_transform = Combobox(top_frame, textvariable=transform_select_combo4, values=["rad_to_deg", "deg_to_rad"], state='readonly') self.combo_transform.grid(row=1, column=4, padx=5, pady=5) transform_button = Button(top_frame, text="Transform data", command=self.transform_data, width=20) transform_button.grid(row=1, column=5, columnspan=1, rowspan=1, padx=5, pady=5) table_frame = Frame(top) table_frame.pack(side=tkinter.BOTTOM, expand=True, fill=tkinter.BOTH) scrollbar_x = Scrollbar(table_frame, orient=tkinter.HORIZONTAL) scrollbar_y = Scrollbar(table_frame, orient=tkinter.VERTICAL) self.tree = Treeview(table_frame, columns=manager.get_field_names(), show="headings", selectmode="extended", yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set) scrollbar_y.config(command=self.tree.yview) scrollbar_y.pack(side=tkinter.RIGHT, fill=tkinter.Y) scrollbar_x.config(command=self.tree.xview) scrollbar_x.pack(side=tkinter.BOTTOM, fill=tkinter.X) self.fill_data() self.tree.pack(expand=True, fill=tkinter.BOTH) self.top.protocol("WM_DELETE_WINDOW", self.quit)
def __init__(self): """Initialise manager.""" Tk.__init__(self) self.title("GUI Test Manager") self.geometry("400x300") ## Dictionary of Toplevel tests who are current active. self.active_tests = {} ## List of all available test classes. self.all_tests = [] # Create widgets to show list of available tests. Label(self, text="Available Tests", font=("Comic Sans MS", "24")).pack(padx=3, pady=3) Label(self, text="Click a test to open it, and again to close it.", font=["Comic Sans MS"]).pack() # Create container for listbox and scrollbar. list_frame = Frame(self) list_frame.pack(fill="both", expand=1, padx=3, pady=3) # Add scrollbar for Listbox. list_scrollbar = Scrollbar(list_frame, orient="vertical") list_scrollbar.pack(side="right", fill="y") # Create Listbox next to scrollbar. self.all_tests_list = Listbox(list_frame, selectmode="multiple", yscrollcommand=list_scrollbar.set, selectborderwidth=5, font=("Comic Sans MS", "16", "italic"), activestyle="none", takefocus=1, cursor="pirate") # Bind the event for 0ms after a click, so the listbox can process first. self.all_tests_list.bind( "<ButtonPress-1>", lambda e: self.after(0, lambda e=e: self.on_test_list_pressed(e))) self.all_tests_list.pack(side="left", fill="both", expand=1) # Link scrollbar and listbox scroll commands. list_scrollbar.config(command=self.all_tests_list.yview) # Perform initial refresh. self.refresh_available()
def make_widgets(self, horizontal_scroll=False): text = TextWinHotkey(self, relief='sunken') ybar = Scrollbar(self) ybar.config(command=text.yview) ybar.pack(side='right', fill='y') if horizontal_scroll: xbar = Scrollbar(self) xbar.config(command=text.xview, orient='horizontal') xbar.pack(side='bottom', fill='x') text.config(xscrollcommand=xbar.set) text.config(yscrollcommand=ybar.set) text.pack(side='left', expand='yes', fill='both') self.text = text # To Do: change the attribute name.
def show_list(elements, tk): # Scrollbar scrollbar = Scrollbar(tk) scrollbar.pack(side=RIGHT, fill=Y) # Listbox widget mylist = Listbox(tk, yscrollcommand=scrollbar.set) mylist.pack(fill=BOTH, expand=1) scrollbar.config(command=mylist.yview) # Add elements to listbox for item in elements: mylist.insert(END, "Título: " + item[0]) mylist.insert(END, "Link: " + item[1]) mylist.insert(END, "Autor: " + item[2]) mylist.insert(END, "Fecha de publicación: " + str(item[3])) if item[4] is not None: mylist.insert(END, "Contenido: " + item[4]) mylist.insert(END, "")
def __init__(self, *args, **kwargs): Frame.__init__(self, *args, **kwargs) canvas = Canvas(self) xbar = Scrollbar(self, orient='horizontal') xbar.config(command=canvas.xview) canvas.config(xscrollcommand=xbar.set) xbar.pack(side='bottom', fill='x') ybar = Scrollbar(self) ybar.config(command=canvas.yview) canvas.config(yscrollcommand=ybar.set) ybar.pack(side='right', fill='y') canvas.pack(expand='yes', fill='both') self.__canvas = canvas
def __init__(self, parent, *args, **kw): Frame.__init__(self, parent, *args, **kw) # create a canvas object and a vertical scrollbar for scrolling it vscrollbar = Scrollbar(self, orient=VERTICAL) vscrollbar.pack(fill=Y, side=RIGHT, expand=False) self.canvas = canvas = StyledCanvas(self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set) canvas.pack(side=LEFT, fill=BOTH, expand=True) vscrollbar.config(command=canvas.yview) # reset the view canvas.xview_moveto(0) canvas.yview_moveto(0) # create a frame inside the canvas which will be scrolled with it self.interior = interior = Frame(canvas) interior_id = canvas.create_window(0, 0, window=interior, anchor=N + W) # track changes to the canvas and frame width and sync them, # also updating the scrollbar def _configure_interior(event): # update the scrollbars to match the size of the inner frame size = (interior.winfo_reqwidth(), interior.winfo_reqheight()) canvas.config(scrollregion="0 0 %s %s" % size) if interior.winfo_reqwidth() != canvas.winfo_width(): # update the canvas's width to fit the inner frame canvas.config(width=interior.winfo_reqwidth()) interior.bind('<Configure>', _configure_interior) def _configure_canvas(event): if interior.winfo_reqwidth() != canvas.winfo_width(): # update the inner frame's width to fill the canvas canvas.itemconfigure(interior_id, width=canvas.winfo_width()) canvas.bind('<Configure>', _configure_canvas) MouseWheel(self).add_scrolling(canvas, yscrollbar=vscrollbar)
def __init__(self, parent, *args, **kw): Frame.__init__(self, parent, *args, **kw) # create a canvas object and a vertical scrollbar for scrolling it vscrollbar = Scrollbar(self, orient=VERTICAL) vscrollbar.pack(fill=Y, side=RIGHT, expand=False) self.canvas = canvas = StyledCanvas( self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set) canvas.pack(side=LEFT, fill=BOTH, expand=True) vscrollbar.config(command=canvas.yview) # reset the view canvas.xview_moveto(0) canvas.yview_moveto(0) # create a frame inside the canvas which will be scrolled with it self.interior = interior = Frame(canvas) interior_id = canvas.create_window(0, 0, window=interior, anchor=N+W) # track changes to the canvas and frame width and sync them, # also updating the scrollbar def _configure_interior(event): # update the scrollbars to match the size of the inner frame size = (interior.winfo_reqwidth(), interior.winfo_reqheight()) canvas.config(scrollregion="0 0 %s %s" % size) if interior.winfo_reqwidth() != canvas.winfo_width(): # update the canvas's width to fit the inner frame canvas.config(width=interior.winfo_reqwidth()) interior.bind('<Configure>', _configure_interior) def _configure_canvas(event): if interior.winfo_reqwidth() != canvas.winfo_width(): # update the inner frame's width to fill the canvas canvas.itemconfigure(interior_id, width=canvas.winfo_width()) canvas.bind('<Configure>', _configure_canvas) MouseWheel(self).add_scrolling(canvas, yscrollbar=vscrollbar)
def workflow(self): PL=self.Pipeline.get() #pipelineget() gf=Toplevel() #MkaS=os.popen("./makeasnake.py 2>&1 | tee -a "+workpath.get()+"/Reports/makeasnake.log").read() gf.title("CCBR Pipeliner: "+ PL + " Workflow Graph") cgf = Canvas(gf,bg="white") #gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,5000,20000)) img = PhotoImage(file=self.workpath.get()+"/Reports/"+PL+".gif") cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
def create_widgets(self): ''' Creates all widgets. ''' self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) xscrollbar = Scrollbar(self, orient=HORIZONTAL) xscrollbar.grid(row=1, column=0, sticky=E+W) yscrollbar = Scrollbar(self) yscrollbar.grid(row=0, column=1, sticky=N+S) self.text = Text(self, wrap=NONE, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) self.text.bind("<Control-Key-a>", self.select_all) self.text.bind("<Control-Key-A>", self.select_all) self.text.grid(row=0, column=0, sticky=N+S+E+W) xscrollbar.config(command=self.text.xview) yscrollbar.config(command=self.text.yview)
def workflow(self): PL=self.Pipeline.get() #pipelineget() gf=Toplevel() #MkaS=os.popen("./makeasnake.py 2>&1 | tee -a "+workpath.get()+"/Reports/makeasnake.log").read() gf.title("CCBR Pipeliner: "+ PL + " Workflow Graph") cgf = Canvas(gf,bg="white") #gff=Frame(cgf,width=300,height=300) xscrollbar = Scrollbar(gf, orient=HORIZONTAL) xscrollbar.pack(side = BOTTOM, fill=X ) xscrollbar.config(command=cgf.xview) yscrollbar = Scrollbar(gf,orient=VERTICAL) yscrollbar.pack(side = RIGHT, fill=Y ) yscrollbar.config(command=cgf.yview) cgf.config(xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) cgf.config(width=600,height=600) cgf.pack(expand=1,fill=BOTH,side=RIGHT) cgf.config(scrollregion=(0,0,5000,20000)) img = PhotoImage(file=self.workpath.get()+"/Reports/"+PL+".gif") cgf.create_image(0,0,image=img, anchor="nw") cgf.image=img
def _create_body_(self): scrollBar = Scrollbar(self) scrollBar.pack(side=RIGHT, fill=Y) self.tree = Treeview(self, show='headings', yscrollcommand=scrollBar.set) # 表格 index = tuple([str(i) for i in range(len(INFOS))]) self.tree["columns"] = index for i, info in zip(index, INFOS): self.tree.column(i, width=len(i) * 10, anchor='center') self.tree.heading(i, text=info) #显示表头 self.tree.pack(fill=BOTH, ipady=500) # 将滚动条绑定至Treeview scrollBar.config(command=self.tree.yview) # 快捷键相关设置 # 函数参数需要有event=None self.tree.bind('<Double-Button-1>', self.edit)
def create_widgets(self, weight_name): ''' Creates all widgets. ''' constraints_lbl = Label( self, text='Enter {0} weight restrictions:'.format(weight_name)) constraints_lbl.grid(padx=10, pady=2, sticky=N + W) examples_lbl = Label(self, text='e.g. {0}'.format(self.examples)) examples_lbl.grid(row=1, column=0, padx=10, pady=5, sticky=N + W) errors_lbl = Label(self, textvariable=self.errors_strvar, foreground='red', anchor=W, justify=LEFT, wraplength=80) errors_lbl.grid(row=2, column=2, sticky=N + W, padx=5, pady=5) self.grid_rowconfigure(2, weight=1) self.grid_columnconfigure(0, weight=1) xscrollbar = Scrollbar(self, orient=HORIZONTAL) xscrollbar.grid(row=3, column=0, sticky=E + W) yscrollbar = Scrollbar(self) yscrollbar.grid(row=2, column=1, sticky=N + S) self.text = Text(self, wrap=NONE, width=TEXT_WIDTH_VAL, height=TEXT_HEIGHT_VAL, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) self.text.grid(row=2, column=0, sticky=N + S + E + W) xscrollbar.config(command=self.text.xview) yscrollbar.config(command=self.text.yview)
def create_widgets(self): ''' Creates all widgets. ''' self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) xscrollbar = Scrollbar(self, orient=HORIZONTAL) xscrollbar.grid(row=1, column=0, sticky=E + W) yscrollbar = Scrollbar(self) yscrollbar.grid(row=0, column=1, sticky=N + S) self.text = Text(self, wrap=NONE, xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) self.text.bind("<Control-Key-a>", self.select_all) self.text.bind("<Control-Key-A>", self.select_all) self.text.grid(row=0, column=0, sticky=N + S + E + W) xscrollbar.config(command=self.text.xview) yscrollbar.config(command=self.text.yview)
class Movie_app: def __init__(self): self.win = Tk() self.win.geometry('600x420') self.win.title("爱奇艺-优酷-PPTV视频播放下载器V3.1") self.creat_res() self.creat_radiores() self.config() self.page = 1 self.p = Pro() self.win.mainloop() def creat_res(self): self.temp = StringVar() # url地址 self.temp2 = StringVar() self.t1 = StringVar() # 通道 self.t3 = StringVar() # 爱奇艺,优酷,PPTV self.La_title = Label(self.win, text="地址:") self.La_way = Label(self.win, text="选择视频通道:") self.R_way1 = Radiobutton(self.win, text="通道A", variable=self.t1, value=True) self.R_way2 = Radiobutton(self.win, text="通道B", variable=self.t1, value=False) self.R_aiqiyi = Radiobutton(self.win, text="爱奇艺", variable=self.t3, value="a") self.R_youku = Radiobutton(self.win, text="优酷", variable=self.t3, value="y") self.R_pptv = Radiobutton(self.win, text="PPTV", variable=self.t3, value="p") self.B_play = Button(self.win, text="播放▶") self.B_uppage = Button(self.win, text="上页") self.B_nextpage = Button(self.win, text="下页") self.B_search = Button(self.win, text="♣搜索全站♠") self.La_mesasge = Label(self.win, text="☜ ⇠☸⇢ ☞", bg="pink") self.La_page = Label(self.win, bg="#BFEFFF") self.S_croll = Scrollbar(self.win) self.L_box = Listbox(self.win, bg="#BFEFFF", selectmode=SINGLE) self.E_address = Entry(self.win, textvariable=self.temp) self.La_title.place(x=10, y=50, width=50, height=30) self.E_address.place(x=70, y=50, width=200, height=30) self.B_play.place(x=300, y=50, width=50, height=30) self.R_way1.place(x=160, y=10, width=70, height=30) self.R_way2.place(x=240, y=10, width=70, height=30) self.La_way.place(x=10, y=10, width=100, height=30) self.R_aiqiyi.place(x=20, y=100, width=70, height=30) self.R_youku.place(x=90, y=100, width=70, height=30) self.R_pptv.place(x=160, y=100, width=70, height=30) self.B_search.place(x=252, y=140, width=100, height=30) self.La_mesasge.place(x=80, y=125, width=90, height=20) self.L_box.place(x=10, y=180, width=252, height=230) self.S_croll.place(x=260, y=180, width=20, height=230) self.B_uppage.place(x=10, y=140, width=50, height=30) self.B_nextpage.place(x=180, y=140, width=50, height=30) self.La_page.place(x=80, y=150, width=90, height=28) def creat_radiores(self): self.movie = StringVar() # 电影 self.S_croll2 = Scrollbar() # 分集 self.La_pic = Label(self.win, bg="#E6E6FA") self.La_movie_message = Listbox(self.win, bg="#7EC0EE") self.R_movie = Radiobutton(self.win, text="电影", variable=self.movie, value="m") self.tv = Radiobutton(self.win, text="电视剧", variable=self.movie, value="t") self.zhongyi = Radiobutton(self.win, text="综艺", variable=self.movie, value="z") self.dongman = Radiobutton(self.win, text="动漫", variable=self.movie, value="d") self.jilupian = Radiobutton(self.win, text="纪录片", variable=self.movie, value="j") self.B_view = Button(self.win, text="✤查看✤") self.B_info = Button(self.win, text="使用说明") self.B_clearbox = Button(self.win, text="清空列表") self.B_add = Button(self.win, text="添加到播放列表") self.R_movie.place(x=290, y=180, width=80, height=30) self.B_view.place(x=290, y=330, width=70, height=30) self.B_add.place(x=370, y=255, width=100, height=30) self.B_clearbox.place(x=500, y=255, width=70, height=30) self.tv.place(x=290, y=210, width=80, height=30) self.zhongyi.place(x=290, y=240, width=80, height=30) self.dongman.place(x=290, y=270, width=80, height=30) self.jilupian.place(x=290, y=300, width=80, height=30) self.La_movie_message.place(x=370, y=290, width=200, height=120) self.La_pic.place(x=370, y=10, width=200, height=240) self.B_info.place(x=290, y=370, width=70, height=30) self.S_croll2.place(x=568, y=290, width=20, height=120) def show_info(self): msg = """ 1.输入视频播放地址,即可播放 选择A或者B可切换视频源 2.选择视频网,选择电视剧或者电影, 搜索全网后选择想要看得影片,点 查看,在右方list里选择分集视频 添加到播放列表里点选播放 """ messagebox.showinfo(title="使用说明", message=msg) def config(self): self.t1.set(True) self.B_play.config(command=self.play_url_movie) self.B_search.config(command=self.search_full_movie) self.B_info.config(command=self.show_info) self.S_croll.config(command=self.L_box.yview) self.L_box['yscrollcommand'] = self.S_croll.set self.S_croll2.config(command=self.La_movie_message.yview) self.La_movie_message['yscrollcommand'] = self.S_croll2.set self.B_view.config(command=self.view_movies) self.B_add.config(command=self.add_play_list) self.B_clearbox.config(command=self.clear_lisbox2) self.B_uppage.config(command=self.uppage_) self.B_nextpage.config(command=self.nextpage_) def uppage_(self): print('---------上一页---------') self.page -= 1 print(self.page) if self.page < 1: self.page = 1 def nextpage_(self): print('----------下一页--------') self.page += 1 print(self.page) if self.t3 == "a" or self.t3 == "y": if self.page > 30: self.page = 30 elif self.t3 == "p": if self.movie == "m": if self.page > 165: self.page = 165 elif self.movie == "t": if self.page > 85: self.page = 85 elif self.movie == "z": if self.page > 38: self.page = 38 elif self.movie == "d": if self.page > 146: self.page = 146 elif self.movie == "j": if self.page > 40: self.page = 40 def clear_lisbox(self): self.L_box.delete(0, END) def clear_lisbox2(self): self.La_movie_message.delete(0, END) def search_full_movie(self): print("-----search----") self.La_page.config(text="当前页:{}".format(self.page)) self.clear_lisbox() try: movie_url, movie_title, movie_src_pic = self.p.get_movie_res( self.t3.get(), self.movie.get(), self.page) self.movie_dic = {} for i, j, k in zip(movie_title, movie_url, movie_src_pic): self.movie_dic[i] = [j, k] for title in movie_title: self.L_box.insert(END, title) print(self.movie_dic) return self.movie_dic except: messagebox.showerror(title='警告', message='请选择电影或者电视剧') def add_play_list(self): print('---------playlist----------') print(self.movie_dic) if self.La_movie_message.get( self.La_movie_message.curselection()) == "": messagebox.showwarning(title="警告", message='请在列表选择影片') else: print( "电影名字:", self.La_movie_message.get( self.La_movie_message.curselection())) if self.movie.get() != "m": self.temp.set(self.new_more_dic[self.La_movie_message.get( self.La_movie_message.curselection())]) else: self.temp.set(self.movie_dic[self.La_movie_message.get( self.La_movie_message.curselection())][0]) def view_pic(self, pic_url): print('--------viewpic---------') pa_url_check = r'//.+[.]jpg' if re.match(pa_url_check, pic_url): print("ok") pic_url = "http:" + pic_url print(pic_url) data = requests.get(pic_url).content # data=urlopen(pic_url).read() io_data = io.BytesIO(data) self.img = Image.open(io_data) self.u = ImageTk.PhotoImage(self.img) self.La_pic.config(image=self.u) def view_movies(self): print("--------viewmovie----------") cur_index = self.L_box.curselection() print(self.L_box.get(cur_index)) if self.movie.get() != "m": # 非电影类 self.new_more_dic = self.p.get_more_tv_urls( self.movie_dic[self.L_box.get(cur_index)][0], self.t3.get(), self.movie.get()) print(self.new_more_dic) for i, fenji_url in self.new_more_dic.items(): self.La_movie_message.insert(END, i) else: # 电影类 self.La_movie_message.insert(END, self.L_box.get(cur_index)) self.view_pic(self.movie_dic[self.L_box.get( self.L_box.curselection())][1]) # 加载图片 def play_url_movie(self): print("--------ok-----------") # print(type(self.t1.get()),self.t1.get()) if self.temp.get() == "": messagebox.showwarning(title="警告", message="请先输入视频地址") else: if self.t1.get() != "": self.p.play_movie(self.temp.get(), self.t1.get()) else: messagebox.showwarning(title='警告', message='请选择通道')
class BibleReferenceBox( Frame, BibleBox ): """ """ def __init__( self, parentWindow, parentApp, internalBible, referenceObject ): if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.__init__( {}, {}, {}, {} )").format( parentWindow, parentApp, internalBible.name, referenceObject ) ) self.parentWindow, self.parentApp, self.internalBible, self.referenceObject = parentWindow, parentApp, internalBible, referenceObject #self.parentApp = self.parentWindow.parentApp Frame.__init__( self, parentWindow ) BibleBox.__init__( self, self.parentApp ) # Set some dummy values required soon self._viewRadioVar, self._groupRadioVar = tk.IntVar(), tk.StringVar() self.groupCode = BIBLE_GROUP_CODES[0] # Put into first/default BCV group self.contextViewMode = DEFAULT self.viewMode = DEFAULT self.currentVerseKey = SimpleVerseKey( 'UNK','1','1' ) # Unknown book if self.contextViewMode == DEFAULT: self.contextViewMode = 'ByVerse' self.parentWindow.viewVersesBefore, self.parentWindow.viewVersesAfter = 2, 6 # Create a title bar titleBar = Frame( self ) Button( titleBar, text=_('Close'), command=self.doClose ).pack( side=tk.RIGHT ) ## Try to get the title width somewhere near correct (if moduleID is a long path) #adjModuleID = moduleID #self.update() # so we can get the geometry #width = parseWindowSize( self.parentWindow.geometry() )[0] - 60 # Allow for above button #if len(adjModuleID)*10 > width: # Note: this doesn't adjust if the window size is changed #print( "BRB here1", len(adjModuleID), width, repr(adjModuleID) ) #x = len(adjModuleID)*100/width # not perfect (too small) for narrow windows #adjModuleID = '…' + adjModuleID[int(x):] #print( "BRB here2", len(adjModuleID), x, repr(adjModuleID) ) #titleText = '{} ({})'.format( adjModuleID, boxType.replace( 'BibleReferenceBox', '' ) ) titleText = self.referenceObject.getShortText() self.titleLabel = tk.Label( titleBar, text=titleText ) self.titleLabel.pack( side=tk.TOP, fill=tk.X ) titleBar.pack( side=tk.TOP, fill=tk.X ) # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) self.textBox = tk.Text( self, height=4, yscrollcommand=self.vScrollbar.set ) self.textBox['wrap'] = 'word' self.textBox.pack( expand=tk.YES, fill=tk.X ) # Full width self.vScrollbar.config( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardKeyboardBindings() self.textBox.bind( "<Button-1>", self.setFocus ) # So disabled text box can still do select and copy functions # Set-up our standard Bible styles for USFMKey, styleDict in self.parentApp.stylesheet.getTKStyles().items(): self.textBox.tag_configure( USFMKey, **styleDict ) # Create the style # Add our extra specialised styles self.textBox.tag_configure( 'contextHeader', background='pink', font='helvetica 6 bold' ) self.textBox.tag_configure( 'context', background='pink', font='helvetica 6' ) self.pack( expand=tk.YES, fill=tk.BOTH ) # Pack the frame # Set-up our Bible system and our callables self.BibleOrganisationalSystem = BibleOrganizationalSystem( "GENERIC-KJV-66-ENG" ) # temp self.getNumChapters = self.BibleOrganisationalSystem.getNumChapters self.getNumVerses = lambda b,c: 99 if c=='0' or c==0 else self.BibleOrganisationalSystem.getNumVerses( b, c ) self.isValidBCVRef = self.BibleOrganisationalSystem.isValidBCVRef self.getFirstBookCode = self.BibleOrganisationalSystem.getFirstBookCode self.getPreviousBookCode = self.BibleOrganisationalSystem.getPreviousBookCode self.getNextBookCode = self.BibleOrganisationalSystem.getNextBookCode self.getBBB = self.BibleOrganisationalSystem.getBBB self.getBookName = self.BibleOrganisationalSystem.getBookName self.getBookList = self.BibleOrganisationalSystem.getBookList self.maxChapters, self.maxVerses = 150, 150 # temp self.verseCache = OrderedDict() self.updateShownReferences( self.referenceObject ) # end of BibleReferenceBox.__init__ def createStandardKeyboardBindings( self ): """ Create keyboard bindings for this widget. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.createStandardKeyboardBindings()") ) for name,command in ( ('SelectAll',self.doSelectAll), ('Copy',self.doCopy), ('Find',self.doFind), ('Refind',self.doRefind), ('Info',self.doShowInfo), ('Close',self.doClose) ): self.createStandardKeyboardBinding( name, command ) # end of BibleReferenceBox.createStandardKeyboardBindings() def xxxgotoBCV( self, BBB, C, V ): """ """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.gotoBCV( {} {}:{} from {} )").format( BBB, C, V, self.currentVerseKey ) ) # We really need to convert versification systems here adjBBB, adjC, adjV, adjS = self.BibleOrganisationalSystem.convertToReferenceVersification( BBB, C, V ) self.parentWindow.gotoGroupBCV( self.groupCode, adjBBB, adjC, adjV ) # then the App will update me by calling updateShownBCV # end of BibleReferenceBox.gotoBCV def getContextVerseData( self, verseKey ): """ Fetches and returns the internal Bible data for the given reference. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.getContextVerseData( {} )").format( verseKey ) ) if self.internalBible is not None: try: return self.internalBible.getContextVerseData( verseKey ) except KeyError: logging.critical( exp("BibleReferenceBox.getContextVerseData for {} {} got a KeyError!") \ .format( self.boxType, verseKey ) ) # end of BibleReferenceBox.getContextVerseData def XXXgetSwordVerseKey( self, verseKey ): #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getSwordVerseKey( {} )").format( verseKey ) ) BBB, C, V = verseKey.getBCV() return self.parentApp.SwordInterface.makeKey( BBB, C, V ) # end of BibleReferenceBox.getSwordVerseKey def getCachedVerseData( self, verseKey ): """ Checks to see if the requested verse is in our cache, otherwise calls getContextVerseData (from the superclass) to fetch it. The cache keeps the newest or most recently used entries at the end. When it gets too large, it drops the first entry. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("getCachedVerseData( {} )").format( verseKey ) ) verseKeyHash = verseKey.makeHash() if verseKeyHash in self.verseCache: #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( " " + exp("Retrieved from BibleReferenceBox cache") ) self.verseCache.move_to_end( verseKeyHash ) #print( " returning", self.verseCache[verseKeyHash][0] ) return self.verseCache[verseKeyHash] verseContextData = self.getContextVerseData( verseKey ) self.verseCache[verseKeyHash] = verseContextData if len(self.verseCache) > MAX_CACHED_VERSES: #print( "Removing oldest cached entry", len(self.verseCache) ) self.verseCache.popitem( last=False ) return verseContextData # end of BibleReferenceBox.getCachedVerseData def XXXXgetBeforeAndAfterBibleData( self, newVerseKey ): """ Returns the requested verse, the previous verse, and the next n verses. """ if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.getBeforeAndAfterBibleData( {} )").format( newVerseKey ) ) assert( isinstance( newVerseKey, SimpleVerseKey ) ) BBB, C, V = newVerseKey.getBCV() intC, intV = newVerseKey.getChapterNumberInt(), newVerseKey.getVerseNumberInt() prevBBB, prevIntC, prevIntV = BBB, intC, intV previousVersesData = [] for n in range( -self.parentWindow.viewVersesBefore, 0 ): failed = False #print( " getBeforeAndAfterBibleData here with", n, prevIntC, prevIntV ) if prevIntV > 0: prevIntV -= 1 elif prevIntC > 0: prevIntC -= 1 try: prevIntV = self.getNumVerses( prevBBB, prevIntC ) except KeyError: if prevIntC != 0: # we can expect an error for chapter zero logging.critical( exp("getBeforeAndAfterBibleData failed at"), prevBBB, prevIntC ) failed = True #if not failed: #if BibleOrgSysGlobals.debugFlag: print( " Went back to previous chapter", prevIntC, prevIntV, "from", BBB, C, V ) else: prevBBB = self.BibleOrganisationalSystem.getPreviousBookCode( BBB ) if prevBBB is None: failed = True else: prevIntC = self.getNumChapters( prevBBB ) prevIntV = self.getNumVerses( prevBBB, prevIntC ) if BibleOrgSysGlobals.debugFlag: print( " Went back to previous book", prevBBB, prevIntC, prevIntV, "from", BBB, C, V ) if not failed and prevIntV is not None: #print( "getBeforeAndAfterBibleData XXX", repr(prevBBB), repr(prevIntC), repr(prevIntV) ) assert( prevBBB and isinstance(prevBBB, str) ) previousVerseKey = SimpleVerseKey( prevBBB, prevIntC, prevIntV ) previousVerseData = self.getCachedVerseData( previousVerseKey ) if previousVerseData: previousVersesData.insert( 0, (previousVerseKey,previousVerseData,) ) # Put verses in backwards # Determine the next valid verse numbers nextBBB, nextIntC, nextIntV = BBB, intC, intV nextVersesData = [] for n in range( 0, self.parentWindow.viewVersesAfter ): try: numVerses = self.getNumVerses( nextBBB, nextIntC ) except KeyError: numVerses = None # for an invalid BBB nextIntV += 1 if numVerses is None or nextIntV > numVerses: nextIntV = 1 nextIntC += 1 # Need to check................................ nextVerseKey = SimpleVerseKey( nextBBB, nextIntC, nextIntV ) nextVerseData = self.getCachedVerseData( nextVerseKey ) if nextVerseData: nextVersesData.append( (nextVerseKey,nextVerseData,) ) verseData = self.getCachedVerseData( newVerseKey ) return verseData, previousVersesData, nextVersesData # end of BibleReferenceBox.getBeforeAndAfterBibleData def XXXsetCurrentVerseKey( self, newVerseKey ): """ Called to set the current verse key. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.setCurrentVerseKey( {} )").format( newVerseKey ) ) self.parentApp.setDebugText( "BRW setCurrentVerseKey..." ) assert( isinstance( newVerseKey, SimpleVerseKey ) ) self.currentVerseKey = newVerseKey BBB = self.currentVerseKey.getBBB() self.maxChapters = self.getNumChapters( BBB ) self.maxVerses = self.getNumVerses( BBB, self.currentVerseKey.getChapterNumber() ) # end of BibleReferenceBox.setCurrentVerseKey def updateShownReferences( self, newReferenceObject ): """ Updates self in various ways depending on the contextViewMode held by the enclosing window. The new verse references are in the reference versification system in one of these objects: SimpleVerseKey (accepts 'GEN_1:1' or 'GEN','1','1') SimpleVersesKey (accepts 'MAT_6:1,4') VerseRangeKey (accepts 'JNA_2:1-7') Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceBox.updateShownReferences( {} ) for {}".format( newReferenceObject, self.internalBible.name ) ) assert( isinstance( newReferenceObject, SimpleVerseKey ) or isinstance( newReferenceObject, SimpleVersesKey ) or isinstance( newReferenceObject, VerseRangeKey )) for j, referenceVerse in enumerate( newReferenceObject ): #print( " refVerse", j, referenceVerse ) assert( isinstance( referenceVerse, SimpleVerseKey ) ) refBBB, refC, refV, refS = referenceVerse.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) #print( " newVK", newVerseKey ) # Set firstFlag as False (rather than j==0) so don't get context displayed self.displayAppendVerse( False, newVerseKey, self.getCachedVerseData( newVerseKey ), lastFlag=False ) #self.setCurrentVerseKey( newVerseKey ) #self.clearText() # Leaves the text box enabled #startingFlag = True ## Safety-check in case they edited the settings file #if 'DBP' in self.boxType and self.contextViewMode in ('ByBook','ByChapter',): #print( exp("updateShownReferences: Safety-check converted {} contextViewMode for DBP").format( repr(self.contextViewMode) ) ) #self._viewRadioVar.set( 3 ) # ByVerse #self.changeBibleContextView() #if self.contextViewMode == 'BeforeAndAfter': #bibleData = self.getBeforeAndAfterBibleData( newVerseKey ) #if bibleData: #verseData, previousVerses, nextVerses = bibleData #for verseKey,previousVerseData in previousVerses: #self.displayAppendVerse( startingFlag, verseKey, previousVerseData ) #startingFlag = False #self.displayAppendVerse( startingFlag, newVerseKey, verseData, currentVerse=True ) #for verseKey,nextVerseData in nextVerses: #self.displayAppendVerse( False, verseKey, nextVerseData ) #elif self.contextViewMode == 'ByVerse': #self.displayAppendVerse( True, newVerseKey, self.getCachedVerseData( newVerseKey ), currentVerse=True ) #elif self.contextViewMode == 'BySection': #self.displayAppendVerse( True, newVerseKey, self.getCachedVerseData( newVerseKey ), currentVerse=True ) #BBB, C, V = newVerseKey.getBCV() #intC, intV = newVerseKey.getChapterNumberInt(), newVerseKey.getVerseNumberInt() #print( "\nBySection is not finished yet -- just shows a single verse!\n" ) # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ##for thisC in range( 0, self.getNumChapters( BBB ) ): ##try: numVerses = self.getNumVerses( BBB, thisC ) ##except KeyError: numVerses = 0 ##for thisV in range( 0, numVerses ): ##thisVerseKey = SimpleVerseKey( BBB, thisC, thisV ) ##thisVerseData = self.getCachedVerseData( thisVerseKey ) ##self.displayAppendVerse( startingFlag, thisVerseKey, thisVerseData, ##currentVerse=thisC==intC and thisV==intV ) ##startingFlag = False #elif self.contextViewMode == 'ByBook': #BBB, C, V = newVerseKey.getBCV() #intC, intV = newVerseKey.getChapterNumberInt(), newVerseKey.getVerseNumberInt() #for thisC in range( 0, self.getNumChapters( BBB ) ): #try: numVerses = self.getNumVerses( BBB, thisC ) #except KeyError: numVerses = 0 #for thisV in range( 0, numVerses ): #thisVerseKey = SimpleVerseKey( BBB, thisC, thisV ) #thisVerseData = self.getCachedVerseData( thisVerseKey ) #self.displayAppendVerse( startingFlag, thisVerseKey, thisVerseData, #currentVerse=thisC==intC and thisV==intV ) #startingFlag = False #elif self.contextViewMode == 'ByChapter': #BBB, C, V = newVerseKey.getBCV() #intV = newVerseKey.getVerseNumberInt() #try: numVerses = self.getNumVerses( BBB, C ) #except KeyError: numVerses = 0 #for thisV in range( 0, numVerses ): #thisVerseKey = SimpleVerseKey( BBB, C, thisV ) #thisVerseData = self.getCachedVerseData( thisVerseKey ) #self.displayAppendVerse( startingFlag, thisVerseKey, thisVerseData, currentVerse=thisV==intV ) #startingFlag = False #else: #logging.critical( exp("BibleReferenceBox.updateShownBCV: Bad context view mode {}").format( self.contextViewMode ) ) #if BibleOrgSysGlobals.debugFlag: halt # Unknown context view mode self.textBox['state'] = tk.DISABLED # Don't allow editing # end of BibleReferenceBox.updateShownReferences def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeReferenceBox() # end of BibleReferenceBox.doClose def closeReferenceBox( self ): """ Called to finally and irreversibly remove this box from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.closeReferenceBox()") ) if self in self.parentWindow.referenceBoxes: self.parentWindow.referenceBoxes.remove( self ) self.destroy() else: # we might not have finished making our box yet if BibleOrgSysGlobals.debugFlag: print( exp("BibleReferenceBox.closeReferenceBox() for {} wasn't in list").format( self.winType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Closed resource box" )
def initUI(self): self.parent.title("Digital Cookbook") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1, side=BOTTOM) # Establish menu bar # menubar = Menu(self.parent) self.parent.config(menu=menubar) # Add file menu # filemenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="File", menu=filemenu) filemenu.add_command(label="Import recipe from XML file", command=self.xmlImport) filemenu.add_command(label="Add blank recipe to database", command=self.recipeAdd) filemenu.add_command(label="Delete recipe from database", command=self.recipeDelete) filemenu.add_command(label="Load recipe", command=self.recipeLoad) filemenu.add_command(label="Save recipe to database", command=self.recipeSave, accelerator="Ctrl+S") filemenu.add_separator() filemenu.add_command(label="Exit", command=self.onExit, accelerator="Ctrl+W") # Add help menu # helpmenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="Help", menu=helpmenu) helpmenu.add_command(label="About...", command=self.helpAbout) # Establish toolbar # frameToolbar = Frame(self.parent) # , relief=RAISED, borderwidth=1) frameToolbar.pack(side=TOP, fill=X) # Add buttons to toolbar # buffer = 2 buttonspaceing = 100 buttonwidth = 12 buttonheight = 30 bImportXML = Button(frameToolbar, text="Import XML", command=self.xmlImport, width=buttonwidth) bImportXML.pack(side=LEFT, padx=buffer, pady=buffer) bAddRecipe = Button(frameToolbar, text="Add Recipe", command=self.recipeAdd, width=buttonwidth) bAddRecipe.pack(side=LEFT, padx=buffer, pady=buffer) bDeleteRecipe = Button(frameToolbar, text="Delete Recipe", command=self.recipeDelete, width=buttonwidth) bDeleteRecipe.pack(side=LEFT, padx=buffer, pady=buffer) bEditRecipe = Button(frameToolbar, text="Load Recipe", command=self.recipeLoad, width=buttonwidth) bEditRecipe.pack(side=LEFT, padx=buffer, pady=buffer) bSaveRecipe = Button(frameToolbar, text="Save Recipe", command=self.recipeSave, width=buttonwidth) bSaveRecipe.pack(side=LEFT, padx=buffer, pady=buffer) # Recipe list section frameRecipeList = Frame(self, borderwidth=1, width=200) frameRecipeList.pack_propagate(0) frameRecipeList.pack(side=LEFT, fill=Y) Label(frameRecipeList, text="Recipe List").pack() # Category option menu default = StringVar(frameRecipeList) default.set("----") recipeCatagories = OptionMenu(frameRecipeList, default, "----", "None", "Cat 1", "Cat 2", "Cat 3") recipeCatagories.pack(side=TOP, fill=X) # Filter Frame frameFilter = Frame(frameRecipeList, relief=RAISED, borderwidth=1, width=200) frameFilter.pack(side=TOP, fill=X) Label(frameFilter, text="Filter...").pack() # Filter text filterText = Entry(frameFilter) filterText.pack_propagate(0) filterText.pack(side=LEFT, fill=X) # Filter Button filterButton = Button(frameFilter, text="Go", command=self.placeholder) filterButton.pack_propagate(0) filterButton.pack(side=RIGHT) # Recipe Box Frame frameRecipeBox = Frame(frameRecipeList, relief=RAISED, borderwidth=1) frameRecipeBox.pack(side=TOP, fill=BOTH, expand=1) # ==== Recipe List box ==== recipeListScroll = Scrollbar(frameRecipeBox, orient=VERTICAL) self.recipeList = Listbox(frameRecipeBox, selectmode=EXTENDED, yscrollcommand=recipeListScroll.set) self.recipeList.pack(side=LEFT, fill=BOTH, expand=1) recipeListScroll.config(command=self.recipeList.yview) recipeListScroll.pack(side=RIGHT, fill=Y) self.getReciepList() self.populateRecipeList(self.recipes) # Spacer frameSpacer1 = Frame(self, borderwidth=1, width=10) frameSpacer1.pack_propagate(0) frameSpacer1.pack(side=LEFT, fill=Y) # Recipe info section frameRecipeInfo = Frame(self, borderwidth=1, width=200) frameRecipeInfo.pack_propagate(0) frameRecipeInfo.pack(side=LEFT, fill=Y) # Recipe name Label(frameRecipeInfo, text="Recipe Name:", anchor=E, justify=LEFT).pack() self.recipeName = Entry(frameRecipeInfo) self.recipeName.pack(side=TOP, fill=X) # Prep Time framePrepTime = Frame(frameRecipeInfo) framePrepTime.pack(side=TOP, fill=X) Label(framePrepTime, text="Prep Time:", anchor=E, justify=LEFT).pack() self.prepTime = Entry(framePrepTime) self.prepTime.pack(side=LEFT, fill=X) default = StringVar(framePrepTime) default.set("----") self.prepTimeUnit = OptionMenu(framePrepTime, default, "----", "Min", "Hr") self.prepTimeUnit.pack(side=RIGHT, fill=X) # Cook Time frameCookTime = Frame(frameRecipeInfo) frameCookTime.pack(side=TOP, fill=X) Label(frameCookTime, text="Cook Time:", anchor=E, justify=LEFT).pack() self.cookTime = Entry(frameCookTime) self.cookTime.pack(side=LEFT, fill=X) default = StringVar(frameCookTime) default.set("----") self.cookTimeUnit = OptionMenu(frameCookTime, default, "----", "Min", "Hr") self.cookTimeUnit.pack(side=RIGHT, fill=X) # Spacer frameSpacer2 = Frame(self, borderwidth=1, width=10) frameSpacer2.pack_propagate(0) frameSpacer2.pack(side=LEFT, fill=Y) # Ingredient List frameIngredients = Frame(self, borderwidth=1, width=300) frameIngredients.pack_propagate(0) frameIngredients.pack(side=LEFT, fill=Y) Label(frameIngredients, text="Ingredients").pack() # Ingredient Name self.ingredientName = Entry(frameIngredients) self.ingredientName.pack(side=TOP, fill=X) # Ingredient info frameIngredientQuantity = Frame(frameIngredients) frameIngredientQuantity.pack(side=TOP, fill=X) Label(frameIngredientQuantity, text="Ingredient Quantity (value, unit):", anchor=E, justify=LEFT).pack() self.ingredientQuantity = Entry(frameIngredientQuantity) self.ingredientQuantity.pack(side=LEFT, fill=X, expand=1) self.ingredientUnit = Entry(frameIngredientQuantity, width=20) self.ingredientUnit.pack_propagate(0) self.ingredientUnit.pack(side=RIGHT, fill=X) # Spacer frameSpacer3 = Frame(frameIngredients, height=10) frameSpacer3.pack_propagate(0) frameSpacer3.pack(side=TOP, fill=X) # Ingredient List buttons frameIngredientButtons = Frame(frameIngredients) frameIngredientButtons.pack(side=TOP, fill=X) ingredientAdd = Button(frameIngredientButtons, text="+", command=self.ingredientAdd, width=3) ingredientAdd.pack(side=LEFT) ingredientDel = Button(frameIngredientButtons, text="-", command=self.ingredientDelete, width=3) ingredientDel.pack(side=LEFT) ingredientUp = Button(frameIngredientButtons, text=u"\u25B2", command=self.ingredientMoveUp, width=3) ingredientUp.pack(side=LEFT) ingredientDwn = Button(frameIngredientButtons, text=u"\u25BC", command=self.ingredientMoveDown, width=3) ingredientDwn.pack(side=LEFT) ingredientLoad = Button(frameIngredientButtons, text="Load", command=self.ingredientLoadInfo) ingredientLoad.pack(side=LEFT) ingredientSave = Button(frameIngredientButtons, text="Save", command=self.ingredientSaveInfo) ingredientSave.pack(side=LEFT) # Ingredient List Box Frame frameIngredientList = Frame(frameIngredients, relief=RAISED, borderwidth=1) frameIngredientList.pack(side=TOP, fill=BOTH, expand=1) # Ingredient List box ingredientListScroll = Scrollbar(frameIngredientList, orient=VERTICAL) self.ingredientList = Listbox( frameIngredientList, selectmode=SINGLE, yscrollcommand=ingredientListScroll.set ) # Set selectmode=SINGLE???? self.ingredientList.pack(side=LEFT, fill=BOTH, expand=1) ingredientListScroll.config(command=self.ingredientList.yview) ingredientListScroll.pack(side=RIGHT, fill=Y) # Spacer frameSpacer4 = Frame(self, borderwidth=1, width=10) frameSpacer4.pack_propagate(0) frameSpacer4.pack(side=LEFT, fill=Y) # Recipe Procedure frameProcedure = Frame(self, borderwidth=1) frameProcedure.pack(side=LEFT, fill=BOTH, expand=1) Label(frameProcedure, text="Procedure", anchor=E, justify=LEFT).pack(side=TOP) procedureScroll = Scrollbar(frameProcedure, orient=VERTICAL) self.procedure = Text(frameProcedure, maxundo=30, undo=1, wrap=WORD, yscrollcommand=procedureScroll.set) self.procedure.pack(side=LEFT, fill=BOTH, expand=1) procedureScroll.config(command=self.procedure.yview) procedureScroll.pack(side=LEFT, fill=Y)
class Search(Module): def __init__(self, app): self.app = app self.window = None self.context_size = 3 self.results = [] self.regex = StringVar(self.app) # if anything ever changes the contents of any intervals # it should call SearchModule.loadIntervals() self.intervals = [] self.loadIntervals() def handleClose(self, event=None): self.window.destroy() self.window = None def createWindow(self): self.window = Toplevel(self.app) self.window.title('Search') self.window.protocol("WM_DELETE_WINDOW", self.handleClose) self.input = Entry(self.window, textvariable=self.regex) self.input.grid(row=0, column=0) self.input.bind('<Return>', self.search) self.input.bind('<Escape>', lambda ev: self.window.focus()) self.searchButton = Button(self.window, text='Search', command=self.search, takefocus=0) self.searchButton.grid(row=0, column=1) self.resultCount = Label(self.window, text='0 results') self.resultCount.grid(row=0, column=2) cols = ('File', 'Tier', 'Time', 'Text') self.scroll = Scrollbar(self.window, orient='vertical') self.resultList = Treeview(self.window, columns=cols, show="headings", yscrollcommand=self.scroll.set, selectmode='browse') self.scroll.config(command=self.resultList.yview) for col in cols: self.resultList.heading(col, text=col) self.resultList.grid(row=2, column=0, columnspan=3, sticky='news') self.resultList.bind('<Double-1>', self.onClick) Grid.rowconfigure(self.window, 2, weight=1) Grid.columnconfigure(self.window, 0, weight=1) self.scroll.grid(row=2, column=3, sticky='ns') def openSearch(self): if self.window == None: self.createWindow() self.window.lift() self.input.focus() def loadIntervals(self): filecount = len(self.app.Data.getTopLevel('files')) self.intervals = [] for f in range(filecount): filename = self.app.Data.getFileLevel('name', f) tg = self.app.Data.checkFileLevel('.TextGrid', f, shoulderror=False) if tg: grid = self.app.TextGrid.fromFile(tg) for tier in grid: if TextGrid.isIntervalTier(tier): for el in tier: if el.mark: self.intervals.append( (el, tier.name, filename)) def search(self, event=None): if self.regex.get() == '': self.results = [] else: pat = re.compile(self.regex.get(), re.IGNORECASE | re.MULTILINE | re.DOTALL) self.results = [] for i in self.intervals: s = pat.search(i[0].mark) if s: disp = i[0].mark a = max(0, s.start() - self.context_size) b = min(s.end() + self.context_size, len(disp)) self.results.append(i + (('...' if a > 0 else '') + disp[a:b] + ('...' if b < len(disp) else ''), )) self.resultCount.configure(text='%s results' % len(self.results)) for kid in self.resultList.get_children(): self.resultList.delete(kid) for row, res in enumerate(self.results): ls = (res[2], res[1], '%s-%s' % (res[0].minTime, res[0].maxTime), res[3]) self.resultList.insert('', 'end', iid=str(row), values=ls) def onClick(self, event=None): self.jumpTo(int(self.resultList.selection()[0])) def jumpTo(self, index): self.app.filesJumpTo(self.results[index][2]) self.app.TextGrid.selectedTier.set(self.results[index][1]) self.app.TextGrid.start = self.results[index][0].minTime self.app.TextGrid.end = self.results[index][0].maxTime for i, f in enumerate(self.app.TextGrid.frameTier): if f.time >= self.results[index][0].minTime: self.app.frameSV.set(str(i)) self.app.framesJumpTo() break self.app.TextGrid.fillCanvases() def reset(self, *args, **kwargs): raise NotImplementedError('cannot call SearchModule::reset') def update(self, *args, **kwargs): raise NotImplementedError('cannot call SearchModule::update') def grid(self, *args, **kwargs): raise NotImplementedError('cannot call SearchModule::grid') def grid_remove(self, *args, **kwargs): raise NotImplementedError('cannot call SearchModule::grid_remove')
class SearchApplication(GenericFrame): FAVICON = "../assets/favicon.ico" def __init__(self, parent=None, app_window=None): self.lastValue = None self.category_option = StringVar("") self.column_id = [ 'ProductDescription', 'ManufacturerName', 'ManufacturerPartNumber', 'DigiKeyPartNumber', 'Category' ] Frame.__init__(self, parent) self.pack() self.parent = parent self.app_window = app_window self.selectedField = None self.parent.title("Partlocater - Advanced Database Search") self.parent.iconbitmap(self.FAVICON) self.menubar = Frame(self, background='white') self.menubar.pack(side=TOP, fill=X, expand=YES) self.win_frame = Frame(self) self.win_frame.pack(side=TOP, fill=BOTH, expand=YES) self.editbutton = Menubutton(self.menubar, text='Edit', background='grey98') self.editbutton.pack(side=LEFT, fill=X) self.editmenu = Menu(self.editbutton, tearoff=0) self.editbutton.config(menu=self.editmenu) self.copySourcesMenu = Menu(self.editbutton, tearoff=0) self.editmenu.add_cascade(label='Copy', menu=self.copySourcesMenu) self.copySourcesMenu.add_command(label='Part Number', state=DISABLED, command=self.on_copy_partnumber) self.partnumber_index = 0 self.copySourcesMenu.add_command(label='Selected Parameter', state=DISABLED, command=self.on_copy_parameters) self.selectedParameter_index = 1 self.copySourcesMenu.add_command(label='Selected Part All Parameters', state=DISABLED, command=self.on_copy_all_parameters) self.allParameters_index = 2 self.editmenu.add_command(label='Delete Part', state=DISABLED, command=self.on_delete) self.searchLF = LabelFrame(self.win_frame, text="Search") self.searchLF.pack(side=LEFT, fill=X, expand=YES, pady=4, padx=6) self.searchLeftF = Frame(self.searchLF) self.searchLeftF.pack(side=LEFT, anchor=W) self.searchRightF = Frame(self.searchLF) self.searchRightF.pack(side=LEFT, anchor=N) self.searchLabelWidth = 20 self.catF = Frame(self.searchLeftF) self.catF.pack(side=TOP, anchor=W) self.catL = Label(self.catF, text='Category', width=self.searchLabelWidth, anchor=W, justify=LEFT) self.catL.pack(side=LEFT, fill=X, expand=YES) self.cat = StringVar() self.catE = Entry(self.catF, textvariable=self.cat, width=50, state=DISABLED) self.catE.config(disabledbackground=self.catE.cget("bg")) self.catE.config(disabledforeground=self.catE.cget("fg")) self.catE.pack(side=LEFT, fill=X, expand=YES, pady=4) self.category_option = StringVar() self.cat.set("All") option_list = ['All', 'All'] + Config().tables self.catM = OptionMenu(self.searchRightF, self.category_option, *option_list, command=self.on_category) self.catM.pack(side=TOP, anchor=N, fill=X, expand=YES) self.manF = Frame(self.searchLeftF) self.manF.pack(side=TOP, anchor=W) self.manL = Label(self.manF, text='ManufacturerName', width=self.searchLabelWidth, anchor=W, justify=LEFT) self.manL.pack(side=LEFT, fill=X, expand=YES, pady=4) self.man = StringVar() self.manE = Entry(self.manF, width=50, textvariable=self.man) self.manE.pack(side=LEFT, fill=X, expand=YES, pady=4) self.mpnF = Frame(self.searchLeftF) self.mpnF.pack(side=TOP, anchor=W) self.mpnL = Label(self.mpnF, text='ManufacturerPartNumber', width=self.searchLabelWidth, anchor=W, justify=LEFT) self.mpnL.pack(side=LEFT, fill=X, expand=YES, pady=4) self.mpn = StringVar() self.mpnE = Entry(self.mpnF, width=50, textvariable=self.mpn) self.mpnE.pack(side=LEFT, fill=X, expand=YES, pady=4) self.spnF = Frame(self.searchLeftF) self.spnF.pack(side=TOP, anchor=W) self.spnL = Label(self.spnF, text='DigiKeyPartNumber', width=self.searchLabelWidth, anchor=W, justify=LEFT) self.spnL.pack(side=LEFT, fill=X, expand=YES, pady=4) self.spn = StringVar() self.spnE = Entry(self.spnF, width=50, textvariable=self.spn) self.spnE.pack(side=LEFT, fill=X, expand=YES, pady=4) self.descF = Frame(self.searchLeftF) self.descF.pack(side=TOP, anchor=W) self.descL = Label(self.descF, text='ProductDescription', width=self.searchLabelWidth, anchor=W, justify=LEFT) self.descL.pack(side=LEFT, fill=X, expand=YES, pady=4) self.desc = StringVar() self.descE = Entry(self.descF, width=50, textvariable=self.desc) self.descE.pack(side=LEFT, fill=X, expand=YES, pady=4) self.descE.focus_force() self.findF = Frame(self.searchLeftF) self.findF.pack(side=TOP, anchor=E) self.findB = ttk.Button(self.findF, text="Find", width=12, command=lambda event=None: self.do_find(event)) self.findB.pack(side=LEFT, pady=4) self.clearB = ttk.Button(self.findF, text="Clear", width=6, command=self.on_clear_search) self.clearB.pack(side=LEFT, pady=4) self.partsLF = LabelFrame(self, text="Found Components") self.partsLF.pack(side=TOP, fill=X, expand=YES, pady=4, padx=4) self.partsF = Frame(self.partsLF) self.partsF.pack(side=TOP, pady=4, padx=4) # change treeview for search here self.partsTV = Treeview(self.partsF, selectmode=BROWSE, show='tree headings', columns=self.column_id) self.partsTV.bind('<Double-Button-1>', self.on_edit_item) self.partsTV.bind('<<TreeviewSelect>>', self.fieldChanged) self.partsTV.bind('<Escape>', self.clearSelection) self.partsTV.bind('<MouseWheel>', self.mousewheel) self.partsTV.bind('<Button-4>', self.mousewheel) self.partsTV.bind('<Button-5>', self.mousewheel) vcmd = (self.register(self.validateEntry), '%P') self.editfield = ttk.Entry(self.partsTV, validate='key', validatecommand=vcmd) self.editfield.bind('<Return>', self.updateField) self.editfield.bind('<Escape>', self.clearSelection) self.partsTV.bind('<Control-c>', self.on_copy_element) self.partsTV.column("#0", minwidth=0, width=18, stretch=NO) for t in self.column_id: self.partsTV.heading(t, text=Config().parameter[t]) self.partsTV.column('Category', width=60) self.scrollbar = Scrollbar(self.partsF, orient='vertical', command=self.partsTV.yview) self.scrollbar.pack(side=RIGHT, fill=Y, expand=YES, anchor=E) self.partsTV.configure(yscroll=self.scrollbar.set) self.scrollbar.config(command=self.yview) self.partsTV.pack(side=TOP, anchor=W, fill=X, expand=YES) self.partsTV.delete(*self.partsTV.get_children()) # end change of treeview # change the following to menu item #self.part_buttonF = Frame(self.partsLF) #self.delete_partB = ttk.Button(self.partsLF, text="Delete Part from Database", command=self.on_delete, #state=DISABLED) #self.delete_partB.pack(side=RIGHT, anchor=W, expand=NO, pady=4, padx=6) #self.partsB = ttk.Button(self.partsLF, text="Copy Selected To Part Find", command=self.on_copy, state=DISABLED) #self.partsB.pack(side=RIGHT, anchor=W, expand=NO, pady=4, padx=6) #self.part_buttonF.pack(side=BOTTOM) # start remove vvv #self.element_labelframe = LabelFrame(self, text="Modify Name/Value") #self.element_labelframe.pack(side=TOP, fill=X, expand=YES, pady=4, padx=6) #self.element_frame = Frame(self.element_labelframe) #self.element_frame.pack(side=TOP) #self.element_name = StringVar() #self.element_label = Label(self.element_frame, textvariable=self.element_name, width=30, anchor=W, justify=LEFT) #self.element_label.pack(side=LEFT, anchor=W, fill=X, expand=YES, pady=4) #self.element_value = StringVar() #self.element_entry = Entry(self.element_frame, width=50, textvariable=self.element_value) #self.element_entry.pack(side=LEFT, fill=X, expand=YES, pady=4) #self.default_color = self.element_entry.cget('background') #self.element_update = ttk.Button(self.element_frame, text="Update", command=self.on_update_element, #state=DISABLED) #self.element_update.pack(side=LEFT, fill=X, expand=YES, pady=4) #self.element_cancel = ttk.Button(self.element_frame, text="Cancel", command=self.on_clear_element, #state=DISABLED) #self.element_cancel.pack(side=LEFT, fill=X, expand=YES, pady=4) # end remove ^^^ self.statusLF = LabelFrame(self, text="Status") self.statusLF.pack(side=BOTTOM, fill=X, expand=YES, pady=4, padx=6) self.statusF = Frame(self.statusLF) self.statusF.pack(side=TOP, fill=X, expand=YES, padx=6) self.status = self.StatusBar(self.statusF, self) def validateEntry(self, P): if (len(P) <= 120): return True else: self.bell() return False # scroll bar event def yview(self, *args): if self.selectedField is not None: self.editfield.place_forget() self.selectedField = None self.partsTV.yview(*args) # mousewheel and button4/5 event def mousewheel(self, event): if self.selectedField is not None: self.editfield.place_forget() self.selectedField = None # escape event in treeview or editfield def clearSelection(self, event): self.editfield.place_forget() self.selectedField = None self.partsTV.selection_remove(self.partsTV.selection()) self.status.set("") # double button event def on_edit_item(self, event): if self.partsTV.parent(self.partsTV.selection() ) == '': # testing should not edit a parent self.selectedField = None return if (self.partsTV.identify_region(event.x, event.y) == 'cell'): self.selectedField = self.partsTV.identify_row(event.y) x, y, width, height = self.partsTV.bbox(self.selectedField, '#2') v = self.partsTV.set(self.selectedField, 1) self.editfield.pack() self.editfield.delete(0, len(self.editfield.get())) self.editfield.insert(0, v) self.editfield.selection_range(0, 'end') self.editfield.focus_force() self.editfield.place(x=x, y=y, width=width, height=height) # find button event def on_find(self): category = self.cat.get() search_list = [] col_list = [] search_str = self.man.get() if not (validate(search_str)): raise Exception("Invalid Manufacture Name") search_list.append(search_str) col_list.append(Config().parameter['ManufacturerName']) search_str = self.mpn.get() if not (validate(search_str)): raise Exception("Invalid Manufacture Part Number") search_list.append(search_str) col_list.append(Config().parameter['ManufacturerPartNumber']) search_str = self.spn.get() if not (validate(search_str)): raise Exception("Invalid Supplier Part Number") search_list.append(search_str) col_list.append(Config().parameter['DigiKeyPartNumber']) search_str = self.desc.get().split() if not (validate(search_str)): raise Exception("Invalid Description") search_list += search_str col_list.append(Config().parameter['ProductDescription']) select = "SELECT * FROM `" + Config().loaded_db.name + "`." where = "WHERE" like = "" i = 0 for item in search_list: if len(item) > 0: item = item.replace('%', '\\%') item = item.replace('"', '') item = item.replace("'", "") if i < 3: like += where + " `" + col_list[ i] + "` LIKE '" + item + "%'" else: like += where + " (`" + col_list[i] + "` LIKE '" + item + "%' OR `" + \ col_list[i] + "` LIKE '% " + item + "%')" where = " AND" i = i + 1 if (i < 3) else i self.partsTV.delete(*self.partsTV.get_children()) count = 0 if category == "All": for table in Config().tables: qry = select + "`" + table + "` " + like result = Config().loaded_db.query(qry) for record in result: v = [] spn = record[Config().parameter['DigiKeyPartNumber']] count += 1 for id in self.column_id: if id == 'Category': v.append(table) else: v.append(record[Config().parameter[id]]) id = self.partsTV.insert('', 'end', iid=spn, text=spn, values=v) for params in record: if record[params] is not None: self.partsTV.insert(id, 'end', text=spn, values=(params, record[params])) else: qry = select + "`" + category + "` " + like result = Config().loaded_db.query(qry) for record in result: v = [] count += 1 spn = record[Config().parameter['DigiKeyPartNumber']] for id in self.column_id: if id == 'Category': v.append(category) else: v.append(record[Config().parameter[id]]) id = self.partsTV.insert('', 'end', iid=spn, text=spn, values=v) for params in record: if record[params] is not None: self.partsTV.insert(id, 'end', text=spn, values=(params, record[params])) self.status.set(("No" if count == 0 else str(count)) + " items found") # return event def updateField(self, event): value = self.editfield.get() self.editfield.place_forget() name = self.partsTV.item(self.selectedField, "text") if not validate(value): self.status.seterror("Invalid value, must not have quotes") return self.partsTV.set(self.selectedField, "#2", value) key = self.partsTV.set(self.selectedField, "#1") self.editfield.place_forget() element_parent = self.partsTV.parent(self.selectedField) table_name = self.partsTV.item( element_parent, "values")[self.column_id.index('Category')] part_number = self.partsTV.item( element_parent, "values")[self.column_id.index('DigiKeyPartNumber')] set_param = "SET `" + key + "` = '" + value + "' " where = "WHERE `" + Config( ).parameter['DigiKeyPartNumber'] + "` = '" + part_number + "'" qry = "UPDATE `" + Config( ).loaded_db.name + "`.`" + table_name + "` " + set_param + where print(qry) try: Config().loaded_db.query(qry) except Exception as e: self.status.seterror("Database query failed: %s", e) return self.status.set("Changed " + key + " to " + value + " for part " + part_number + ".") self.partsTV.see(self.selectedField) # clear button in search frame def on_clear_search(self): self.man.set("") self.mpn.set("") self.spn.set("") self.desc.set("") self.cat.set("All") self.category_option.set("All") self.partsTV.delete(*self.partsTV.get_children()) def do_flash(self): current_color = self.element_entry.cget("background") if current_color == self.default_color: self.element_entry.config(background="red") else: self.element_entry.config(background=self.default_color) return self.after(250, self.do_flash) # category option menu def on_category(self, value): self.catE.config(state=NORMAL) self.cat.set(value) self.catE.config(state=DISABLED) #def on_copy(self): #selected = self.partsTV.selection()[0] #key = self.partsTV.item(selected, "values")[self.column_id.index('DigiKeyPartNumber')] #self.app_window.part_num_string.set(key) #self.status.set("Part Number '" + key + "' copied to Part Find") # Edit -> Delete menu def on_delete(self): selected = self.partsTV.selection()[0] key = self.partsTV.item( selected, "values")[self.column_id.index('DigiKeyPartNumber')] table = self.partsTV.item(selected, "values")[self.column_id.index('Category')] if messagebox.askokcancel( "Delete", "Click OK if you really want to delete '" + key + "' from database?"): Config().loaded_db.query("DELETE FROM `" + table + "` WHERE `" + Config().parameter['DigiKeyPartNumber'] + "` = '" + key + "'") self.status.set("Part Number '" + key + "' deleted from database") # treeview select event def fieldChanged(self, event): selected = self.partsTV.selection() if len(selected) > 0: self.copySourcesMenu.entryconfig(self.partnumber_index, state=NORMAL) self.copySourcesMenu.entryconfig(self.allParameters_index, state=NORMAL) else: self.copySourcesMenu.entryconfig(self.partnumber_index, state=DISABLED) self.copySourcesMenu.entryconfig(self.allParameters_index, state=DISABLED) return if self.partsTV.parent(selected) == '': self.copySourcesMenu.entryconfig(self.selectedParameter_index, state=DISABLED) else: self.copySourcesMenu.entryconfig(self.selectedParameter_index, state=NORMAL) if selected != self.selectedField: self.editfield.place_forget() self.selectedField = None def on_copy_parameters(self): selected = self.partsTV.selection() if len(selected) == 0 or self.partsTV.parent(selected) == '': return try: property = self.partsTV.item(selected, "values") self.parent.clipboard_clear() self.parent.clipboard_append(property[0] + '\t' + property[1]) self.parent.update() self.status.set(property[0] + ' ' + property[1] + " copied to clipboard") except Exception as e: pass def on_copy_partnumber(self): selected = self.partsTV.selection() if len(selected) == 0 or self.partsTV.parent(selected) == '': return try: if self.partsTV.parent(selected) != '': selected = self.partsTV.parent(selected) partnumber = self.partsTV.item( selected, "values")[self.column_id.index('DigiKeyPartNumber')] self.parent.clipboard_clear() self.parent.clipboard_append(partnumber) self.parent.update() self.status.set(" '" + partnumber + "' copied to clipboard") except Exception as e: pass def on_copy_all_parameters(self): selected = self.partsTV.selection() if len(selected) == 0: return try: if self.partsTV.parent(selected) != '': selected = self.partsTV.parent(selected) partnumber = self.partsTV.item( selected, "values")[self.column_id.index('DigiKeyPartNumber')] elements = self.partsTV.get_children(selected) self.parent.clipboard_clear() self.parent.clipboard_clear() for i in elements: element = self.partsTV.item(i, "values") self.parent.clipboard_append(element[0] + "\t" + element[1] + "\n") self.parent.update() self.status.set("All properties of " + partnumber + " copied to clipboard") except Exception as e: pass # deprecate def on_copy_element(self, event): try: selected = self.partsTV.selection()[0] if self.partsTV.parent(selected) == '': partnumber = self.partsTV.item elements = self.partsTV.get_children(selected) self.parent.clipboard_clear() for i in elements: element = self.partsTV.item(i, "values") self.parent.clipboard_append(element[0] + "\t" + element[1] + "\n") self.parent.update() self.status.set("All properties of " + self.partsTV.item(selected, "values")[3] + " copied to clipboard") else: key = self.partsTV.item(selected, "values")[0] val = self.partsTV.item(selected, "values")[1] self.parent.clipboard_clear() self.parent.clipboard_append(val) self.parent.update() self.status.set(key + " '" + val + "' copied to clipboard") except Exception as e: pass def do_find(self, event): try: self.on_find() except Exception as e: self.status.seterror(e)
class TextViewer(Toplevel): """A simple text viewer dialog for IDLE.""" def __init__(self, parent, title, text, modal=True, _htest=False, _utest=False): """Show the given text in a scrollable window with a 'close' button. If modal is left True, users cannot interact with other windows until the textview window is closed. parent - parent of this dialog title - string which is title of popup dialog text - text to display in dialog _htest - bool; change box location when running htest. _utest - bool; don't wait_window when running unittest. """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) self.geometry( '=%dx%d+%d+%d' % (750, 500, parent.winfo_rootx() + 10, parent.winfo_rooty() + (10 if not _htest else 100))) self.bg = '#ffffff' self.fg = '#000000' self.create_widgets() self.title(title) self.protocol('WM_DELETE_WINDOW', self.ok) self.parent = parent self.text.focus_set() self.bind('<Return>', self.ok) self.bind('<Escape>', self.ok) self.text.insert(0.0, text) self.text.config(state=DISABLED) if modal: self.transient(parent) self.grab_set() if not _utest: self.wait_window() def create_widgets(self): """Create Frame with Text (with vertical Scrollbar) and Button.""" frame = Frame(self, relief=SUNKEN, height=700) frame_buttons = Frame(self) self.button_ok = Button(frame_buttons, text='Close', command=self.ok, takefocus=False) self.scrollbar = Scrollbar(frame, orient=VERTICAL, takefocus=False) self.text = Text(frame, wrap=WORD, highlightthickness=0, fg=self.fg, bg=self.bg) self.scrollbar.config(command=self.text.yview) self.text.config(yscrollcommand=self.scrollbar.set) self.button_ok.pack() self.scrollbar.pack(side=RIGHT, fill=Y) self.text.pack(side=LEFT, expand=True, fill=BOTH) frame_buttons.pack(side=BOTTOM, fill=X) frame.pack(side=TOP, expand=True, fill=BOTH) def ok(self, event=None): """Dismiss text viewer dialog.""" self.destroy()
class Window(tk.Tk): def __init__(self): super(Window, self).__init__() self.conf = Config() self.analyser = Analyser(self.conf) self.theme = None # Respect PEP8 self.set_theme(self.conf.get("gui.tkinter.theme", "default")) self.title("PyCreator") self.state("zoomed") self.menu = tk.Menu(self) self.filemenu = FileMenu(self, self.menu) self.executemenu = ExecuteMenu(self, self.menu) self.codemenu = CodeMenu(self, self.menu) self.parametersmenu = ParametersMenu(self, self.menu) self.filesview = FilesWidget(self) self.tabeditor = TabEditorWidget(self) self.sh = Scrollbar() self.sv = Scrollbar() self.setup_ui() self.bind_event() self.protocol("WM_DELETE_WINDOW", self.on_close) self.mainloop() def bind_event(self): self.bind_all("<Control-KeyPress-o>", self.filemenu.open_file) self.bind_all("<Control-KeyPress-n>", self.filemenu.new) self.bind_all("<Control-KeyPress-i>", self.parametersmenu.open_info) self.bind_all("<Control-KeyPress-p>", self.parametersmenu.open_parameters) self.bind_all("<Control-KeyPress-s>", self.filemenu.save) self.bind_all("<Control-KeyPress-d>", self.filemenu.open_folder) self.bind_all("<Alt-KeyPress-c>", self.executemenu.console) self.bind_all("<Control-KeyPress-t>", self.codemenu.indenter) self.bind_all("<Alt-KeyPress-t>", self.codemenu.desindenter) self.bind_all("<KeyPress-F5>", self.executemenu.execute) def setup_ui(self): self.menu.add_cascade(label="Fichier", menu=self.filemenu) self.menu.add_cascade(label="Executer", menu=self.executemenu) self.menu.add_cascade(label="Code", menu=self.codemenu) self.menu.add_cascade(label="Paramètres", menu=self.parametersmenu) self.config(menu=self.menu) self.sh.config(orient="horizontal") self.filesview.grid(row=0, column=0, rowspan=2, sticky="news") self.tabeditor.grid(row=0, column=1, sticky="news") self.sh.grid(row=1, column=1, sticky="news") self.sv.grid(row=0, column=2, rowspan=2, sticky="news") self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=5) def set_theme(self, theme): self.theme = theme Style().theme_use(theme) def on_close(self): self.conf.set("folder", self.filesview.folder) self.conf.set("gui.tkinter.theme", self.theme) self.conf.save() self.destroy()
class ScrolledWindow(Frame): """ 1. Master widget gets scrollbars and a canvas. Scrollbars are connected to canvas scrollregion. 2. self.scrollwindow is created and inserted into canvas Usage Guideline: Assign any widgets as children of <ScrolledWindow instance>.scrollwindow to get them inserted into canvas __init__(self, parent, canv_w = 400, canv_h = 400, *args, **kwargs) docstring: Parent = master of scrolled window canv_w - width of canvas canv_h - height of canvas """ def __init__(self, parent, *args, **kwargs): """Parent = master of scrolled window canv_w - width of canvas canv_h - height of canvas """ super().__init__(parent, *args, **kwargs) self.parent = parent self.canv_w = kwargs.get("width", 10) self.canv_h = kwargs.get("height", 10) # creating a scrollbars self.yscrlbr = Scrollbar(self.parent) self.yscrlbr.grid(column=1, row=0, sticky='ns') # creating a canvas self.canv = Canvas(self.parent) self.canv.config(relief='flat', width=self.canv_w, heigh=self.canv_h, bd=2) # placing a canvas into frame self.canv.grid(column=0, row=0, sticky='nsew') # accociating scrollbar comands to canvas scroling self.yscrlbr.config(command=self.canv.yview) # creating a frame to inserto to canvas self.scrollwindow = Frame(self.parent) self.canv.create_window(0, 0, window=self.scrollwindow, anchor='nw') self.canv.config(yscrollcommand=self.yscrlbr.set, scrollregion=(0, 0, self.canv_w, self.canv_h)) self.yscrlbr.lift(self.scrollwindow) self.scrollwindow.bind('<Configure>', self._configure_window) self.scrollwindow.bind('<Enter>', self._bound_to_mousewheel) self.scrollwindow.bind('<Leave>', self._unbound_to_mousewheel) return def _bound_to_mousewheel(self, event): self.canv.bind_all("<MouseWheel>", self._on_mousewheel) def _unbound_to_mousewheel(self, event): self.canv.unbind_all("<MouseWheel>") def _on_mousewheel(self, event): self.canv.yview_scroll(int(-1 * (event.delta / 120)), "units") def _configure_window(self, event): # update the scrollbars to match the size of the inner frame size = (self.scrollwindow.winfo_reqwidth(), self.scrollwindow.winfo_reqheight()) try: self.canv.config(scrollregion='0 0 %s %s' % size) except: return if self.scrollwindow.winfo_reqwidth() != self.canv.winfo_width(): # update the canvas's width to fit the inner frame self.canv.config( width=min(self.scrollwindow.winfo_reqwidth(), self.canv_w)) s_h = self.scrollwindow.winfo_reqheight() if s_h != self.canv.winfo_height(): # update the canvas's width to fit the inner frame self.canv.config(height=min(s_h, self.canv_h))
class App(object): def __init__(self): self.win=Tk() self.win.geometry('405x380') self.win.title("网易云mp3播放下载器") self.creat_res() self.res_config() self.win.mainloop() def creat_res(self): self.music_temp=StringVar(value="(.)(.)") self.mp3_lis=[] #备用 self.temp=StringVar()#url输入框 self.temp2=IntVar() #单选框 播放或者下载 self.temp3=StringVar()#path 输入框 self.T_message=Listbox(self.win,background="#EEE9E9") self.B_search=Button(self.win,text="搜索") self.B_path=Button(self.win,text="选择目录") self.E_song=Entry(self.win,textvariable=self.temp) self.E_path=Entry(self.win,textvariable=self.temp3) self.Play_button=Button(self.win,text="播放") self.Pause_button=Button(self.win,textvariable=self.music_temp) self.Temp_button=Button(self.win,text="单曲下载") self.Stop_button=Button(self.win,text="停止") self.Info=Button(self.win,text="说明") self.More_down=Button(self.win,text="歌单批量下载") self.B_search_loacl=Button(self.win,text="扫描本地歌曲") self.S_bal=Scrollbar(self.win) self.R_1=Radiobutton(self.win,variable=self.temp2,text="下载",value=True) self.R_2=Radiobutton(self.win,variable=self.temp2,text="播放",value=False) self.L_mp3_message=Label(self.win,background="#EEE9E9",fg="#9370DB") self.B_search.place(x=340,y=5,width=50,height=30) self.E_song.place(x=10,y=10,width=300,height=35) self.T_message.place(x=10,y=165,width=280,height=200) self.Play_button.place(x=340,y=160,width=50,height=40) self.Pause_button.place(x=340,y=209,width=50,height=40) self.Temp_button.place(x=130,y=125,width=100,height=30) self.S_bal.place(x=286,y=165,width=20,height=200) self.E_path.place(x=10,y=70,width=200,height=40) self.B_path.place(x=230,y=75,width=60,height=38) self.L_mp3_message.place(x=241,y=125,width=152,height=30) self.Info.place(x=340,y=315,width=50,height=40) self.More_down.place(x=10,y=125,width=100,height=30) self.B_search_loacl.place(x=300,y=75,width=100,height=38) self.R_1.place(x=265,y=50,width=60,height=25) self.R_2.place(x=340,y=50,width=60,height=25) self.Stop_button.place(x=340,y=260,width=50,height=40) def res_config(self): self.B_search.config(command=self.get_lis) self.S_bal.config(command=self.T_message.yview) self.T_message["yscrollcommand"]=self.S_bal.set self.T_message.config(selectmode=BROWSE) self.B_path.config(command=self.choose_path) self.More_down.config(command=self.download_music) self.Info.config(command=self.show_mesage) self.Temp_button.config(command=self.single_music_down) self.Play_button.config(command=self.play_music) self.Pause_button.config(command=self.pause_button_click) self.Stop_button.config(command=self.stop_button_click) self.temp2.set(1) #默认配置为下载模式 def choose_path(self): self.path_=askdirectory() self.temp3.set(self.path_) def show_mesage(self): msg="输入框可识别歌单list,或者歌曲名称 '\n'" \ "输入歌单,请搜索后选择单独下载或者全部批量下载 '\n'" \ "播放单曲需要先选择路径,选择歌曲" messagebox.showinfo(message=msg,title="使用说明") def get_web_lis(self): if self.temp.get()!="":#输入框非空 flag = music_get.do_something(self.temp.get()) music_dic=music_get.get_music_id(self.temp.get()) if flag==True:#输入的是链接 mp3_url=music_get.get_mps_url(self.temp.get()) for i, j in mp3_url.items():#i是id号 self.T_message.insert(END,"歌曲:"+i+"\n") else:#如果输入的是单曲 self.T_message.insert(END, "正在查找歌曲:" + self.temp.get() + "\n") for id,name in music_dic.items(): self.T_message.insert(END, "找到歌曲:{}-{}".format(id,name)+ "\n") else: self.T_message.insert(END, "清输入歌曲名或者歌单链接:" + "\n") messagebox.showerror(title="警告",message="请输入歌名或者歌曲清单链接") def get_loacl_lis(self): for file in os.listdir(self.temp3.get()): self.T_message.insert(END, file + "\n") def get_lis(self):#搜索按钮,先判断下输入的是url 还是单曲 print("开关",self.temp2.get()) if self.temp2.get():#wen搜索 print("web搜索") self.get_web_lis() else: #本地搜所 print("本地搜索") self.get_loacl_lis() def download_music(self):#歌单批量下载 try: mp3_url = music_get.get_mps_url(self.temp.get())#mp3 清单表 字典 print(mp3_url) music_get.down_mp3(self.temp3.get(),self.temp.get()) flag = music_get.do_something(self.temp.get()) print(self.temp.get(),self.temp3.get()) if os.path.exists(self.temp3.get()) and flag==True and len(mp3_url)>0:#路径存在,输入连接,dic飞空 self.L_mp3_message.config(text="批量下载中,请不要再操作软件") for i in mp3_url.keys(): t=random.randint(100,300)*0.01 self.T_message.insert(END, "正在努力下载歌曲:" + i + "\n") time.sleep(t) else: self.T_message.insert(END, "请输入歌单连接和存储路径" + "\n") except Exception as s: print(s.args) self.T_message.insert(END, "请先输入歌单连接和存储路径" + "\n") messagebox.showerror(title="警告",message="请输入歌名或者歌曲清单链接") def get_id(self):#获取id号 if self.T_message.curselection():#不为空 s=self.T_message.curselection() res=self.T_message.get(s[0]) pa_id='找到歌曲:[\d]+-.+' if re.match(pa_id,res):#选择listbox id=res[res.find(":")+1:res.find("-")] return id else: self.T_message.insert(END, "请选择带id号的歌曲" + "\n") else: self.T_message.insert(END, "请先搜索歌名" + "\n") def single_music_down(self):#单曲下载 print("----------下载单曲----------") id=self.get_id() flag=music_get.do_something(self.temp.get())#判断是url 还是歌曲名字 如果是url true 否则f if os.path.exists(self.temp3.get()) and flag==False: try: music_get.down_music2(self.temp3.get(),id,self.temp.get()) self.T_message.insert(END, "正在下载歌曲:" +self.temp.get()+ str(id) + "\n") self.L_mp3_message.config(text="歌曲{}_{}下载完成".format(self.temp.get(),id)) except Exception: self.T_message.insert(END, "请选择带的ID号的歌曲:" + "\n") messagebox.showwarning(title="友情提示", message="请选择带的ID号的歌曲") else: self.T_message.insert(END, "erro,请选择存储路径:" + "\n") messagebox.showwarning(title="温馨提示",message="请先搜索歌曲再选择存储路径") def play_music(self): print("播放音乐") path=self.temp3.get()#路径 if os.path.exists(path) and self.temp2.get()==False:#如果路径存在,开关在播放模式 if self.T_message.curselection():#lisbox飞空 print("--------开始播放--------") music_file=self.T_message.get(self.T_message.curselection()) current_music_path=self.temp3.get()+"/"+music_file pa_music=".+[\.]mp3" if re.match(pa_music,music_file):#匹配mp3文件 print("文件识别OK") print(current_music_path) self.L_mp3_message.config(text="文件识别OK") self.play_music_mp3(current_music_path.strip()) #此处有坑,需要清除字符串换行符 self.music_temp.set("暂停") else: print("非mp3文件") self.L_mp3_message.config(text="非mp3文件") else: self.T_message.insert(END, "erro,请选择歌名:" + "\n") else: messagebox.showwarning(title="温馨提示",message="请选择歌曲路径,选择播放模式") def play_music_mp3(self,name):#播放音乐 pygame.init() pygame.mixer.music.load(name) pygame.mixer.music.play() time.sleep(12) # pygame.mixer.music.stop() def pause_button_click(self): if self.music_temp.get()=="暂停": pygame.mixer.music.pause() self.music_temp.set("继续") elif self.music_temp.get()=="继续": pygame.mixer.music.unpause() self.music_temp.set("暂停") def pause_music(self): print("暂停播放") pygame.mixer.music.pause() def stop_button_click(self): pygame.mixer.music.stop()
class HTMLWindow( tk.Toplevel, ChildBox ): """ """ def __init__( self, parentWindow, filename=None ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.__init__( {}, {} )").format( parentWindow, repr(filename) ) ) assert( parentWindow ) self.parentWindow, self.initialFilename = parentWindow, filename tk.Toplevel.__init__( self, self.parentWindow ) ChildBox.__init__( self, self.parentWindow ) self.protocol( "WM_DELETE_WINDOW", self.closeHTMLWindow ) self.title( 'HTMLWindow' ) self.genericWindowType = 'HTMLWindow' self.winType = 'HTMLWindow' self.moduleID = 'HTML' self.geometry( INITIAL_HTML_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_HTML_SIZE, MAXIMUM_HTML_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) self._showStatusBarVar = tk.BooleanVar() self._showStatusBarVar.set( True ) self._statusTextVar = tk.StringVar() self._statusTextVar.set( '' ) # first initial value self.createMenuBar() self.createToolBar() self.createContextMenu() if self._showStatusBarVar.get(): self.createStatusBar() self.viewMode = DEFAULT self.settings = None # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) #if 'textBox' in dir(self): # we have one already -- presumably a specialised one #halt # We have one already #else: # let's make one self.textBox = HTMLText( self, yscrollcommand=self.vScrollbar.set, state=tk.DISABLED ) self.textBox['wrap'] = 'word' self.textBox.pack( expand=tk.YES, fill=tk.BOTH ) self.vScrollbar.config( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardKeyboardBindings() self.textBox.bind( "<Button-1>", self.setFocus ) # So disabled text box can still do select and copy functions # Options for find, etc. self.optionsDict = {} self.optionsDict['caseinsens'] = True if filename: self.historyList = [ filename ] self.historyIndex = 1 # Number from the end (starting with 1) self.load( filename ) else: self.historyList = [] self.historyIndex = 0 # = None # end of HTMLWindow.__init__ def notWrittenYet( self ): errorBeep() showerror( self, _("Not implemented"), _("Not yet available, sorry") ) # end of HTMLWindow.notWrittenYet def createMenuBar( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.createMenuBar()") ) try: kBD = self.parentWindow.parentApp.keyBindingDict except AttributeError: kBD = self.parentApp.keyBindingDict self.menubar = tk.Menu( self ) #self['menu'] = self.menubar self.config( menu=self.menubar ) # alternative fileMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=fileMenu, label='File', underline=0 ) #fileMenu.add_command( label='New...', underline=0, command=self.notWrittenYet ) #fileMenu.add_command( label='Open...', underline=0, command=self.notWrittenYet ) #fileMenu.add_separator() #subfileMenuImport = tk.Menu( fileMenu ) #subfileMenuImport.add_command( label='USX', underline=0, command=self.notWrittenYet ) #fileMenu.add_cascade( label='Import', underline=0, menu=subfileMenuImport ) #subfileMenuExport = tk.Menu( fileMenu ) #subfileMenuExport.add_command( label='USX', underline=0, command=self.notWrittenYet ) #subfileMenuExport.add_command( label='HTML', underline=0, command=self.notWrittenYet ) #fileMenu.add_cascade( label='Export', underline=0, menu=subfileMenuExport ) #fileMenu.add_separator() fileMenu.add_command( label='Info...', underline=0, command=self.doShowInfo, accelerator=kBD['Info'][0] ) fileMenu.add_separator() fileMenu.add_command( label='Close', underline=0, command=self.doClose, accelerator=kBD['Close'][0] ) # close this window editMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=editMenu, label='Edit', underline=0 ) editMenu.add_command( label='Copy', underline=0, command=self.doCopy, accelerator=kBD['Copy'][0] ) editMenu.add_separator() editMenu.add_command( label='Select all', underline=0, command=self.doSelectAll, accelerator=kBD['SelectAll'][0] ) searchMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=searchMenu, label='Search', underline=0 ) searchMenu.add_command( label='Goto line...', underline=0, command=self.doGotoLine, accelerator=kBD['Line'][0] ) searchMenu.add_separator() searchMenu.add_command( label='Find...', underline=0, command=self.doFind, accelerator=kBD['Find'][0] ) searchMenu.add_command( label='Find again', underline=5, command=self.doRefind, accelerator=kBD['Refind'][0] ) viewMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=viewMenu, label='View', underline=0 ) viewMenu.add_checkbutton( label='Status bar', underline=0, variable=self._showStatusBarVar, command=self.doToggleStatusBar ) gotoMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=gotoMenu, label='Goto', underline=0 ) gotoMenu.add_command( label='Back', underline=0, command=self.doGoBackward ) gotoMenu.add_command( label='Forward', underline=0, command=self.doGoForward ) toolsMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=toolsMenu, label='Tools', underline=0 ) toolsMenu.add_command( label='Options...', underline=0, command=self.notWrittenYet ) windowMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=windowMenu, label='Window', underline=0 ) windowMenu.add_command( label='Bring in', underline=0, command=self.notWrittenYet ) helpMenu = tk.Menu( self.menubar, name='help', tearoff=False ) self.menubar.add_cascade( menu=helpMenu, underline=0, label='Help' ) helpMenu.add_command( label='Help...', underline=0, command=self.doHelp, accelerator=kBD['Help'][0] ) helpMenu.add_separator() helpMenu.add_command( label='About...', underline=0, command=self.doAbout, accelerator=kBD['About'][0] ) # end of HTMLWindow.createMenuBar def createContextMenu( self ): """ Can be overriden if necessary. """ try: kBD = self.parentWindow.parentApp.keyBindingDict except AttributeError: kBD = self.parentApp.keyBindingDict self.contextMenu = tk.Menu( self, tearoff=0 ) self.contextMenu.add_command( label="Copy", underline=0, command=self.doCopy, accelerator=kBD['Copy'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Select all", underline=7, command=self.doSelectAll, accelerator=kBD['SelectAll'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Find...", underline=0, command=self.doFind, accelerator=kBD['Find'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Close", underline=1, command=self.doClose, accelerator=kBD['Close'][0] ) self.bind( "<Button-3>", self.showContextMenu ) # right-click #self.pack() # end of HTMLWindow.createContextMenu def showContextMenu( self, event ): self.contextMenu.post( event.x_root, event.y_root ) # end of HTMLWindow.showContextMenu def createToolBar( self ): """ Designed to be overridden. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("This 'createToolBar' method can be overridden!") ) pass # end of HTMLWindow.createToolBar def createStatusBar( self ): """ Create a status bar containing only one text label at the bottom of the main window. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("createStatusBar()") ) Style().configure('HTMLStatusBar.TFrame', background='yellow') Style().configure( 'StatusBar.TLabel', background='white' ) #Style().map("Halt.TButton", foreground=[('pressed', 'red'), ('active', 'yellow')], #background=[('pressed', '!disabled', 'black'), ('active', 'pink')] ) self.statusBar = Frame( self, cursor='hand2', relief=tk.RAISED, style='HTMLStatusBar.TFrame' ) self.statusTextLabel = Label( self.statusBar, relief=tk.SUNKEN, textvariable=self._statusTextVar, style='StatusBar.TLabel' ) #, font=('arial',16,tk.NORMAL) ) self.statusTextLabel.pack( side=tk.LEFT, fill=tk.X ) # style='Halt.TButton', self.forwardButton = Button( self.statusBar, text='Forward', command=self.doGoForward ) self.forwardButton.pack( side=tk.RIGHT, padx=2, pady=2 ) self.backButton = Button( self.statusBar, text='Back', command=self.doGoBackward ) self.backButton.pack( side=tk.RIGHT, padx=2, pady=2 ) self.statusBar.pack( side=tk.BOTTOM, fill=tk.X ) #self.setReadyStatus() self.setStatus() # Clear it # end of HTMLWindow.createStatusBar def setStatus( self, newStatusText='' ): """ Set (or clear) the status bar text. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("setStatus( {} )").format( repr(newStatusText) ) ) #print( "SB is", repr( self._statusTextVar.get() ) ) if newStatusText != self._statusTextVar.get(): # it's changed #self.statusBarTextWidget['state'] = tk.NORMAL #self.statusBarTextWidget.delete( '1.0', tk.END ) #if newStatusText: #self.statusBarTextWidget.insert( '1.0', newStatusText ) #self.statusBarTextWidget['state'] = tk.DISABLED # Don't allow editing #self.statusText = newStatusText self._statusTextVar.set( newStatusText ) if self._showStatusBarVar.get(): self.statusTextLabel.update() # end of HTMLWindow.setStatus #def setWaitStatus( self, newStatusText ): #""" #Set the status bar text and change the cursor to the wait/hourglass cursor. #""" #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("setWaitStatus( {} )").format( repr(newStatusText) ) ) ##self.rootWindow.config( cursor='watch' ) # 'wait' can only be used on Windows #self.setStatus( newStatusText ) #self.update() ## end of HTMLWindow.setWaitStatus def setReadyStatus( self ): """ Sets the status line to "Ready" and sets the cursor to the normal cursor. """ self.setStatus( _("Ready") ) #self.config( cursor='' ) # end of HTMLWindow.setReadyStatus def doToggleStatusBar( self ): """ Display or hide the status bar. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("doToggleStatusBar()") ) if self._showStatusBarVar.get(): self.createStatusBar() else: self.statusBar.destroy() # end of HTMLWindow.doToggleStatusBar def load( self, filepath ): """ Loads the given HTML file into the window and also finds and sets the window title """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.load( {} )").format( filepath ) ) self.folderPath, self.filename = os.path.split( filepath ) with open( filepath, 'rt' ) as HTMLFile: fileContents = HTMLFile.read() match = re.search( '<title>(.+?)</title>', fileContents ) if match: #print( '0', repr(match.group(0)) ) # This includes the entire match, i.e., with the <title> tags, etc. #print( '1', repr(match.group(1)) ) # This is just the title title = match.group(1).replace( '\n', ' ' ).replace( '\r', ' ' ).replace( ' ', ' ' ) #print( "title", repr(title) ) self.title( title ) else: self.title( 'HTMLWindow' ) self.setAllText( fileContents ) # end of HTMLWindow.load def gotoLink( self, link ): """ Loads the given HTML file into the window and also finds and sets the window title """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.gotoLink( {} )").format( link ) ) if not os.path.isabs( link ): # relative filepath link = os.path.join( self.folderPath, link ) self.load( link ) self.historyList.append( link ) self.historyIndex = 1 # end of HTMLWindow.gotoLink def overLink( self, link ): """ Loads the given HTML file into the window and also finds and sets the window title """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.overLink( {} )").format( link ) ) self.setStatus( link ) # Display it # end of HTMLWindow.overLink def leaveLink( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.leaveLink()") ) self.setStatus() # Clear it # end of HTMLWindow.leaveLink def doGoForward( self ): """ """ if self.historyIndex > 1: self.historyIndex -= 1 self.load( self.historyList[ -self.historyIndex ] ) # end of BibleResourceWindow.doGoForward def doGoBackward( self ): """ """ if self.historyIndex < len( self.historyList ): self.historyIndex += 1 self.load( self.historyList[ -self.historyIndex ] ) # end of BibleResourceWindow.doGoBackward def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += "\nHelp for {}".format( self.winType ) helpInfo += "\n Keyboard shortcuts:" for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) # end of HTMLWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion aboutInfo += "\nInformation about {}".format( self.winType ) ab = AboutBox( self, self.genericWindowType, aboutInfo ) # end of HTMLWindow.doAbout def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeHTMLWindow() # end of HTMLWindow.doClose def closeHTMLWindow( self ): """ Called to finally and irreversibly remove this window from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("HTMLWindow.closeHTMLWindow()") ) try: cWs = self.parentWindow.parentApp.childWindows except AttributeError: cWs = self.parentApp.childWindows if self in cWs: cWs.remove( self ) self.destroy() else: # we might not have finished making our window yet if BibleOrgSysGlobals.debugFlag: print( exp("HTMLWindow.closeHTMLWindow() for {} wasn't in list").format( self.winType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentWindow.parentApp.setDebugText( "Closed HTML window" )
class RightTree(Frame): def get_size_in_pixels(self, text): """ Returns the length of the String 'text' in pixels. """ font = ft.Font() w = font.measure(text) return w def __init__(self, parent, dispatch_event): """ Builds the lower right tree, which informs the user about the metadata information. Initialisation creates a frame, a treeview and two scrollbars for the treeview element. On Inform, if there is a dataset selected it will build a Treeview with the metadata. """ super().__init__(parent) self.dispatch_event = dispatch_event self.tree = Treeview(self, columns=["value"], show="tree") #self.configure(height=1000) self.scrollbar_y = Scrollbar(self.tree, orient="vertical") self.scrollbar = Scrollbar(self.tree, orient="horizontal") self.scrollbar.config(command=self.tree.xview) self.scrollbar_y.config(command=self.tree.yview) self.tree.configure(yscrollcommand=self.scrollbar_y.set, xscrollcommand=self.scrollbar.set) self.tree.pack(fill="both", expand=True) self.scrollbar.pack(side="bottom", fill="x") self.scrollbar_y.pack(side="right", fill="y") self.pack(expand=1, fill='both') self.bind("<Configure>", self.on_resize) def on_resize(self, event): """ Sets the width of column 0 to an arbitrary, long enough value, to fix issue nr.005. """ self.scrollbar.config(command=self.tree.xview) self.scrollbar.pack(side="bottom", fill="x") self.tree.column(0, width=600) self.update() pass def inform(self, data): """ Inform function of the RightTree class. Loads available data. If there is a project, it clears the Treeview. If there is exactly 1 selection, it will build a tree with the metadata shown in it. If there is no selection or more than 1, it will show an appropriate message. """ project = data["project"] if project: # First delete everything - Selection might have changed self.tree.delete(*self.tree.get_children()) # 3 ifs : no selection, 1 selected, multiple selections sel = project.selection if len(sel) == 0: self.tree.column("#0", width=1100) self.tree.insert("", tkinter.END, "Project information", text="Please add and select a dataset") elif len(sel) == 1: index = sel[0] # For legacy reasons variable named name self.tree.insert("", tkinter.END, "Project information", text="Project information") self.tree.insert("Project information", tkinter.END, "Project Path", text="Path", values=[project.path]) self.tree.insert("", tkinter.END, "Dataset information", text="Dataset information") self.tree.insert("Dataset information", tkinter.END, "Dataset Path", text="Path", values=[project.datasets[index].path]) self.tree.insert( "Dataset information", tkinter.END, "Rows", text="Rows", values=[ len(project.datasets[index].data) ]) # example: 120000 rows with time from 0 to 59.9995 s. # HERE I AM textlines = textwrap.wrap( (project.datasets[index].metadata["Description"]), width=70) if textlines == []: textlines.append("No description given.") self.tree.insert("Dataset information", tkinter.END, "Dataset Description", text="Description", values=[textlines[0]]) if len(textlines) > 1: for i in range(1, len(textlines)): self.tree.insert("Dataset information", tkinter.END, "Dataset Description %d" % (i), text="", values=[textlines[i]]) self.tree.insert("", tkinter.END, "Method", text="Method") if project.datasets[index].metadata[ "Method"] == "HILDE-Homogeneous": self.tree.insert( "Method", tkinter.END, value=textwrap.wrap("HILDE (homogeneous noise)")) elif project.datasets[index].metadata[ "Method"] == "HILDE-Heterogeneous": self.tree.insert( "Method", tkinter.END, value=textwrap.wrap("HILDE (heterogeneous noise)")) elif project.datasets[index].metadata[ "Method"] == "JULES-Homogeneous": self.tree.insert( "Method", tkinter.END, value=textwrap.wrap("JULES (homogeneous noise)")) elif project.datasets[index].metadata[ "Method"] == "JSMURF-Homogeneous": self.tree.insert( "Method", tkinter.END, value=textwrap.wrap("JSMURF (homogeneous noise)")) else: self.tree.insert( "Method", tkinter.END, value=textwrap.wrap("JSMURF (heterogeneous noise)")) # Here i will go self.tree.insert("", tkinter.END, "Dataset parameters", text="Dataset parameters") self.tree.insert("Dataset parameters", tkinter.END, "Sampling rate in Hz", text="Sampling rate in Hz", values=project.datasets[index]. metadata["Sampling rate in Hz"]) self.tree.insert("Dataset parameters", tkinter.END, "Cut-off frequency in Hz", text="Cut-off frequency in Hz", values=[ project.datasets[index]. metadata["Cut-off frequency in Hz"] ]) self.tree.insert( "Dataset parameters", tkinter.END, "Filter type", text="Filter type", values=[project.datasets[index].metadata["Filter type"]]) if project.datasets[index].metadata[ "Method"] == "HILDE-Homogeneous": self.tree.insert( "Dataset parameters", tkinter.END, "Quantile 1", text="Quantile 1", values=["will be computed by MC simulation"]) self.tree.insert("Quantile 1", tkinter.END, "Significance level 1", text="Alpha1", values=[ project.datasets[index]. metadata["Significance level 1"] ]) # self.tree.insert("Quantile 1", tkinter.END, "Repetitions 1", text="Repetitions", values=[ # project.datasets[index].metadata["Repetitions"]]) self.tree.insert("Quantile 1", tkinter.END, "Repetitions ", text="Repetitions", values=[ project.datasets[index]. metadata["Repetitions_Hilde"] ]) self.tree.insert( "Dataset parameters", tkinter.END, "Quantile 2", text="Quantile 2", values=["will be computed by MC simulation"]) self.tree.insert("Quantile 2", tkinter.END, "Significance level 2", text="Alpha2", values=[ project.datasets[index]. metadata["Significance level 2"] ]) self.tree.insert("Quantile 2", tkinter.END, "Repetitions", text="Repetitions", values=[ project.datasets[index]. metadata["Repetitions_Hilde"] ]) elif project.datasets[index].metadata[ "Method"] == "HILDE-Heterogeneous": self.tree.insert( "Dataset parameters", tkinter.END, "Quantile 1", text="Quantile 1", values=["will be computed by MC simulation"]) self.tree.insert("Quantile 1", tkinter.END, "Significance level 1", text="Alpha1", values=[ project.datasets[index]. metadata["Significance level 1"] ]) self.tree.insert("Quantile 1", tkinter.END, "Repetitions ", text="Repetitions", values=[ project.datasets[index]. metadata["Repetitions_Hilde"] ]) self.tree.insert( "Dataset parameters", tkinter.END, "Quantile 2", text="Quantile 2", values=["will be computed by MC simulation"]) self.tree.insert("Quantile 2", tkinter.END, "Significance level 2", text="Alpha2", values=[ project.datasets[index]. metadata["Significance level 2"] ]) self.tree.insert("Quantile 2", tkinter.END, "Repetitions", text="Repetitions", values=[ project.datasets[index]. metadata["Repetitions_Hilde"] ]) elif project.datasets[index].metadata[ "Method"] == "JULES-Homogeneous": if project.datasets[index].metadata[ "Quantile_JULES_HOMOGENEOUS provided"]: self.tree.insert( "Dataset parameters", tkinter.END, "Quantile", text="Quantile", values=[ project.datasets[index]. metadata["Quantile_JULES_HOMOGENEOUS"] ]) else: self.tree.insert( "Dataset parameters", tkinter.END, "Quantile", text="Quantile", values=["will be computed by MC simulation"]) self.tree.insert("Quantile", tkinter.END, "Significance level", text="Alpha", values=[ project.datasets[index]. metadata["Significance level"] ]) self.tree.insert( "Quantile", tkinter.END, "Repetitions", text="Repetitions", values=[ project.datasets[index].metadata["Repetitions"] ]) elif project.datasets[index].metadata[ "Method"] == "JSMURF-Homogeneous": if project.datasets[index].metadata[ "Quantile_JSMURF_HOMOGENEOUS provided"]: self.tree.insert( "Dataset parameters", tkinter.END, "Quantile", text="Quantile", values=[ project.datasets[index]. metadata["Quantile_JSMURF_HOMOGENEOUS"] ]) else: self.tree.insert( "Dataset parameters", tkinter.END, "Quantile", text="Quantile", values=["will be computed by MC simulation"]) self.tree.insert("Quantile", tkinter.END, "Significance level", text="Alpha", values=[ project.datasets[index]. metadata["Significance level"] ]) self.tree.insert( "Quantile", tkinter.END, "Repetitions", text="Repetitions", values=[ project.datasets[index].metadata["Repetitions"] ]) else: self.tree.insert( "Dataset parameters", tkinter.END, "Quantile", text="Quantile", values=["will be computed by MC simulation"]) self.tree.insert("Quantile", tkinter.END, "Significance level", text="Alpha", values=[ project.datasets[index]. metadata["Significance level"] ]) self.tree.insert( "Quantile", tkinter.END, "Repetitions", text="Repetitions", values=[ project.datasets[index].metadata["Repetitions"] ]) maxw = 600 #600 for child in self.tree.get_children(): self.tree.see(child) w = self.get_size_in_pixels( str(self.tree.item(child)['values'])) if (w > maxw): maxw = w for grandchild in self.tree.get_children(child): self.tree.see(grandchild) w = self.get_size_in_pixels( str(self.tree.item(grandchild)['values'])) if (w > maxw): maxw = w for ggrandchild in self.tree.get_children(grandchild): self.tree.see(ggrandchild) w = self.get_size_in_pixels( str(self.tree.item(ggrandchild)['values'])) if (w > maxw): maxw = w self.tree.column(0, width=maxw) self.tree.column("#0", width=200, stretch=False) #200 else: self.tree.column("#0", width=1000) #1000 self.tree.insert( "", tkinter.END, "Project information", text= "Multiple Datasets have been selected, select single dataset to show project information." )
class App_test(object): def __init__(self, master, fuc): self.win = master self.win.title('12306火车票查询系统V2.6') curWidth = self.win.winfo_width() curHeight = self.win.winfo_height() scnWidth, scnHeight = self.win.maxsize() tmpcnf = '1130x600+500+300' # % ((scnWidth - curWidth) / 2, (scnHeight - curHeight) / 2) self.win.geometry(tmpcnf) self.creat_res() self.add_train_info() self.add_check_button() self.res_config(fuc) self.set_combox_defaut() self.train_message = {} # self.get_train_args() # self.win.mainloop() def creat_res(self): self.v = IntVar() # 车票查询 self.v.set(True) self.temp = StringVar() # 开始站 self.temp2 = StringVar() # 目的站 self.start_mon = StringVar() # 出发月 self.start_day = StringVar() # 出发日 self.start_year = StringVar() # 出啊年 self.La_start_end = Label(self.win, text="请输入出发地和目的地", fg="blue") self.E_startstation = Entry(self.win, textvariable=self.temp) self.E_endstation = Entry(self.win, textvariable=self.temp2) self.La_startstation = Label(self.win, text="出发站:") self.La_endstation = Label(self.win, text="目的站:") self.La_time = Label(self.win, text="请选择出发时间-年-月-日", fg="blue") self.B_search = Button(self.win, text="搜索") self.R_site = Radiobutton(self.win, text="车票查询", variable=self.v, value=True) self.R_price = Radiobutton(self.win, text="票价查询", variable=self.v, value=False) self.B_buy_tick = Button(self.win, text="购票") self.C_year = Combobox(self.win, textvariable=self.start_year) self.La_s = Label(self.win, text="--") self.C_mon = Combobox(self.win, textvariable=self.start_mon) self.La_s1 = Label(self.win, text="--") self.C_day = Combobox(self.win, textvariable=self.start_day) # 滚动条 self.S_move = Scrollbar(self.win) self.La_start_end.place(x=10, y=10, width=150, height=30) self.E_startstation.place(x=70, y=50, width=145, height=30) self.E_startstation.insert(10, "杭州东") self.E_endstation.place(x=70, y=100, width=145, height=30) self.E_endstation.insert(10, "南京南") self.La_startstation.place(x=10, y=50, width=50, height=30) self.La_endstation.place(x=10, y=100, width=50, height=30) self.La_time.place(x=0, y=140, width=190, height=30) self.C_year.place(x=10, y=180, width=70, height=30) self.La_s.place(x=80, y=180, width=20, height=30) self.C_mon.place(x=100, y=180, width=50, height=30) self.La_s1.place(x=150, y=180, width=20, height=30) self.C_day.place(x=170, y=180, width=50, height=30) self.B_search.place(x=10, y=220, width=80, height=40) self.S_move.place(x=1100, y=40, width=30, height=550) self.B_buy_tick.place(x=10, y=310, width=80, height=40) self.R_site.place(x=10, y=270, width=90, height=30) self.R_price.place(x=100, y=270, width=90, height=30) def res_config(self, fuc): localTime = time.localtime(int(time.time())) # 获取今年的年份 startTime = int(time.strftime("%Y", localTime)) # 2018 self.C_year.config( values=[x for x in range(startTime, startTime + 10)]) self.C_mon.config(values=["{:02d}".format(x) for x in range(1, 13)]) # 时间格式是2018-01-01 self.C_day.config(values=["{:02d}".format(x) for x in range(1, 32)]) self.B_search.config(command=fuc) self.S_move.config(command=self.tree.yview) self.tree.config(yscrollcommand=self.S_move.set) def add_train_info(self): lis_train = ["C" + str(x) for x in range(0, 15)] tuple_train = tuple(lis_train) self.tree = Treeview(self.win, columns=tuple_train, height=30, show="headings") self.tree.place(x=228, y=40, width=870, height=550) train_info = [ ' 车次 ', ' 出发/到达站', '出发/到达时间', '历时 ', '商/特座', '一等座', '二等座', '高软', '软卧', '动卧', '硬卧', '软座', '硬座', '无座', '其他' ] for i in range(0, len(lis_train)): self.tree.column(lis_train[i], width=len(train_info[i]) * 11, anchor='center') self.tree.heading(lis_train[i], text=train_info[i]) def add_check_button(self): self.v1 = IntVar() self.v2 = IntVar() self.v3 = IntVar() self.v4 = IntVar() self.v5 = IntVar() self.v6 = IntVar() self.v7 = IntVar() self.v1.set("T") self.Check_total = Checkbutton(self.win, text="全部车次", variable=self.v1, onvalue='T') self.Check_total.place(x=228, y=7, width=90, height=30) self.Check_total = Checkbutton(self.win, text="G-高铁", variable=self.v2, onvalue='T') self.Check_total.place(x=318, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="D-动车", variable=self.v3, onvalue='T') self.Check_total.place(x=398, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="Z-直达", variable=self.v4, onvalue='T') self.Check_total.place(x=478, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="T-特快", variable=self.v5, onvalue='T') self.Check_total.place(x=558, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="K-快速", variable=self.v6, onvalue='T') self.Check_total.place(x=638, y=7, width=70, height=30) self.Check_total = Checkbutton(self.win, text="其他", variable=self.v7, onvalue='T') self.Check_total.place(x=718, y=7, width=70, height=30) # 设置下拉框默认值 def set_combox_defaut(self): localTime = time.localtime(int(time.time())) mon = int(time.strftime("%m", localTime)) day = int(time.strftime("%d", localTime)) self.C_year.current(0) self.C_mon.current(mon - 1) self.C_day.current(day - 1)
class ChildWindow( tk.Toplevel, ChildBox ): """ """ def __init__( self, parentApp, genericWindowType ): """ The genericWindowType is set here, but the more specific winType is set later by the subclass. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.__init__( {} {} )").format( parentApp, repr(genericWindowType) ) ) assert( parentApp ) assert( genericWindowType in ('BibleResource','LexiconResource','TextEditor','BibleEditor',) ) self.parentApp, self.genericWindowType = parentApp, genericWindowType tk.Toplevel.__init__( self, self.parentApp ) ChildBox.__init__( self, self.parentApp ) self.protocol( "WM_DELETE_WINDOW", self.closeChildWindow ) self.geometry( INITIAL_RESOURCE_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_RESOURCE_SIZE, MAXIMUM_RESOURCE_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) self.createMenuBar() self.createToolBar() self.createContextMenu() self.viewMode = DEFAULT self.settings = None # Create a scroll bar to fill the right-hand side of the window self.vScrollbar = Scrollbar( self ) self.vScrollbar.pack( side=tk.RIGHT, fill=tk.Y ) #if 'textBox' in dir(self): # we have one already -- presumably a specialised one #halt # We have one already #else: # let's make one self.textBox = tk.Text( self, yscrollcommand=self.vScrollbar.set, state=tk.DISABLED ) self.textBox['wrap'] = 'word' self.textBox.pack( expand=tk.YES, fill=tk.BOTH ) self.vScrollbar.config( command=self.textBox.yview ) # link the scrollbar to the text box self.createStandardKeyboardBindings() self.textBox.bind( "<Button-1>", self.setFocus ) # So disabled text box can still do select and copy functions # Options for find, etc. self.optionsDict = {} self.optionsDict['caseinsens'] = True self.refreshTitle() # Must be in superclass # end of ChildWindow.__init__ def notWrittenYet( self ): errorBeep() showerror( self, _("Not implemented"), _("Not yet available, sorry") ) # end of ChildWindow.notWrittenYet def createMenuBar( self ): logging.critical( exp("PROGRAMMING ERROR: This 'createMenuBar' method MUST be overridden!") ) if BibleOrgSysGlobals.debugFlag: print( exp("This 'createMenuBar' method MUST be overridden!") ) halt def createContextMenu( self ): """ Can be overriden if necessary. """ self.contextMenu = tk.Menu( self, tearoff=0 ) self.contextMenu.add_command( label="Copy", underline=0, command=self.doCopy, accelerator=self.parentApp.keyBindingDict['Copy'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Select all", underline=7, command=self.doSelectAll, accelerator=self.parentApp.keyBindingDict['SelectAll'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Find...", underline=0, command=self.doFind, accelerator=self.parentApp.keyBindingDict['Find'][0] ) self.contextMenu.add_separator() self.contextMenu.add_command( label="Close", underline=1, command=self.doClose, accelerator=self.parentApp.keyBindingDict['Close'][0] ) self.bind( "<Button-3>", self.showContextMenu ) # right-click #self.pack() # end of ChildWindow.createContextMenu def showContextMenu( self, event ): self.contextMenu.post( event.x_root, event.y_root ) # end of ChildWindow.showContextMenu def createToolBar( self ): """ Designed to be overridden. """ #if BibleOrgSysGlobals.debugFlag and debuggingThisModule: #print( exp("This 'createToolBar' method can be overridden!") ) pass # end of ChildWindow.createToolBar def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += "\nHelp for {}".format( self.winType ) helpInfo += "\n Keyboard shortcuts:" for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) # end of ChildWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion aboutInfo += "\nInformation about {}".format( self.winType ) ab = AboutBox( self, self.genericWindowType, aboutInfo ) # end of ChildWindow.doAbout def doClose( self, event=None ): """ Called from the GUI. Can be overridden. """ self.closeChildWindow() # end of ChildWindow.doClose def closeChildWindow( self ): """ Called to finally and irreversibly remove this window from our list and close it. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("ChildWindow.closeChildWindow()") ) if self in self.parentApp.childWindows: self.parentApp.childWindows.remove( self ) self.destroy() else: # we might not have finished making our window yet if BibleOrgSysGlobals.debugFlag: print( exp("ChildWindow.closeChildWindow() for {} wasn't in list").format( self.winType ) ) try: self.destroy() except tk.TclError: pass # never mind if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Closed resource window" )
font=("times new roman", 15, "bold"), width=8) show_btn.place(x=807, y=10) ###################################### Table frame table_frame = Frame(text_fill, borderwidth="3", relief=GROOVE, bg="white") table_frame.place(x=10, y=55, height=560, width=905) scroll_x = Scrollbar(table_frame, orient=HORIZONTAL) scroll_y = Scrollbar(table_frame, orient=VERTICAL) login_table = Treeview(table_frame, columns=("aid", "eid", "name", "post", "status", "date", "time"), xscrollcommand=scroll_x.set, yscrollcommand=scroll_y.set) scroll_x.pack(side=BOTTOM, fill=X) scroll_y.pack(side=RIGHT, fill=Y) scroll_x.config(command=login_table.xview) scroll_y.config(command=login_table.yview) login_table.heading("aid", text="Attendance ID") login_table.heading("eid", text="Employee ID") login_table.heading('name', text="Name") login_table.heading("post", text="post") login_table.heading("status", text="Attendance Status") login_table.heading("date", text="Date") login_table.heading("time", text="Time") login_table['show'] = 'headings' login_table.column("aid", width=119) login_table.column("eid", width=119) login_table.column("name", width=119) login_table.column("post", width=119) login_table.column("status", width=119) login_table.column("date", width=119)
def __init__(self): ''' Constructor ''' self.root = Tk() self.root.title("DinnerLog") self.root.minsize(800, 600) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=3) # Ein Frame für alles, das mit Zutaten zu tun hat self.fr_zutaten = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Zutaten") self.fr_zutaten.grid_columnconfigure(0, weight=1) self.fr_zutaten.grid_rowconfigure(0, weight=1) self.fr_zutaten.grid(row=0, column=0, sticky="NSWE") self.lb_zutaten = Listbox(self.fr_zutaten) sb_zutaten = Scrollbar(self.lb_zutaten, orient=VERTICAL) self.lb_zutaten.configure(yscrollcommand=sb_zutaten.set) sb_zutaten.config(command=self.lb_zutaten.yview) sb_zutaten.pack(side="right", fill="both") self.lb_zutaten.grid(row=0, column=0, sticky="NSEW") self._addNeueZutatFrame() # Ein Frame in den alles, das mit Mahlzeiten zu tun hat, kommt self.fr_mahlzeit = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Mahlzeiten") self.fr_mahlzeit.grid_columnconfigure(0, weight=1) self.fr_mahlzeit.grid_rowconfigure(0, weight=1) self.fr_mahlzeit.grid(row=1, column=0, sticky="NSWE") self._addNeueMahlzeitFrame() self.lb_mahlzeiten = Listbox(self.fr_mahlzeit, selectmode=SINGLE) sb_mahlzeiten = Scrollbar(self.lb_mahlzeiten, orient=VERTICAL) sb_mahlzeiten.configure(command=self.lb_mahlzeiten.yview) self.lb_mahlzeiten.configure(yscrollcommand=sb_mahlzeiten.set) sb_mahlzeiten.pack(side="right", fill="both") self.lb_mahlzeiten.grid(row=0, column=0, sticky="NSEW") fr_neu_ok = Frame(self.fr_mahlzeit) fr_neu_ok.grid(row=1, column=0, columnspan=2, sticky="E") self.btn_neu = Button(fr_neu_ok, text="Neu") self.btn_neu.pack(side="left") self.btn_mahlzeit_als_zt = Button(fr_neu_ok, text="Als Zutat") self.btn_mahlzeit_als_zt.pack(anchor=E, side="right") self.btn_insert = Button(fr_neu_ok, text="Hinzufuegen") self.btn_insert.pack(anchor=E, side="right") self.btn_update = Button(fr_neu_ok, text="Update") self.btn_update.pack(anchor=E, side="right") self.btn_delete = Button(fr_neu_ok, text="Loeschen") self.btn_delete.pack(anchor=E, side="right") # Ein Frame der Statistiken darstellt self.fr_stats = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Statistik") self.fr_stats.grid(row=3, column=0, sticky="NSWE")
class App_test(object): def __init__(self, master, fuc, query, next, pre): self.win = master self.win.title('笔趣阁阅读_v1.0 by: 孤月') self.win.iconbitmap('./ico/gui_text_proce.ico') # 指定界面图标 curWidth = self.win.winfo_width() curHeight = self.win.winfo_height() scnWidth, scnHeight = self.win.maxsize() tmpcnf = '1340x640+500+300' # % ((scnWidth - curWidth) / 2, (scnHeight - curHeight) / 2) self.win.geometry(tmpcnf) self.creat_res() self.set_position() self.add_train_info() self.res_config(fuc, query, next, pre) self.train_message = {} self.gettime() # 系统时间 def creat_res(self): self.v = IntVar() # 书籍查询 self.v.set(True) self.temp = StringVar() # 书名/作者 录入 self.temp2 = StringVar() # 章节名录入 self.sys_time = StringVar() # 系统时间 self.E_startstation = Entry(self.win, textvariable=self.temp) self.E_endstation = Entry(self.win, textvariable=self.temp2) self.La_startstation = Label(self.win, text="根据书名/作者搜索:") self.La_endstation = Label(self.win, text="根据章节名搜索:") self.La_directory = Label(self.win, text="目录") self.La_text = Label(self.win, text="正文") self.La_sys_time = Label(self.win, textvariable=self.sys_time, fg='blue', font=("黑体", 20)) # 设置字体大小颜色 self.B_search = Button(self.win, text="搜索") self.B_buy_tick = Button(self.win, text="阅读") self.B_pre_chapter = Button(self.win, text="上一章") self.B_next_chapter = Button(self.win, text="下一章") self.R_site = Radiobutton(self.win, text="书名查询", variable=self.v, value=True) self.R_price = Radiobutton(self.win, text="章节查询", variable=self.v, value=False) self.init_data_Text = Text(self.win) # 原始数据录入框 self.S_move = Scrollbar(self.win) # 目录滚动条 self.S_text_move = Scrollbar(self.win) # 创建文本框滚动条 # 设置位置 def set_position(self): self.init_data_Text.place(x=430, y=40, width=870, height=550) self.E_startstation.place(x=10, y=50, width=145, height=30) self.E_startstation.insert(10, "星辰变") self.E_endstation.place(x=10, y=140, width=145, height=30) self.E_endstation.insert(10, "第一章 秦羽") self.La_startstation.place(x=10, y=10, width=130, height=30) self.La_endstation.place(x=10, y=100, width=120, height=30) self.La_sys_time.place(x=1150, y=600, width=160, height=30) self.B_search.place(x=10, y=220, width=80, height=40) self.B_pre_chapter.place(x=950, y=600, width=80, height=40) self.B_next_chapter.place(x=1050, y=600, width=80, height=40) self.S_move.place(x=380, y=40, width=30, height=550) self.S_text_move.place(x=1300, y=40, width=30, height=550) self.B_buy_tick.place(x=90, y=220, width=80, height=40) self.R_site.place(x=10, y=180, width=90, height=30) self.R_price.place(x=100, y=180, width=90, height=30) self.La_directory.place(x=180, y=7, width=90, height=30) self.La_text.place(x=420, y=7, width=70, height=30) # 为按钮绑定事件 def res_config(self, fuc, query, next_, pre): self.B_search.config(command=fuc) # 搜索 self.B_buy_tick.config(command=query) # 阅读 self.B_pre_chapter.config(command=pre) # 上一章 self.B_next_chapter.config(command=next_) # 下一章 self.S_move.config(command=self.tree.yview) # 目录滚动条 self.tree.config(yscrollcommand=self.S_move.set) self.S_text_move.config(command=self.init_data_Text.yview) # 文本框滚动条 self.init_data_Text.config(yscrollcommand=self.S_text_move.set) def add_train_info(self): lis_train = ["C" + str(x) for x in range(0, 2)] tuple_train = tuple(lis_train) self.tree = Treeview(self.win, columns=tuple_train, height=30, show="headings") self.tree.place(x=200, y=40, width=180, height=550) train_info = [' 书名 ', ' 作者 '] for i in range(0, len(lis_train)): self.tree.column(lis_train[i], width=len(train_info[i]) * 11, anchor='w') # must be n, ne, e, se, s, sw, w, nw, or center self.tree.heading(lis_train[i], text=train_info[i]) # 实时显示时钟 def gettime(self): # 获取当前时间 self.sys_time.set(time.strftime("%H:%M:%S")) # 每隔一秒调用函数自身获取时间 self.win.after(1000, self.gettime)
class MainApp(): def __init__(self): self.File_name = None self.Programe_Name = "CHE-Editor" self.WDG = Tk() self.WDG.title(self.Programe_Name) self.WDG.iconbitmap("icons/icon_editor.ico") self.WDG.geometry("860x620") self.WDG.maxsize(width=1340, height=700) self.WDG.minsize(width=860, height=620) self.Main_UI() def Main_UI(self): self.MenuBar = Menu(self.WDG) #1 #MenuBar #File_menu self.File_menu = Menu(self.MenuBar, tearoff=0, title="File") self.MenuBar.add_cascade(label="File", menu=self.File_menu) #Edit_menu self.Edit_menu = Menu(self.MenuBar, tearoff=0, title="Edit") self.MenuBar.add_cascade(label="Edit", menu=self.Edit_menu) #View_menu self.View_menu = Menu(self.MenuBar, tearoff=0, title="View") self.MenuBar.add_cascade(label="View", menu=self.View_menu) #Theme_menu in View self.Theme_menu = Menu(self.View_menu, tearoff=0, title="Theme") self.View_menu.add_cascade(label="Theme", menu=self.Theme_menu) #Option_menu self.Options_menu = Menu(self.MenuBar, tearoff=0, title="Options") self.MenuBar.add_cascade(label="Options", menu=self.Options_menu) #Help_menu self.Help_menu = Menu(self.MenuBar, tearoff=0, title="Help") self.MenuBar.add_cascade(label="Help", menu=self.Help_menu) #2 #Icons Variables #Edit_Menu Icons Undo = PhotoImage(file="icons/Undo.gif") Redo = PhotoImage(file="icons/redo.gif") Paste = PhotoImage(file="icons/paste.gif") Copy = PhotoImage(file="icons/copy.gif") Cut = PhotoImage(file="icons/cut.gif") #Help_Menu_Icons Help = PhotoImage(file="icons/help.gif") About = PhotoImage(file="icons/about.gif") #File_Menu_Icons New = PhotoImage(file="icons/new.gif") Open = PhotoImage(file="icons/open.gif") Save = PhotoImage(file="icons/save.gif") Save_As = PhotoImage(file="icons/save_as.gif") Exit = PhotoImage(file="icons/exit.gif") #Appear menubar in app self.WDG.config(menu=self.MenuBar) #self.WDG.config(menu=self.IconBar) #3 #Set commands in menus #File_Menu self.File_menu.add_command(label="New", accelerator="Ctrl+N", compound="left", underline=0, command=self.New) self.File_menu.add_command(label="Open", accelerator="Ctrl+O", compound="left", underline=0, command=self.Open) self.File_menu.add_command(label="Save", accelerator="Ctrl+S", compound="left", underline=0, command=self.Save) self.File_menu.add_command(label="Save as", accelerator="Shift+Ctrl+S", compound="left", underline=0, command=self.Save_As) self.File_menu.add_separator() self.File_menu.add_command(label="Exit", accelerator="F4", compound="left", underline=0, command=self.Exit) #Edit_Menu self.Edit_menu.add_command(label="Undo", accelerator="Ctrl+Z", compound="left", underline=0, command=self.Undo) self.Edit_menu.add_command(label="Redo", accelerator='Ctrl+Y', compound='left', underline=0, command=self.Redo) self.Edit_menu.add_command(label="Select all", accelerator='Ctrl+A', compound='left', underline=0, command=self.Select) self.Edit_menu.add_command(label="Cut", accelerator='Ctrl+X', compound='left', underline=7, command=self.Cut) self.Edit_menu.add_command(label="Copy", accelerator='Ctrl+C', compound='left', underline=0, command=self.Copy) self.Edit_menu.add_command(label="Paste", accelerator='Ctrl+V', compound='left', underline=0, command=self.Paste) self.Edit_menu.add_command(label="Search", accelerator='Ctrl+F', compound='left', underline=0, command=self.Search) #Help_Menu self.Help_menu.add_command(label="Help", accelerator="F1", compound="left", underline=0, command=self.Help) self.Help_menu.add_command(label="About", compound="left", underline=0, command=self.About) #View_Menu self.Show_line_number = IntVar() self.Show_line_number.set(1) self.theme_name = StringVar() self.View_menu.add_checkbutton(label="Show Line Number", variable=self.Show_line_number) self.Highlightline = BooleanVar() self.View_menu.add_checkbutton(label='Highlight Current Line', onvalue=1, offvalue=0, variable=self.Highlightline, command=self.Toggle_highlight) self.cursorcoord = BooleanVar() self.View_menu.add_checkbutton(label='Show Cursor Location', variable=self.cursorcoord, command=self.Show_cursor_coord) self.Theme_menu.add_radiobutton(label="Default", variable=self.theme_name) #4 #add Shortcut_Bar & Row_Number_Bar #Shortcut_Bar self.Shortcut_Bar = Frame(self.WDG, height=25) self.Shortcut_Bar.pack(expand='no', fill='x') Icons = ['New', 'Open', 'Save', 'Copy', 'Cut', 'Paste', 'Undo', 'Redo'] for i, icon in enumerate(Icons): Tool_icon = PhotoImage(file='icons/{}.gif'.format(icon)) #c_var = 'self.{}'.format(icon) cmd = eval('self.{}'.format(icon)) self.Tool_bar_btn = Button(self.Shortcut_Bar, image=Tool_icon, command=cmd) self.Tool_bar_btn.image = Tool_icon self.Tool_bar_btn.pack(side='left') #Row_Number_Bar self.Row_Number_Bar = Text(self.WDG, width=3, padx=3, takefocus=0, border=0, background='khaki', state='disabled', wrap='none') self.Row_Number_Bar.pack(side='left', fill='y') #5 #add Content_Text self.Content_Text = Text(self.WDG, wrap='word', undo=1) self.Content_Text.pack(expand='yes', fill='both') self.Content_Text.tag_configure('active_line', background='ivory2') self.Scroll_Bar = Scrollbar(self.Content_Text) self.Content_Text.configure(yscrollcommand=self.Scroll_Bar.set) self.Scroll_Bar.config(command=self.Content_Text.yview) self.Scroll_Bar.pack(side='right', fill='y') #6 #add_Cursor_Coord_Bar self.Cursor_Coord_Bar = Label(self.Content_Text, text='Row: 1 | Column: 1') self.Cursor_Coord_Bar.pack(fill=None, expand='no', side='right', anchor='se') #7 #Binding self.Content_Text.bind("<Control-o>", self.Open) self.Content_Text.bind("<Control-O>", self.Open) self.Content_Text.bind("<Control-s>", self.Save) self.Content_Text.bind("<Control-S>", self.Save) self.Content_Text.bind("<Shift-Control-KeyPress-s>", self.Save_As) self.Content_Text.bind("<Shift-Control-KeyPress-S>", self.Save_As) self.Content_Text.bind("<Control-n>", self.New) self.Content_Text.bind("<Control-N>", self.New) self.Content_Text.bind("<Control-z>", self.Undo) self.Content_Text.bind("<Control-Z>", self.Undo) self.Content_Text.bind("<Control-y>", self.Redo) self.Content_Text.bind("<Control-Y>", self.Redo) self.Content_Text.bind("<Control-x>", self.Cut) self.Content_Text.bind("<Control-X>", self.Cut) self.Content_Text.bind("<Control-a>", self.Select) self.Content_Text.bind("<Control-A>", self.Select) self.Content_Text.bind("<Control-c>", self.Copy) self.Content_Text.bind("<Control-C>", self.Copy) self.Content_Text.bind("<Control-v>", self.Paste) self.Content_Text.bind("<Control-V>", self.Paste) self.Content_Text.bind("<Control-f>", self.Search) self.Content_Text.bind("<Control-F>", self.Search) self.Content_Text.bind("<Any-KeyPress>", self.Content_changed) self.WDG.bind_all("<KeyPress-F1>", self.Help) self.WDG.bind_all("<KeyPress-F4>", self.Exit) #8 #Built In Finctions #File_Menu_Functions def New(self, event=None): self.Content_Text.delete(1., 'end') self.WDG.title('{} - {}'.format('Untitled', self.Programe_Name)) ## def Open(self, event=None): self.Open_file_name = filedialog.askopenfilename( defaultextension=".txt", filetypes=[("All Files", "*.*"), ("Text Documents", "*.txt")]) if self.Open_file_name: self.File_name = self.Open_file_name self.WDG.title("{} - {}".format(os.path.basename(self.File_name), self.Programe_Name)) self.Content_Text.delete(1.0, 'end') with open(self.File_name) as _File: self.Content_Text.insert(1.0, _File.read()) ## def Save(self, event=None): if not self.File_name: self.Save_As() else: self.Write_to_file(self.File_name) return "break" ## def Save_As(self, event=None): self.Save_file_name = filedialog.asksaveasfilename( defaultextension='.txt', filetypes=[('All Files', '*.*'), ('Text Documents', '*.txt')]) if self.Save_file_name: self.File_name = self.Save_file_name self.Write_to_file(self.File_name) self.WDG.title('{} - {}'.format(os.path.basename(self.File_name), self.Programe_Name)) return "break" ## def Write_to_file(self, filename): try: self.content = self.Content_Text.get(1.0, 'end') with open(self.File_name, 'w') as the_file: the_file.write(self.content) except IOError as er: print(er) ## def Exit(self, event=None): self.msg_exit = messagebox.askyesno('Exit Editor', 'Do you want to exit?') if self.msg_exit: self.WDG.destroy() #Edit_Menu_Functions ## def Select(self, event=None): self.Content_Text.tag_add("sel", 1.0, "end") print("Done1") return "breake" ## def Cut(self, event=None): self.Content_Text.event_generate("<<Cut>>") return "breake" ## def Copy(self, event=None): self.Content_Text.event_generate("<<Copy>>") return "breake" ## def Paste(self, event=None): self.Content_Text.event_generate("<<Paste>>") return "breake" ## def Undo(self, event=None): self.Content_Text.event_generate("<<Undo>>") return "breake" ## def Redo(self, event=None): self.Content_Text.event_generate("<<Redo>>") return "breake" ## def Search(self, event=None): self.Search_Window = Toplevel(self.WDG) self.Search_Window.title("Search About...") self.Search_Window.transient(self.WDG) self.Search_Window.resizable(False, False) self.S_lbl_1 = Label(self.Search_Window, text='Search About :') self.S_lbl_1.grid(row=0, column=0, sticky='e') self.S_ent_1 = Entry(self.Search_Window, width=28) self.S_ent_1.grid(row=0, column=1, padx=2, pady=2, sticky='we') self.S_ent_1.focus_set() Ignore_case_value = IntVar() self.S_chk_1 = Checkbutton(self.Search_Window, text='Ignor Case', variable=Ignore_case_value) self.S_chk_1.grid(row=1, column=1, padx=2, pady=2, sticky='e') self.S_btn_1 = Button( self.Search_Window, text='Find', underline=0, command=lambda: self.Search_results(self.S_ent_1.get( ), Ignore_case_value.get(), self.Content_Text, self.Search_Window, self.S_ent_1)) self.S_btn_1.grid(row=0, column=2, padx=2, pady=2, sticky='e' + 'w') self.S_btn_2 = Button(self.Search_Window, text='Cancel', underline=0, command=self.Close_Search_Window) self.S_btn_2.grid(row=1, column=2, padx=2, pady=2, sticky='e' + 'w') ## def Search_results(self, Keyword, IfIgnoreCase, Content, Output, Input): Content.tag_remove('match', '1.0', 'end') matches_found = 0 if Keyword: start_pos = '1.0' while True: start_pos = Content.search(Keyword, start_pos, nocase=IfIgnoreCase, stopindex='end') if not start_pos: break end_pos = "{} + {}c".format(start_pos, len(Keyword)) Content.tag_add('match', start_pos, end_pos) matches_found += 1 start_pos = end_pos Content.tag_config('match', foreground='red', background='yellow') Input.focus_set() Output.title("{} matches found".format(matches_found)) ## def Close_Search_Window(self): self.Content_Text.tag_remove('match', '1.0', 'end') self.Search_Window.destroy() #self.Search_Window.protocol('WM_DELETE_WINDOW',self.Close_Search_Window) return "break" #View_Menu_Functions ## def Content_changed(self, event=None): self.Update_line_numbers() self.Update_cursor_coord() ## def Get_line_numbers(self, event=None): self.Number = "" if self.Show_line_number.get(): self.Row, self.Column = self.Content_Text.index('end').split('.') for i in range(1, int(self.Row)): self.Number += str(i) + "\n" return self.Number ## def Update_line_numbers(self): self.Line_Number = self.Get_line_numbers() self.Row_Number_Bar.config(state='normal') self.Row_Number_Bar.delete(1.0, 'end') self.Row_Number_Bar.insert(1.0, self.Line_Number) self.Row_Number_Bar.config(state='disabled') ## def Toggle_highlight(self, event=None): if self.Highlightline.get(): self.Highlight_line() else: self.Undo_highlight() ## def Highlight_line(self, interval=100): self.Content_Text.tag_remove('active_line', 1.0, 'end') self.Content_Text.tag_add('active_line', "insert linestart", "insert lineend+1c") self.Content_Text.after(interval, self.Toggle_highlight) ## def Undo_highlight(self): self.Content_Text.tag_remove('active_line', 1.0, 'end') ## def Show_cursor_coord(self): self.cursor_coord_checked = self.cursorcoord.get() if self.cursor_coord_checked: self.Cursor_Coord_Bar.pack(expand='no', fill=None, side='right', anchor='se') else: self.Cursor_Coord_Bar.pack_forget() ## def Update_cursor_coord(self): self.Row_2, self.Column_2 = self.Content_Text.index('insert').split( '.') self.row_num, self.col_num = str(int( self.Row_2)), str(int(self.Column_2) + 1) self.Coord = "Row: {} | Column: {}".format(self.row_num, self.col_num) self.Cursor_Coord_Bar.config(text=self.Coord) #Help_Menu_Functions ## def About(self, event=None): messagebox.showinfo( 'About', '{} {}'.format(self.Programe_Name, '\nDeveloped by \n TaReK')) ## def Help(self, event=None): messagebox.showinfo('Help', 'Text Editor building in python', icon='question')
def __init__(self): Tk.__init__(self) self.wm_title("BioInfo : comparaison des listes") self.resizable(width=FALSE, height=FALSE) self.SortDir = False # Lists Types self.typeList1 = None self.typeList2 = None # Frame content self.frameContent = Frame(self) self.frameContent.pack(side=TOP, fill=X) # ScrollBar scrollbar = Scrollbar(self.frameContent, orient=VERTICAL) scrollbar.pack(side=RIGHT, fill=Y) # Result Content self.dataCols = ('microArn_A', 'microArn_B', 'FoldC', 'p-Value', 'Note') self.tree = Treeview(self.frameContent, columns=self.dataCols, show = 'headings', yscrollcommand=scrollbar.set) # configure column headings for c in self.dataCols: self.tree.heading(c, text=c, command=lambda c=c: self.columnSort(c, self.SortDir)) self.tree.column(c, width=10) self.tree.pack(side=LEFT, fill=X, expand="yes") scrollbar.config(command=self.tree.yview) # Frame Lists self.frameLists = Frame(self) self.frameLists.pack(side=LEFT) # Frame Forms self.frameForms = Frame(self) self.frameForms.pack(side=LEFT, padx=20) #Liste n°1 selection self.frameList1 = Frame(self.frameLists) self.frameList1.pack() self.typeListStr1 = StringVar(self.frameList1) self.typeListStr1.set(str(ListBioType.TypeA)) self.buttonTypeList1 = OptionMenu(self.frameList1, self.typeListStr1, str(ListBioType.TypeA), str(ListBioType.TypeB)).pack(side=LEFT) self.entrylist1 = Entry(self.frameList1, width=30) self.entrylist1.pack(side=LEFT) self.buttonBrowseList1 = Button(self.frameList1, text="Parcourir", command=self.load_fileList1, width=10) self.buttonBrowseList1.pack(side=LEFT, padx=5) # List n°2 selection self.frameList2 = Frame(self.frameLists) self.frameList2.pack(side=BOTTOM) self.typeListStr2 = StringVar(self.frameList2) self.typeListStr2.set(str(ListBioType.TypeB)) self.buttonTypeList2 = OptionMenu(self.frameList2, self.typeListStr2, str(ListBioType.TypeA), str(ListBioType.TypeB)).pack(side=LEFT) self.entrylist2 = Entry(self.frameList2, width=30) self.entrylist2.pack(side=LEFT) self.buttonBrowseList2 = Button(self.frameList2, text="Parcourir", command=self.load_fileList2, width=10) self.buttonBrowseList2.pack(side=LEFT, padx=5) # Form pValue self.framePVal = Frame(self.frameForms) self.framePVal.pack() Label(self.framePVal, text="pValue").pack(side=LEFT) self.entryPVal = Entry(self.framePVal, width=6) self.entryPVal.pack(side=LEFT) # Form foldC self.frameFoldC = Frame(self.frameForms) self.frameFoldC.pack() Label(self.frameFoldC, text="foldCh").pack(side=LEFT) self.entryFoldC = Entry(self.frameFoldC, width=6) self.entryFoldC.pack(side=LEFT) # Form note self.frameNote = Frame(self.frameForms) self.frameNote.pack() Label(self.frameNote, text="note ").pack(side=LEFT) self.entryNote = Entry(self.frameNote, width=6) self.entryNote.pack(side=LEFT) # Bouton comparer self.buttonComparer = Button(self, text="Comparer", command=self.compare, width=10, state=DISABLED) self.buttonComparer.pack(fill= X, expand="yes", padx=20, pady=(10,0)) #Bouton exporter self.buttonExport = Button(self, text="Exporter", command=self.export, width=10, state=DISABLED) self.buttonExport.pack(fill= X, expand="yes", padx=20) # Réinitialiser self.buttonReset = Button(self, text="Réinitialiser", command=self.reset, width=10) self.buttonReset.pack(fill= X, expand="yes", padx=20, pady=(0,10)) # file members self.list1 = None self.list2 = None