def initUI(self): self.master.title("Review") self.pack(fill=BOTH, expand=True) frame1 = Frame(self) frame1.pack(fill=X) lbl1 = Label(frame1, text="Title", width=6) lbl1.pack(side=LEFT, padx=5, pady=5) entry1 = Entry(frame1) entry1.pack(fill=X, padx=5, expand=True) frame2 = Frame(self) frame2.pack(fill=X) lbl2 = Label(frame2, text="Author", width=6) lbl2.pack(side=LEFT, padx=5, pady=5) entry2 = Entry(frame2) entry2.pack(fill=X, padx=5, expand=True) frame3 = Frame(self) frame3.pack(fill=BOTH, expand=True) lbl3 = Label(frame3, text="Review", width=6) lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5) txt = Text(frame3) txt.pack(fill=BOTH, pady=5, padx=5, expand=True)
def add_entry(self, text): entry = Entry(self) entry.insert(0, ",".join(text)) entry.pack(fill="both", expand=True) entry.config(state="readonly") self.bindings(entry) self.entries.append(entry)
def initUI(self): self.parent.title("Form Demo - root=Tk()") self.pack(fill=BOTH, expand=True) #--------1st frame-------------------- frame1 = Frame(self) frame1.pack(fill=X) lbl1 = Label(frame1, text="Title", width=6) lbl1.pack(side=LEFT, padx=5, pady=5) entry1 = Entry(frame1) entry1.pack(fill=X, padx=5, expand=True) #--------2st frame--------------------- frame2 = Frame(self) frame2.pack(fill=X) lbl2 = Label(frame2, text="Author", width=6) lbl2.pack(side=LEFT, padx=5, pady=5) entry2 = Entry(frame2) entry2.pack(fill=X, padx=5, expand=True) # --------3st frame--------------------- frame3 = Frame(self) frame3.pack(fill=BOTH, expand=True) lbl3 = Label(frame3, text="Review", width=6) lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5) txt = Text(frame3) txt.pack(fill=BOTH, pady=5, padx=5, expand=True)
def initItems(self): """Create kinda complex layout, using a pack manager""" # Create and show the first frame. frame1 = Frame(self, relief=RAISED, borderwidth=1) frame1.pack(fill=X) # Add a label to first frame [frame1] lbl1 = Label(frame1, text='frame1 child', width=6) lbl1.pack(fill=X, padx=5, expand=True) # (fill=x) overrides previous (justify=CENTER) # Add an entry to first frame [frame1] entry1 = Entry(frame1) entry1.pack(side=LEFT, padx=5, pady=5) # default [side=CENTER] # Create and show the second frame frame2 = Frame(self, relief=RAISED, borderwidth=1) frame2.pack(fill=X) # Add a label to second frame [frame2] lbl2 = Label(frame2, text='frame2 child', width=14) lbl2.pack(side=RIGHT, padx=5, pady=5) # Add an entry to second frame [frame2] entry2 = Entry(frame2) entry2.pack(side=RIGHT, padx=5, pady=5) # Create and show the third frame frame3 = Frame(self, relief=RAISED, borderwidth=1) frame3.pack(fill=BOTH, expand=True) # Add a label and text widgets to the third frame lbl3 = Label(frame3, text='frame3 child', width=6) lbl3.pack(anchor=N, padx=5, pady=5) txt = tkinter.Text(frame3) txt.pack(fill=BOTH, pady=5, padx=5, expand=True)
class Form(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.parent.title("Example Form") self.pack(fill=BOTH, expand=True) f = Frame(self) f.pack(fill=X) l = Label(f, text='First Name', width=10) l.pack(side=LEFT, padx=5, pady=5) self.firstName = Entry(f) self.firstName.pack(fill=X, padx=5, expand=True) f = Frame(self) f.pack(fill=X) l = Label(f, text='Last Name', width=10) l.pack(side=LEFT, padx=5, pady=5) self.lastName = Entry(f) self.lastName.pack(fill=X, padx=5, expand=True) f = Frame(self) f.pack(fill=X) l = Label(f, text='Full Name', width=10) l.pack(side=LEFT, padx=5, pady=5) self.fullName = Label(f, text='ALEX POOPKIN', width=10) self.fullName.pack(fill=X, padx=5, expand=True) f = Frame(self) f.pack(fill=X) l = Label(f, text='', width=10) l.pack(side=LEFT, padx=5, pady=0) self.errorMessage = Label(f, text='Invalid character int the name!', foreground='red', width=30) self.errorMessage.pack(fill=X, padx=5, expand=True) f = Frame(self) f.pack(fill=X) b = Button(f, text='Close', command=lambda : self.parent.quit()) b.pack(side=RIGHT, padx=5, pady=10) b['default'] = ACTIVE b.focus_set() self.clearButton = Button(f, text='Clear') self.clearButton.pack(side=RIGHT, padx=5, pady=10) self.clearButton['state'] = DISABLED self.sendButton = Button(f, text='Send') self.sendButton.pack(side=RIGHT, padx=5, pady=10)
class DateWidget(Frame): """Gets a date from the user.""" def __init__(self, master): """Make boxes, register callbacks etc.""" Frame.__init__(self, master) self.label = Label(self, text="När är du född?") self.label.pack() self.entry_text = StringVar() self.entry_text.trace("w", lambda *args: self.onEntryChanged()) self.entry = Entry(self, width=date_entry_width, textvariable=self.entry_text) self.entry.insert(0, "ÅÅÅÅ-MM-DD") self.entry.pack(pady=small_pad) self.button = Button(self, text="Uppdatera", command=lambda: self.onDateChanged()) self.button.pack() self.entry.focus_set() self.entry.select_range(0, END) self.entry.bind("<Return>", lambda x: self.onDateChanged()) def setListener(self, pred_view): """Select whom to notify when a new date is entered.""" self.pred_view = pred_view def onDateChanged(self): """Notifies the PredictionWidget that the date has been changed.""" try: date = datetime.datetime.strptime(self.entry.get(), "%Y-%m-%d").date() self.pred_view.update(date) except ValueError: self.entry.configure(foreground="red") def onEntryChanged(self): """Reset the text color.""" self.entry.configure(foreground="")
def __init__(self, **kwargs) -> None: super().__init__(**kwargs) Events.TEST_BUTTON.bind(self, self.test_handler) for i in range(50): nl = Label(self.scrolled_frame, text='Label {}'.format(i)) e = Entry(self.scrolled_frame) nl.pack() e.pack()
def insert_entry_field(self, txt): frame = Frame(self.frame) frame.pack(fill="x") label = Label(frame, text=txt, width=6) label.pack(side="left", anchor="n", padx=5, pady=5) entry = Entry(frame) entry.pack(fill="x", padx=5, pady=5, expand=True) self.entries["Entry"][txt] = entry
def customDate(): def displayCustomDate(date): enterDateBox.destroy() print("Start listing songs from: " + date + ".") try: chart = billboard.ChartData("hot-100", date) label1 = str("1. " + str(chart[0])) label2 = str("2. " + str(chart[1])) label3 = str("3. " + str(chart[2])) label4 = str("4. " + str(chart[3])) label5 = str("5. " + str(chart[4])) topSong1.set(label1) topSong2.set(label2) topSong3.set(label3) topSong4.set(label4) topSong5.set(label5) chart_date.set("Chart data date: " + date) print("Done listing songs from: " + date + ".") except Exception as e: logDump(e) messagebox.showerror( "Out of range date", "Check your dates again. It could be due to:\n-Date too long in the past (before BillBoard charts existed)\-" ) def cancelDialog(): enterDateBox.destroy() date_object = datetime.now() formatted_date = "Chart data date: " + date_object.strftime( '%Y-%m-%d') chart_date.set(formatted_date) enterDateBox = Toplevel(billpy_window) enterDateBox.grab_set() enterDateBox.title("Custom date entry") enterDateBox.focus_set() enterDate_msg = Label(enterDateBox, text="Enter the date below (YYYY-MM-DD):", font=("Segoe UI", 10)) enterDate_entry = Entry(enterDateBox) enterDate_entry.focus_set() enterDate_confirm = Button( enterDateBox, text="OK", command=lambda: displayCustomDate(enterDate_entry.get())) enterDate_confirm.bind( "<Return>", lambda: displayCustomDate(enterDate_entry.get())) enterDate_cancel = Button(enterDateBox, text="Cancel", command=cancelDialog) enterDate_msg.pack() enterDate_entry.pack() enterDate_confirm.pack() enterDate_cancel.pack() centerForms(enterDateBox) chart_date.set("Loading charts...") enterDateBox.mainloop()
def elemen3(self): teksField3 = Frame(self) teksField3.pack(fill=X) teks3 = Label(teksField3, text="Alamat :", width=8) teks3.pack(side=LEFT, padx=5, pady=5) masukkanKeWindow3 = Entry(teksField3) masukkanKeWindow3.pack(fill=X, padx=5, expand=True)
def elemen2(self): teksField2 = Frame(self) teksField2.pack(fill=X) teks2 = Label(teksField2, text="Umur :", width=8) teks2.pack(side=LEFT, padx=5, pady=5) masukkanKeWindow2 = Entry(teksField2) masukkanKeWindow2.pack(fill=X, padx=5, expand=True)
def elemen1(self) : teksField1 = Frame(self) teksField1.pack(fill=X) teks1 = Label(teksField1, text="Nama :", width=8) teks1.pack(side=LEFT, padx=5, pady=5) masukkanKeWindow1 = Entry(teksField1) masukkanKeWindow1.pack(fill=X, padx=5, expand=True)
def initUI(self): self.parent.title("Test the Gauss point") self.pack(fill=BOTH, expand=True) self.fields = \ 'bulk_modulus', \ 'scale_hardening', \ 'max_stress_in', \ 'increment_strain', \ 'Nloop', \ 'initial_confinement', \ 'reference_pressure', \ 'modulus_n', \ 'cohesion', \ 'RMC_shape_k', \ 'dilation_angle_eta', \ 'diletion_scale' default_values = \ '1E7', \ '1E3', \ '3E4', \ '1E-4', \ '2', \ '1E5', \ '1E5', \ '0.7', \ '0.0', \ '1.0', \ '1.0', \ '1.0' # ================== # Entries for User input: self.entries = [] for idx, field in enumerate(self.fields): row = Frame(self) row.pack(fill=X) labl = Label(row, text=field, width=30) labl.pack(side=LEFT, padx=5, pady=5) entry = Entry(row) entry.insert(END, default_values[idx]) entry.pack(fill=X, padx=5, expand=True) self.entries.append((field, entry)) # print field # ================== # Button for calculation frameButtonCalc = Frame(self) frameButtonCalc.pack(fill=X) calcButton = Button(frameButtonCalc, text="calculate", command=self.calculate) calcButton.pack(side=LEFT, padx=5, pady=5) # ================== # Raw Frame for plot self.canvasFrame = Frame(self) self.canvasFrame.pack(fill=BOTH, expand=True)
class Main(Frame): """Main class for our browser. Note that we inherit from Frame, making this a Frame object. """ def __init__(self, master): Frame.__init__(self, master) self.master = master self.master.title("Browser") self.header = {"User-Agent": "Tkinter Browser 0.1"} # Here we make our widgets. self.top_frame = Frame(self) self.url_frame = Frame(self.top_frame) self.url_label = Label(self.url_frame, text="Url: ", anchor="n") self.url_entry = Entry(self.url_frame, width=80) self.url_button = Button(self.url_frame, text="Go", command=self.go_button) self.bottom_frame = Frame(self) self.text_field = Text(self.bottom_frame) #Here we pack our widgets. self.top_frame.pack(side="top", padx=15, pady=15) self.url_frame.pack(anchor="center") self.bottom_frame.pack(side="bottom", fill="both", expand=True) self.text_field.pack(side="bottom", fill="both", expand=True) self.url_label.pack(side="left") self.url_entry.pack(side="left", fill="x", expand=True) self.url_button.pack(side="left", padx=5) self.text_field.config(state="disabled", padx=5, pady=5) def go_button(self): url = self.url_entry.get() if url: if "http://" not in url: url = "http://" + url page_text = self.get_page(url) self.text_field.config(state="normal") self.text_field.delete(1.0, "end") self.text_field.insert("end", page_text) self.text_field.config(state="disable") def get_page(self, url): s = requests.Session() resp = s.get(url, headers=self.header) data = resp.text soup = bs(data, "html.parser") page_text = soup.find_all(text=True) page_text = filter(self.visible, page_text) return "".join([str(i) + '\n' for i in page_text]) def visible(self, e): if e.parent.name in ('style', 'script', '[document]', 'head', 'title'): return False elif re.match('<!--.*-->', str(e.encode('utf-8'))): return False return True
def addInputBox(self, text, placeholder): frame = Frame(self) frame.pack(fill=X) label = Label(frame, text=text, width=23) label.pack(side=LEFT, padx=20, pady=5) inputBox = Entry(frame, validatecommand=self.onConfigChange, validate="focusout") inputBox.insert(END,placeholder) inputBox.pack(fill=X, padx=20, expand=True) return inputBox
class Main(Frame): """Main class for our browser. Note that we inherit from Frame, making this a Frame object. """ def __init__(self, master): Frame.__init__(self, master) self.master = master self.master.title("Browser") self.header = {"User-Agent":"Tkinter Browser 0.1"} # Here we make our widgets. self.top_frame = Frame(self) self.url_frame = Frame(self.top_frame) self.url_label = Label(self.url_frame, text="Url: ", anchor="n") self.url_entry = Entry(self.url_frame, width=80) self.url_button = Button(self.url_frame, text="Go", command=self.go_button) self.bottom_frame = Frame(self) self.text_field = Text(self.bottom_frame) #Here we pack our widgets. self.top_frame.pack(side="top", padx=15, pady=15) self.url_frame.pack(anchor="center") self.bottom_frame.pack(side="bottom", fill="both", expand=True) self.text_field.pack(side="bottom", fill="both", expand=True) self.url_label.pack(side="left") self.url_entry.pack(side="left", fill="x", expand=True) self.url_button.pack(side="left", padx=5) self.text_field.config(state="disabled", padx=5, pady=5) def go_button(self): url = self.url_entry.get() if url: if "http://" not in url: url = "http://"+url page_text = self.get_page(url) self.text_field.config(state="normal") self.text_field.delete(1.0, "end") self.text_field.insert("end", page_text) self.text_field.config(state="disable") def get_page(self, url): s = requests.Session() resp = s.get(url, headers=self.header) data = resp.text soup = bs(data, "html.parser") page_text = soup.find_all(text=True) page_text = filter(self.visible, page_text) return "".join([str(i)+'\n' for i in page_text]) def visible(self, e): if e.parent.name in ('style', 'script', '[document]', 'head', 'title'): return False elif re.match('<!--.*-->', str(e.encode('utf-8'))): return False return True
def initUI(self): self.parent.title("T431") self.pack(fill=BOTH, expand=True) global value value = 0 global v v = IntVar() v.set(1) global exp exp = StringVar() global res res = StringVar() frame1 = Frame(self,style='My.TFrame') frame1.pack(fill=X) rb1 = Radiobutton(frame1, text = "4*3^n-1", variable = v, value = 1,style='My.TRadiobutton') rb1.pack( anchor = W ) rb2 = Radiobutton(frame1, text = "4*3^n+1", variable = v, value = 2,style='My.TRadiobutton') rb2.pack( anchor = W ) frame2 = Frame(self,style='My.TFrame') frame2.pack(fill=X) lbl2 = Label(frame2, text="Enter the exponent :", width=18,background='orange') lbl2.pack(side=LEFT, padx=5, pady=5) entry2 = Entry(frame2,textvariable=exp,style='My.TEntry') entry2.pack(fill=X, padx=5, expand=True) frame3 = Frame(self,style='My.TFrame') frame3.pack(fill=X) result = Label(frame3, textvariable=res, width=42,background='orange') result.pack(side=LEFT, padx=60, pady=5) frame4 = Frame(self,style='My.TFrame') frame4.pack(fill=X) btntest = Button(frame4, text="Test", width=10, command=self.test,style='My.TButton') btntest.pack(side=LEFT, anchor=N, padx=5, pady=5) btnclear = Button(frame4, text="Clear", width=10, command=self.clear,style='My.TButton') btnclear.pack(side=LEFT, anchor=N, padx=5, pady=5) btnclose = Button(frame4, text="Close", width=10, command=self.quit,style='My.TButton') btnclose.pack(side=LEFT, anchor=N, padx=5, pady=5)
class LoginWindow(TkinterWindow): """ Login GUI Window """ def __init__(self, event_handlers): """Have a username, password, and submit button""" super().__init__(event_handlers) self.master.title("EmpDat Login") self.master.resizable(False, False) main = Frame(self.master) icon_image = ui.load_image("ui/icons/EmpDat.gif") icon = Label(main, image=icon_image) icon.image = icon_image icon.pack(padx=10, pady=10) self.title = Label(main, text="EmpDat") self.title.pack(pady=10) self.username = Label(main, text="Employee ID") self.entry = Entry(main, width=50) self.username.pack() self.entry.pack(padx=10) self.password = Label(main, text="Password") self.password_entry = Entry(main, width=50, show="•") self.password.pack() self.password_entry.pack(padx=10) self.submit_button = Button( main, text="Submit", command=lambda: event_handlers['submit'] (self.entry.get(), self.password_entry.get()), ) self.submit_button.pack(pady=10) main.pack() self.master.bind( '<Return>', lambda x: event_handlers['submit'] (self.entry.get(), self.password_entry.get())) def validate(self): """ Validates login fields :return: bool is_valid """ if len(self.entry.get()) <= 0: self.show_error('Username required', 'No username given.') return False return True
def initUI(self): self.parent.title("WILSON") self.pack(fill=BOTH, expand=True) global value value = 0 global num num = StringVar() global res res = StringVar() frame1 = Frame(self, style='My.TFrame') frame1.pack(fill=X) lbl1 = Label(frame1, text="Enter a number :", width=18, background='orange') lbl1.pack(side=LEFT, padx=5, pady=5) entry1 = Entry(frame1, textvariable=num, style='My.TEntry') entry1.pack(fill=X, padx=5, expand=True) frame2 = Frame(self, style='My.TFrame') frame2.pack(fill=X) result = Label(frame2, textvariable=res, width=32, background='orange') result.pack(side=LEFT, padx=113, pady=5) frame3 = Frame(self, style='My.TFrame') frame3.pack(fill=X) btntest = Button(frame3, text="Test", width=10, command=self.test, style='My.TButton') btntest.pack(side=LEFT, anchor=N, padx=5, pady=5) btnclear = Button(frame3, text="Clear", width=10, command=self.clear, style='My.TButton') btnclear.pack(side=LEFT, anchor=N, padx=5, pady=5) btnclose = Button(frame3, text="Close", width=10, command=self.quit, style='My.TButton') btnclose.pack(side=LEFT, anchor=N, padx=5, pady=5)
def insert_entry_field(self, txt, default=None, focus=False): frame = Frame(self.frame) frame.pack(fill="x") label = Label(frame, text=txt, width=6) label.pack(side="left", anchor="n", padx=5, pady=5) entry = Entry(frame) entry.pack(fill="x", padx=5, pady=5, expand=True) if default: entry.insert("end", default) if focus: entry.focus_force() self.entries["Entry"][txt] = entry
class PasswordGenerator(Frame): def __init__(self): super().__init__() self.initUI() self.my_pw = '' def initUI(self): self.master.title('Simple PasswordGenerator v1.0') self.pack(fill=BOTH, expand=False) frame1 = Frame(self) frame1.pack(fill=X) lbl1 = Label(frame1, text='Input password lenght: (6-15)', width=27) lbl1.pack(side=LEFT, padx=5, pady=10) self.entry1 = Entry(frame1, width=10) self.entry1.pack(side=LEFT, padx=2) frame2 = Frame(self) frame2.pack(fill=X) lbl2 = Label(frame2, text='Generated password:'******'end') try: pw_length = int(self.entry1.get()) if pw_length >= 6 and pw_length <=15: for i in range(pw_length): index = random.randrange(len(possible_chars)) self.my_pw += possible_chars[index] self.entry2.insert(1, self.my_pw) self.my_pw = '' else: messagebox.showwarning('Error!', 'Password must be 6-15 characters!') self.entry1.delete(0, 'end') except: messagebox.showwarning('Error!', 'Field must contain a number!') self.entry1.delete(0, 'end')
def genFileList(self): for elt in self._files: inner_frame = Frame(self._file_frame) inner_frame.pack(fill=X, expand=True) lbl = Label(inner_frame, text=path_leaf(elt['filename']), width=18) lbl.pack(side=LEFT, padx=5, pady=5) entry = Entry(inner_frame) entry.pack(fill=X, padx=5, expand=True) if self._default_ops is not None: entry.insert(0, self._default_ops)
class MainWindow: def __init__(self): global root self.master = Toplevel(root) self.master.withdraw() self.master.protocol('WM_DELETE_WINDOW', root.destroy) self.master.iconbitmap(imgdir) self.master.geometry("400x150") self.master.resizable(False, False) self.master.title("Adb & Fastboot Installer - By @Pato05") estyle = Style() estyle.element_create("plain.field", "from", "clam") estyle.layout("White.TEntry", [('Entry.plain.field', {'children': [( 'Entry.background', {'children': [( 'Entry.padding', {'children': [( 'Entry.textarea', {'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})], 'border': '4', 'sticky': 'nswe'})]) estyle.configure("White.TEntry", background="white", foreground="black", fieldbackground="white") window = Frame(self.master, relief=FLAT) window.pack(padx=10, pady=5, fill=BOTH) Label(window, text='Installation path:').pack(fill=X) self.syswide = IntVar() self.instpath = StringVar() self.e = Entry(window, state='readonly', textvariable=self.instpath, style='White.TEntry') self.e.pack(fill=X) self.toggleroot() Label(window, text='Options:').pack(pady=(10, 0), fill=X) inst = Checkbutton(window, text="Install Adb and Fastboot system-wide?", variable=self.syswide, command=self.toggleroot) inst.pack(fill=X) self.path = IntVar(window, value=1) Checkbutton(window, text="Put Adb and Fastboot in PATH?", variable=self.path).pack(fill=X) Button(window, text='Install', command=self.install).pack(anchor='se') self.master.deiconify() def toggleroot(self): if self.syswide.get() == 0: self.instpath.set(installpaths['user']) elif self.syswide.get() == 1: self.instpath.set(installpaths['system']) def install(self): self.app = InstallWindow(setpath=self.path.get( ), installpath=self.instpath.get(), systemwide=self.syswide.get()) self.master.destroy()
class EntryOptionsWindow: def __init__(self, ls: str, tk: Tk, select_path=False) -> None: self.select_path = select_path self.List = ls self.Tk = tk self.Root = Toplevel(self.Tk) self.Root.withdraw() self.Frame = Frame(self.Root) self.Box = Listbox(self.Frame, selectmode='extended', width=54, height=24) for i in globals()[self.List]: self.Box.insert(END, i) self.Scroll = Scrollbar(self.Frame, command=self.Box.yview) self.Entry = Entry(self.Frame) self.ButtonAdd = Button(self.Frame, text='Добавить', command=self.__add_item) self.ButtonDel = Button(self.Frame, text='Удалить', command=self.__del_item) self.ButtonDone = Button(self.Frame, text='Готово', command=self.__save_list) self.ButtonExit = Button(self.Frame, text='Отмена', command=self.Root.destroy) def __add_item(self) -> None: if self.select_path: text = filedialog.askdirectory() else: text = self.Entry.get() if text: self.Box.insert(END, text) self.Entry.delete(0, END) def __del_item(self) -> None: select = list(self.Box.curselection()) select.reverse() for i in select: self.Box.delete(i) def __save_list(self) -> None: globals()[self.List] = list(self.Box.get(0, END)) self.Root.destroy() def main(self) -> None: center_win(self.Root, '500x400') self.Root.deiconify() self.Root.title(f'Editing {self.List}') self.Box.pack(side='left', expand=True) self.Scroll.pack(side='left', fill='y') self.Box.config(yscrollcommand=self.Scroll.set) self.Frame.pack(side='left', padx=10) if not self.select_path: self.Entry.pack(anchor='n') self.ButtonAdd.pack(fill='x') self.ButtonDel.pack(fill='x') self.ButtonDone.pack(fill='x') self.ButtonExit.pack(fill='x') self.Root.mainloop()
class StartPage(Frame): def __init__(self, master, data): Frame.__init__(self, master) self.pack(fill=BOTH, expand=True) frame1 = Frame(self) frame1.pack(fill=X) label_moves = Label(frame1, text="Moves", width=6) label_moves.pack(side=LEFT, padx=5, pady=5) self.entry_moves = Entry(frame1) self.entry_moves.pack(fill=X, padx=5, expand=True) frame2 = Frame(self) frame2.pack(fill=BOTH, expand=True, pady=20, padx=5) label_table = Label(frame2, text="Table", width=6) label_table.pack() self.text_table = Text(frame2) self.text_table.pack(expand=True, fill=BOTH) frame3 = Frame(self) frame3.pack(fill=BOTH, padx=5, side=BOTTOM, before=frame2) frame3.grid_columnconfigure(0, weight=1) frame3.grid_columnconfigure(3, weight=1) quit_button = Button(frame3, text="Quit", command=self.quit) quit_button.grid(row=0, column=1) next_button = Button(frame3, text="Next", command=self.next) next_button.grid(row=0, column=2) def next(self): #TODO bawimy się w sprawdzanie danych?? data = dict() moves = self.entry_moves.get() moves = moves.split(',') for i in range(len(moves)): moves[i] = utils.order_from_char(moves[i]) data["moves"] = moves raw_table_input = self.text_table.get('0.1', END) raw_table_input = raw_table_input.splitlines() table_input = [None] * len(raw_table_input) for i in range(len(raw_table_input)): chars = raw_table_input[i].split(' ') table_input[i] = list() for j in range(len(chars)): table_input[i].append(int(chars[j])) data["table"] = Table(table_input) self.master.switch_frame(ViewPage, data)
class AskText(Toplevel): def __init__(self, window, titre, message, command): super(AskText, self).__init__(window) self.window = window self.label = Label(self, text=message) self.entry = Entry(self) self.button = Button(self, text="Valider", command=command) self.label.pack(padx=10, pady=10) self.entry.pack(padx=10, pady=7) self.button.pack(padx=10, pady=7) self.title(titre)
def __init__(self, master, numentries=0, textvariable='', justify='left', width=20): # Inherit from tkinter.Entry Entry.__init__(self, master) # Create a frame for the entry box entryFrame = Frame(master) entryFrame.pack(side=LEFT, fill=X, expand=1) # Create a frame for the checkboxes checkFrame = Frame(master) checkFrame.pack(side=RIGHT) # Initialize the variables stored in the moddable # entrybox textMods = ['Italique', 'Gras', 'Souligner'] self.checkVars = [IntVar() for _ in range(3)] # Create and array to store entries self.entries = [] # Entry boxes # Include multiple entries if needed if numentries != 0: for i in range(numentries): entryBox = Entry(entryFrame, textvariable=textvariable, width=width, justify=justify) entryBox.pack(side=LEFT, fill=X, expand=1, pady=2) # Append each entry box to the entries array self.entries.append(entryBox) else: entryBox = Entry(entryFrame, textvariable=textvariable, width=width, justify=justify) entryBox.pack(side=LEFT, fill=X, expand=1, pady=2) self.entries.append(entryBox) # Check boxes for i in range(3): Checkbutton(checkFrame, variable=self.checkVars[i]).pack(side=RIGHT) Label(checkFrame, text=textMods[i]).pack(side=RIGHT)
def initialize_ui(self): default_padding = {'padx': 10, 'pady' : 10} labels = ["Name", "Surname", "Email", "Cellphone"] for label in labels: frame = Frame(self) Label(frame, text = label, style="BW.TLabel").pack(default_padding, side = LEFT) entry = Entry(frame) entry.pack(default_padding, side = RIGHT) self.entries.append(entry) frame.pack(expand = True, fill = "x", side = TOP) button_frame = Frame(self) Button(button_frame, text = "Create Customer", command = self.save_customer).pack(default_padding) button_frame.pack(expand = True, fill = "x")
def add(self): def ok(event=None): txt = e.get() txt = txt.strip().replace(" ", "\ ") if txt and txt not in self.exclude_list: self.exclude_list.append(txt) self.listvar.set(" ".join(self.exclude_list)) top.destroy() top = Toplevel(self) top.transient(self) top.grab_set() e = Entry(top) e.pack(expand=True, fill="x", padx=10, pady=(10, 4)) e.focus_set() e.bind("<Key-Return>", ok) Button(top, text="Ok", command=ok).pack(padx=10, pady=(4, 10))
class DestinationFrame(LabelFrame): def __init__(self, root, model: ConfigUIModel): super().__init__(root, text="Destination", padding=10) self.pack(side=LEFT, anchor=NW, fill=BOTH, expand=True) self.model = model self.txt_dest = Entry(self, textvariable=self.model.var_dest) self.txt_dest.pack(fill=X) self.chk_wrap = Checkbutton(self, text="Create Date Wrapper", variable=self.model.var_wrap, onvalue=True, offvalue=False) self.chk_wrap.pack() self.btn_dest_browse = Button(self, text="Browse", command=self.set_dest) self.btn_dest_browse.pack() def manage(): self.model.var_managed.set(True) self.btn_make_managed = Button(self, text="Manage This Folder", command=manage) self.btn_make_managed.pack(side=BOTTOM) self.model.var_managed.trace_add("write", self.managed_changed) def managed_changed(self, *args): val = self.model.var_managed.get() if val: self.chk_wrap.configure(state="disabled") self.btn_make_managed.configure(text="Already Managed", state="disabled") else: self.chk_wrap.configure(state="normal") self.btn_make_managed.configure(text="Manage This Folder", state="normal") def set_dest(self): dest = filedialog.askdirectory(title="Choose Destination") if dest is not None: self.model.var_dest.set(dest) self.model.var_managed.set(MetaRecord.is_managed(dest))
class SearchFrame(Frame): def __init__(self, master, **kwargs): Frame.__init__(self, master, **kwargs) Separator(self, orient=HORIZONTAL).pack(side=TOP, fill=X) self.close = Button(self, text='x', width=3, takefocus=False) self.close.pack(side=RIGHT) self.entry = Entry(self) self.entry.pack(side=LEFT, padx=8) self.prev = Button(self, text="<", width=3, takefocus=False) self.prev.pack(side=LEFT) self.next = Button(self, text=">", width=3, takefocus=False) self.next.pack(side=LEFT) Separator(self, orient=VERTICAL).pack(side=LEFT, fill=Y, pady=2, padx=(6, 4)) self.regex_check = Checkbutton(self, text='Regex', takefocus=False) self.regex_check.pack(side=LEFT) self.case_check = Checkbutton(self, text='Case Sensitive', takefocus=False) self.case_check.pack(side=LEFT, padx=5)
def input(otazka='odpověz'): """Zeptá se uživatele na otázku a vrátí odpověď jako řetězec.""" root = Tk() root.title(otazka) button = Button(root, text="OK", command=root.quit) button.pack(side=RIGHT) entry = Entry(root) entry.pack(side=LEFT) root.mainloop() value = entry.get() root.destroy() return value
def initUI(self): self.master.title("Layout Application") self.pack(fill=BOTH, expand=True) #-----------------Frame1--------------------# frame1 = Frame(self) frame1.pack(fill=X) lbl1 = Label(frame1, text="Title", width=6) lbl1.pack(side=LEFT, padx=5, pady=5) entry1 = Entry(frame1) entry1.pack(fill=X, padx=5, expand=True) #----------------Frame2-----------------------# frame2 = Frame(self) frame2.pack(fill=X) lbl2 = Label(frame2, text="Author", width=6) lbl2.pack(side=LEFT, padx=5, pady=5) entry2 = Entry(frame2) entry2.pack(fill=X, padx=5, expand=True) #-----------------Frame3-----------------------# frame3 = Frame(self) frame3.pack(fill=X) lbl3 = Label(frame3, text="Review", width=6) lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5) txt = Text(frame3) txt.pack(fill=BOTH, pady=5, padx=5, expand=True) #------------------Frame4-----------------------# frame4 = Frame(self) frame4.pack(fill=X) closeButton = Button(self, text="Close") closeButton.pack(side=RIGHT, padx=5, pady=5)
def initUI(self): self.master.title("Schmuxi - Hmm refreshing") self.pack(fill=BOTH, expand=1) frame1 = Frame(self) frame1.pack(fill=X) temperature_label = Label(frame1, text="Temperature", width=15) temperature_label.pack(side=LEFT, padx=5, pady=5) temperature_entry = Entry(frame1, text="4", width=15) temperature_entry.pack(fill=X, padx=5, expand=True) config_btn = Button(self, text="Edit config", command=self.edit_config(config_source)) config_btn.place(x=50, y=50)
class ArgEntry(Frame): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__namelabel = Label(self) self.__namelabel.pack(expand='yes', fill='x') self.__entry = Entry(self) self.__entry.pack(side='left', expand='yes', fill='x') self.__btn = Button(self) self.__btn.pack(side='right') self.__btn['state'] = 'disabled' @property def entry(self): return self.__entry @property def entry_text(self): return self.__entry.get() @entry_text.setter def entry_text(self, value): self.__entry.delete(0, 'end') self.__entry.insert(0, value) @property def button(self): return self.__btn @property def arg_name(self): return self.__namelabel['text'] @arg_name.setter def arg_name(self, val): self.__namelabel['text'] = val @property def arg_value(self): return self.__entry.get() @arg_value.setter def arg_value(self, val): self.__entry.delete(0, 'end') self.__entry.insert(0, val)
def __init__(self, parent): super().__init__(parent) self.parent = parent self.parent.title("InstaDjango") self.pack(fill=BOTH, expand=1) self.size_and_center_window() self.style = Style() self.style.theme_use("clam") self.style.configure("TFrame", background="#808080", foreground="white") self.style.configure("TButton", background="#808080", foreground="white") self.style.configure("high.TButton", background="#8FBC8B", foreground="white") self.style.configure("TLabel", background="#808080", foreground="white") self.style.map("TButton", background=[("pressed", "#404040"), ("active", "#A0A0A0")]) frame = Frame(self, relief=FLAT, borderwidth=1) frame.pack(fill=BOTH, expand=1) subframe_0 = Frame(frame, relief=FLAT, borderwidth=0) subframe_0.pack(fill=X) lbl_0 = Label(subframe_0, text="App's machine-readable name (used for naming folders locally and remotely):", style="TLabel") lbl_0.pack(fill=BOTH, padx=10, pady=10) entry_0 = Entry(subframe_0) entry_0.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_0, "") subframe_1 = Frame(frame, relief=FLAT, borderwidth=0) subframe_1.pack(fill=X) lbl_1 = Label( subframe_1, text="Where to create the app's folder locally:", style="TLabel") lbl_1.pack(fill=BOTH, padx=10, pady=10) entry_1 = Entry(subframe_1) def action_1(): cdir = filedialog.askdirectory(title="Please select a directory") if cdir: self.set_entry_text(entry_1, cdir) button_1 = Button(subframe_1, text="Choose", command=action_1, style="TButton") button_1.pack(side=RIGHT, padx=10, pady=0) entry_1.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_1, "") subframe_2 = Frame(frame, relief=FLAT, borderwidth=0) subframe_2.pack(fill=X) lbl_2 = Label(subframe_2, text="Remote host:", style="TLabel") lbl_2.pack(fill=BOTH, padx=10, pady=10) entry_2 = Entry(subframe_2) entry_2.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_2, "") subframe_3 = Frame(frame, relief=FLAT, borderwidth=0) subframe_3.pack(fill=X) lbl_3 = Label( subframe_3, text="Remote SSH port (empty will mean the default port):", style="TLabel") lbl_3.pack(fill=BOTH, padx=10, pady=10) entry_3 = Entry(subframe_3) entry_3.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_3, "") subframe_4 = Frame(frame, relief=FLAT, borderwidth=0) subframe_4.pack(fill=X) lbl_4 = Label(subframe_4, text="Remote user:"******"TLabel") lbl_4.pack(fill=BOTH, padx=10, pady=10) entry_4 = Entry(subframe_4) entry_4.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_4, "") subframe_5 = Frame(frame, relief=FLAT, borderwidth=0) subframe_5.pack(fill=X) lbl_5 = Label( subframe_5, text="Local path to the SSH private key:", style="TLabel") lbl_5.pack(fill=BOTH, padx=10, pady=10) entry_5 = Entry(subframe_5) def action_5(): cdir = filedialog.askopenfilename(title="Please select a private key") if cdir: self.set_entry_text(entry_5, cdir) button_5 = Button(subframe_5, text="Choose", command=action_5, style="TButton") button_5.pack(side=RIGHT, padx=10, pady=0) entry_5.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_5, "") subframe_6 = Frame(frame, relief=FLAT, borderwidth=0) subframe_6.pack(fill=X) lbl_6 = Label( subframe_6, text="Where to create the app's folder remotely (should not be owned by root):", style="TLabel") lbl_6.pack(fill=BOTH, padx=10, pady=10) entry_6 = Entry(subframe_6) entry_6.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_6, "/var/www") subframe_7 = Frame(frame, relief=FLAT, borderwidth=0) subframe_7.pack(fill=X) lbl_7 = Label(subframe_7, text="Sudo password:"******"TLabel") lbl_7.pack(fill=BOTH, padx=10, pady=10) entry_7 = Entry(subframe_7, show="*") entry_7.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_7, "") subframe_8 = Frame(frame, relief=FLAT, borderwidth=0) subframe_8.pack(fill=X) lbl_8 = Label(subframe_8, text="Database password:"******"TLabel") lbl_8.pack(fill=BOTH, padx=10, pady=10) entry_8 = Entry(subframe_8, show="*") entry_8.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_8, "") subframe_9 = Frame(frame, relief=FLAT, borderwidth=0) subframe_9.pack(fill=X) lbl_9 = Label(subframe_9, text="Domain:", style="TLabel") lbl_9.pack(fill=BOTH, padx=10, pady=10) entry_9 = Entry(subframe_9) entry_9.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_9, "dev.example.com") subframe_10 = Frame(frame, relief=FLAT, borderwidth=0) subframe_10.pack(fill=X) lbl_10 = Label(subframe_10, text="Django installation type (local, production, staging):", style="TLabel") lbl_10.pack(fill=BOTH, padx=10, pady=10) entry_10 = Entry(subframe_10) entry_10.pack(fill=X, padx=10, ipady=5) self.set_entry_text(entry_10, "local") def go(): setup_django_project( proj=entry_0.get(), proj_local_parent_dir=entry_1.get(), host=entry_2.get(), port=entry_3.get(), user=entry_4.get(), ssh_key=entry_5.get(), proj_remote_parent_dir=entry_6.get(), sudo_pass=entry_7.get(), db_pass=entry_8.get(), domain=entry_9.get(), insta_type=entry_10.get()) self.quit() inst_button = Button(self, text="Go", command=go, style="high.TButton") inst_button.pack(side=RIGHT, padx=10, pady=10) quit_button = Button(self, text="Quit", command=self.quit, style="TButton") quit_button.pack(side=RIGHT, pady=10)
class Query(Toplevel): """Base class for getting verified answer from a user. For this base class, accept any non-blank string. """ def __init__(self, parent, title, message, *, text0='', used_names={}, _htest=False, _utest=False): """Create popup, do not return until tk widget destroyed. Additional subclass init must be done before calling this unless _utest=True is passed to suppress wait_window(). title - string, title of popup dialog message - string, informational message to display text0 - initial value for entry used_names - names already in use _htest - bool, change box location when running htest _utest - bool, leave window hidden and not modal """ Toplevel.__init__(self, parent) self.withdraw() # Hide while configuring, especially geometry. self.configure(borderwidth=5) self.resizable(height=False, width=False) self.title(title) self.transient(parent) self.grab_set() self.bind('<Key-Return>', self.ok) self.bind('<Key-Escape>', self.cancel) self.protocol("WM_DELETE_WINDOW", self.cancel) self.parent = parent self.message = message self.text0 = text0 self.used_names = used_names self.create_widgets() self.update_idletasks() # Needed here for winfo_reqwidth below. self.geometry( # Center dialog over parent (or below htest box). "+%d+%d" % ( parent.winfo_rootx() + (parent.winfo_width()/2 - self.winfo_reqwidth()/2), parent.winfo_rooty() + ((parent.winfo_height()/2 - self.winfo_reqheight()/2) if not _htest else 150) ) ) if not _utest: self.deiconify() # Unhide now that geometry set. self.wait_window() def create_widgets(self): # Call from override, if any. # Bind to self widgets needed for entry_ok or unittest. self.frame = frame = Frame(self, borderwidth=2, relief='sunken', ) entrylabel = Label(frame, anchor='w', justify='left', text=self.message) self.entryvar = StringVar(self, self.text0) self.entry = Entry(frame, width=30, textvariable=self.entryvar) self.entry.focus_set() buttons = Frame(self) self.button_ok = Button(buttons, text='Ok', width=8, command=self.ok) self.button_cancel = Button(buttons, text='Cancel', width=8, command=self.cancel) frame.pack(side='top', expand=True, fill='both') entrylabel.pack(padx=5, pady=5) self.entry.pack(padx=5, pady=5) buttons.pack(side='bottom') self.button_ok.pack(side='left', padx=5) self.button_cancel.pack(side='right', padx=5) def entry_ok(self): # Example: usually replace. "Return non-blank entry or None." entry = self.entry.get().strip() if not entry: showerror(title='Entry Error', message='Blank line.', parent=self) return None return entry def ok(self, event=None): # Do not replace. '''If entry is valid, bind it to 'result' and destroy tk widget. Otherwise leave dialog open for user to correct entry or cancel. ''' entry = self.entry_ok() if entry is not None: self.result = entry self.destroy() else: # [Ok] moves focus. (<Return> does not.) Move it back. self.entry.focus_set() def cancel(self, event=None): # Do not replace. "Set dialog result to None and destroy tk widget." self.result = None self.destroy()
class HelpSource(Query): "Get menu name and help source for Help menu." # Used in ConfigDialog.HelpListItemAdd/Edit, (941/9) def __init__(self, parent, title, *, menuitem='', filepath='', used_names={}, _htest=False, _utest=False): """Get menu entry and url/local file for Additional Help. User enters a name for the Help resource and a web url or file name. The user can browse for the file. """ self.filepath = filepath message = 'Name for item on Help menu:' super().__init__(parent, title, message, text0=menuitem, used_names=used_names, _htest=_htest, _utest=_utest) def create_widgets(self): super().create_widgets() frame = self.frame pathlabel = Label(frame, anchor='w', justify='left', text='Help File Path: Enter URL or browse for file') self.pathvar = StringVar(self, self.filepath) self.path = Entry(frame, textvariable=self.pathvar, width=40) browse = Button(frame, text='Browse', width=8, command=self.browse_file) pathlabel.pack(anchor='w', padx=5, pady=3) self.path.pack(anchor='w', padx=5, pady=3) browse.pack(pady=3) def askfilename(self, filetypes, initdir, initfile): # htest # # Extracted from browse_file so can mock for unittests. # Cannot unittest as cannot simulate button clicks. # Test by running htest, such as by running this file. return filedialog.Open(parent=self, filetypes=filetypes)\ .show(initialdir=initdir, initialfile=initfile) def browse_file(self): filetypes = [ ("HTML Files", "*.htm *.html", "TEXT"), ("PDF Files", "*.pdf", "TEXT"), ("Windows Help Files", "*.chm"), ("Text Files", "*.txt", "TEXT"), ("All Files", "*")] path = self.pathvar.get() if path: dir, base = os.path.split(path) else: base = None if platform[:3] == 'win': dir = os.path.join(os.path.dirname(executable), 'Doc') if not os.path.isdir(dir): dir = os.getcwd() else: dir = os.getcwd() file = self.askfilename(filetypes, dir, base) if file: self.pathvar.set(file) item_ok = SectionName.entry_ok # localize for test override def path_ok(self): "Simple validity check for menu file path" path = self.path.get().strip() if not path: #no path specified showerror(title='File Path Error', message='No help file path specified.', parent=self) return None elif not path.startswith(('www.', 'http')): if path[:5] == 'file:': path = path[5:] if not os.path.exists(path): showerror(title='File Path Error', message='Help file path does not exist.', parent=self) return None if platform == 'darwin': # for Mac Safari path = "file://" + path return path def entry_ok(self): "Return apparently valid (name, path) or None" name = self.item_ok() path = self.path_ok() return None if name is None or path is None else (name, path)
class Query(Toplevel): """Base class for getting verified answer from a user. For this base class, accept any non-blank string. """ def __init__(self, parent, title, message, *, _htest=False, _utest=False): # Call from override. """Create popup, do not return until tk widget destroyed. Additional subclass init must be done before calling this. title - string, title of popup dialog message - string, informational message to display _htest - bool, change box location when running htest _utest - bool, leave window hidden and not modal """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) self.resizable(height=FALSE, width=FALSE) self.title(title) self.transient(parent) self.grab_set() self.bind("<Key-Return>", self.ok) self.protocol("WM_DELETE_WINDOW", self.cancel) self.parent = parent self.message = message self.create_widgets() self.update_idletasks() # needs to be done here so that the winfo_reqwidth is valid self.withdraw() # Hide while configuring, especially geometry. self.geometry( "+%d+%d" % ( parent.winfo_rootx() + (parent.winfo_width() / 2 - self.winfo_reqwidth() / 2), parent.winfo_rooty() + ((parent.winfo_height() / 2 - self.winfo_reqheight() / 2) if not _htest else 150), ) ) # centre dialog over parent (or below htest box) if not _utest: self.deiconify() # geometry set, unhide self.wait_window() def create_widgets(self): # Call from override, if any. frame = Frame(self, borderwidth=2, relief="sunken") label = Label(frame, anchor="w", justify="left", text=self.message) self.entry = Entry(frame, width=30) # Bind name for entry_ok. self.entry.focus_set() buttons = Frame(self) # Bind buttons for invoke in unittest. self.button_ok = Button(buttons, text="Ok", width=8, command=self.ok) self.button_cancel = Button(buttons, text="Cancel", width=8, command=self.cancel) frame.pack(side="top", expand=TRUE, fill="both") label.pack(padx=5, pady=5) self.entry.pack(padx=5, pady=5) buttons.pack(side="bottom") self.button_ok.pack(side="left", padx=5) self.button_cancel.pack(side="right", padx=5) def entry_ok(self): # Usually replace. "Check that entry not blank." entry = self.entry.get().strip() if not entry: showerror(title="Entry Error", message="Blank line.", parent=self) return entry def ok(self, event=None): # Do not replace. """If entry is valid, bind it to 'result' and destroy tk widget. Otherwise leave dialog open for user to correct entry or cancel. """ entry = self.entry_ok() if entry: self.result = entry self.destroy() else: # [Ok] (but not <Return>) moves focus. Move it back. self.entry.focus_set() def cancel(self, event=None): # Do not replace. "Set dialog result to None and destroy tk widget." self.result = None self.destroy()
bottom_frame = Frame(main_frame) label = Label(top_frame, text="This is my Label") entry = Entry(top_frame, textvariable=mystring) radio = Radiobutton(top_frame, text="Enable", variable=myint, value=1) text1 = Text(mid_frame) text2 = Text(mid_frame) ok_button = Button(bottom_frame, text="Ok", command=okbutton) cancel_button = Button(bottom_frame, text="Cancel", command=exit) ###### Pack our Widgets ####### main_frame.pack() top_frame.pack() mid_frame.pack() bottom_frame.pack(anchor="e") label.pack(side="left") entry.pack(side="left") radio.pack(side="left") text1.pack(side="left") text2.pack(side="left") cancel_button.pack(side="right", padx=5, pady=5) ok_button.pack(side="right") root.mainloop()
def add_entry(self, text): entry = Entry(self) entry.insert(0, "".join(text)) entry.pack(fill="both", expand=True) entry.config(state="disable") self.entries.append(entry)
class SettingsUI: def __init__(self, mainFrame): "initiates settings and creates the interface" self.playerList = [] self.gameList = ("301", "501", "Clock") self.initUI(mainFrame) def buildPlayerHeaderString(self): """Build a connection string from a dictionary of parameters. Returns string.""" return "Players: " + ", ".join(["%s" % player.name for player in self.playerList]) def addPlayerText(self, name): self.playerList.append(Player(name)) #bind add player click event def onAddPlayerClick(self, event): "callback method for the add player button" self.addPlayer() def onAddPlayerEnter(self, event): "callback method for the add player button" if event.keycode == 13: self.addPlayer() def addPlayer(self): name = self.playerNameEntry.get() if name: self.addPlayerText(name) self.playerString.set(self.buildPlayerHeaderString()) self.nameFieldVar.set("") self.playerNameEntry.focus() return("break") def initUI(self, mainFrame): """initialize the User Interface""" # styles style = Style() style.configure("GRN.TLabel", background="#ACF059") style.configure("GRN.TFrame", background="#ACF059") style.configure("BLK.TFrame", background="#595959") # create top frame topFrame = Frame(mainFrame, style="GRN.TFrame", padding=8) topFrame.pack(fill=BOTH, side=TOP) # create black border borderFrame = Frame(mainFrame, style="BLK.TFrame") borderFrame.pack(fill=BOTH, side=TOP) # create add player frame addPlayerFrame = Frame(mainFrame, padding=8) addPlayerFrame.pack(side=TOP) # create text field for add button self.nameFieldVar = StringVar() self.playerNameEntry = Entry(addPlayerFrame, textvariable = self.nameFieldVar) self.playerNameEntry.pack(side=LEFT) # create add player button addButton = Button(addPlayerFrame, text="Add player") addButton.pack(side=LEFT) # create choose game list self.currentGame = StringVar() self.currentGame.set(self.gameList[0]) gameDropDown = OptionMenu(mainFrame, self.currentGame, self.gameList[0], *self.gameList) gameDropDown.pack(side=TOP) # create start game button startGameButton = Button(mainFrame, text="Start") startGameButton.bind("<Button-1>", self.startGame) startGameButton.pack(side=TOP) # create label and set text self.playerString = StringVar() self.playerString.set(self.buildPlayerHeaderString()) headerLabel = Label(topFrame, textvariable=self.playerString, style="GRN.TLabel") headerLabel.pack(side=TOP) addButton.bind("<Button-1>", self.onAddPlayerClick) self.playerNameEntry.bind("<Key>", self.onAddPlayerEnter) #set focus self.playerNameEntry.focus() def startGame(self,event): "starts the selected game" if self.playerList: mainFrame.pack_forget() gameFrame = Frame(root) gameFrame.pack(fill=BOTH, expand=1) game = self.currentGame.get() if game == "301": gameX01.GameX01(gameFrame, self.playerList) elif game == "501": gameX01.GameX01(gameFrame, self.playerList, 501) elif game == "Clock": gameClock.GameClock(gameFrame, self.playerList) else: gameX01.GameX01(gameFrame, self.playerList)
class CreateCustomer(Frame): """Create customer screen""" def __init__(self, master): Frame.__init__(self,master) self.master = master self.frame = Frame(self.master) self.initUI() def initUI(self): self.master.title("3D Printer - Add Customer") self.style = Style() default_padding = {'padx': 10, 'pady' : 10} #TODO change alignment #Left frame for labels self.left_frame = Frame(self.master) self.name_label = Label(self.left_frame, text = "Name", style="BW.TLabel") self.name_label.pack(default_padding) self.surname_label = Label(self.left_frame, text = "Surname", style="BW.TLabel") self.surname_label.pack(default_padding) self.email_label = Label(self.left_frame, text = "Email", style="BW.TLabel") self.email_label.pack(default_padding) self.cellphone_label = Label(self.left_frame, text = "Cellphone", style="BW.TLabel") self.cellphone_label.pack(default_padding) #Right frame for entries self.right_frame = Frame(self.master) self.name_entry = Entry(self.right_frame) self.name_entry.pack(default_padding) self.surname_entry = Entry(self.right_frame) self.surname_entry.pack(default_padding) self.email_entry = Entry(self.right_frame) self.email_entry.pack(default_padding) self.cellphone_entry = Entry(self.right_frame) self.cellphone_entry.pack(default_padding) #Bottom frame for button self.button_frame = Frame(self.master) self.create_customer_button = Button(self.button_frame, text = "Create Customer", command = self.save_customer) self.create_customer_button.pack(default_padding) self.button_frame.pack(side = BOTTOM, fill = "x", expand = True) self.left_frame.pack(side = LEFT, expand = True, fill = "y") self.right_frame.pack(side = RIGHT, expand = True, fill = "y") self.frame.pack() def save_customer(self): print("saving customer") self.customer = Customer(self.name_entry.get(), self.surname_entry.get(), self.email_entry.get(), self.cellphone_entry.get()) if not self.customer.validate(): messagebox.showerror(message = "All fields are mandatory, please fill in all the fields") return db = TinyDB('db/db.json') self.customer_id = db.insert(self.customer.__dict__) #TODO redirect to next page self.go_to_execute_script() def go_to_execute_script(self): """redirect to next page""" self.execute_script = Toplevel(self, self.master) self.app = ExecuteScript(self.execute_script)
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 GetKeysDialog(Toplevel): # Dialog title for invalid key sequence keyerror_title = 'Key Sequence Error' def __init__(self, parent, title, action, current_key_sequences, *, _htest=False, _utest=False): """ parent - parent of this dialog title - string which is the title of the popup dialog action - string, the name of the virtual event these keys will be mapped to current_key_sequences - list, a list of all key sequence lists currently mapped to virtual events, for overlap checking _htest - bool, change box location when running htest _utest - bool, do not wait when running unittest """ Toplevel.__init__(self, parent) self.withdraw() # Hide while setting geometry. self.configure(borderwidth=5) self.resizable(height=False, width=False) self.title(title) self.transient(parent) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.cancel) self.parent = parent self.action = action self.current_key_sequences = current_key_sequences self.result = '' self.key_string = StringVar(self) self.key_string.set('') # Set self.modifiers, self.modifier_label. self.set_modifiers_for_platform() self.modifier_vars = [] for modifier in self.modifiers: variable = StringVar(self) variable.set('') self.modifier_vars.append(variable) self.advanced = False self.create_widgets() self.update_idletasks() self.geometry( "+%d+%d" % ( parent.winfo_rootx() + (parent.winfo_width()/2 - self.winfo_reqwidth()/2), parent.winfo_rooty() + ((parent.winfo_height()/2 - self.winfo_reqheight()/2) if not _htest else 150) ) ) # Center dialog over parent (or below htest box). if not _utest: self.deiconify() # Geometry set, unhide. self.wait_window() def showerror(self, *args, **kwargs): # Make testing easier. Replace in #30751. messagebox.showerror(*args, **kwargs) def create_widgets(self): self.frame = frame = Frame(self, borderwidth=2, relief='sunken') frame.pack(side='top', expand=True, fill='both') frame_buttons = Frame(self) frame_buttons.pack(side='bottom', fill='x') self.button_ok = Button(frame_buttons, text='OK', width=8, command=self.ok) self.button_ok.grid(row=0, column=0, padx=5, pady=5) self.button_cancel = Button(frame_buttons, text='Cancel', width=8, command=self.cancel) self.button_cancel.grid(row=0, column=1, padx=5, pady=5) # Basic entry key sequence. self.frame_keyseq_basic = Frame(frame, name='keyseq_basic') self.frame_keyseq_basic.grid(row=0, column=0, sticky='nsew', padx=5, pady=5) basic_title = Label(self.frame_keyseq_basic, text=f"New keys for '{self.action}' :") basic_title.pack(anchor='w') basic_keys = Label(self.frame_keyseq_basic, justify='left', textvariable=self.key_string, relief='groove', borderwidth=2) basic_keys.pack(ipadx=5, ipady=5, fill='x') # Basic entry controls. self.frame_controls_basic = Frame(frame) self.frame_controls_basic.grid(row=1, column=0, sticky='nsew', padx=5) # Basic entry modifiers. self.modifier_checkbuttons = {} column = 0 for modifier, variable in zip(self.modifiers, self.modifier_vars): label = self.modifier_label.get(modifier, modifier) check = Checkbutton(self.frame_controls_basic, command=self.build_key_string, text=label, variable=variable, onvalue=modifier, offvalue='') check.grid(row=0, column=column, padx=2, sticky='w') self.modifier_checkbuttons[modifier] = check column += 1 # Basic entry help text. help_basic = Label(self.frame_controls_basic, justify='left', text="Select the desired modifier keys\n"+ "above, and the final key from the\n"+ "list on the right.\n\n" + "Use upper case Symbols when using\n" + "the Shift modifier. (Letters will be\n" + "converted automatically.)") help_basic.grid(row=1, column=0, columnspan=4, padx=2, sticky='w') # Basic entry key list. self.list_keys_final = Listbox(self.frame_controls_basic, width=15, height=10, selectmode='single') self.list_keys_final.insert('end', *AVAILABLE_KEYS) self.list_keys_final.bind('<ButtonRelease-1>', self.final_key_selected) self.list_keys_final.grid(row=0, column=4, rowspan=4, sticky='ns') scroll_keys_final = Scrollbar(self.frame_controls_basic, orient='vertical', command=self.list_keys_final.yview) self.list_keys_final.config(yscrollcommand=scroll_keys_final.set) scroll_keys_final.grid(row=0, column=5, rowspan=4, sticky='ns') self.button_clear = Button(self.frame_controls_basic, text='Clear Keys', command=self.clear_key_seq) self.button_clear.grid(row=2, column=0, columnspan=4) # Advanced entry key sequence. self.frame_keyseq_advanced = Frame(frame, name='keyseq_advanced') self.frame_keyseq_advanced.grid(row=0, column=0, sticky='nsew', padx=5, pady=5) advanced_title = Label(self.frame_keyseq_advanced, justify='left', text=f"Enter new binding(s) for '{self.action}' :\n" + "(These bindings will not be checked for validity!)") advanced_title.pack(anchor='w') self.advanced_keys = Entry(self.frame_keyseq_advanced, textvariable=self.key_string) self.advanced_keys.pack(fill='x') # Advanced entry help text. self.frame_help_advanced = Frame(frame) self.frame_help_advanced.grid(row=1, column=0, sticky='nsew', padx=5) help_advanced = Label(self.frame_help_advanced, justify='left', text="Key bindings are specified using Tkinter keysyms as\n"+ "in these samples: <Control-f>, <Shift-F2>, <F12>,\n" "<Control-space>, <Meta-less>, <Control-Alt-Shift-X>.\n" "Upper case is used when the Shift modifier is present!\n\n" + "'Emacs style' multi-keystroke bindings are specified as\n" + "follows: <Control-x><Control-y>, where the first key\n" + "is the 'do-nothing' keybinding.\n\n" + "Multiple separate bindings for one action should be\n"+ "separated by a space, eg., <Alt-v> <Meta-v>." ) help_advanced.grid(row=0, column=0, sticky='nsew') # Switch between basic and advanced. self.button_level = Button(frame, command=self.toggle_level, text='<< Basic Key Binding Entry') self.button_level.grid(row=2, column=0, stick='ew', padx=5, pady=5) self.toggle_level() def set_modifiers_for_platform(self): """Determine list of names of key modifiers for this platform. The names are used to build Tk bindings -- it doesn't matter if the keyboard has these keys; it matters if Tk understands them. The order is also important: key binding equality depends on it, so config-keys.def must use the same ordering. """ if sys.platform == "darwin": self.modifiers = ['Shift', 'Control', 'Option', 'Command'] else: self.modifiers = ['Control', 'Alt', 'Shift'] self.modifier_label = {'Control': 'Ctrl'} # Short name. def toggle_level(self): "Toggle between basic and advanced keys." if self.button_level.cget('text').startswith('Advanced'): self.clear_key_seq() self.button_level.config(text='<< Basic Key Binding Entry') self.frame_keyseq_advanced.lift() self.frame_help_advanced.lift() self.advanced_keys.focus_set() self.advanced = True else: self.clear_key_seq() self.button_level.config(text='Advanced Key Binding Entry >>') self.frame_keyseq_basic.lift() self.frame_controls_basic.lift() self.advanced = False def final_key_selected(self, event=None): "Handler for clicking on key in basic settings list." self.build_key_string() def build_key_string(self): "Create formatted string of modifiers plus the key." keylist = modifiers = self.get_modifiers() final_key = self.list_keys_final.get('anchor') if final_key: final_key = translate_key(final_key, modifiers) keylist.append(final_key) self.key_string.set(f"<{'-'.join(keylist)}>") def get_modifiers(self): "Return ordered list of modifiers that have been selected." mod_list = [variable.get() for variable in self.modifier_vars] return [mod for mod in mod_list if mod] def clear_key_seq(self): "Clear modifiers and keys selection." self.list_keys_final.select_clear(0, 'end') self.list_keys_final.yview('moveto', '0.0') for variable in self.modifier_vars: variable.set('') self.key_string.set('') def ok(self, event=None): keys = self.key_string.get().strip() if not keys: self.showerror(title=self.keyerror_title, parent=self, message="No key specified.") return if (self.advanced or self.keys_ok(keys)) and self.bind_ok(keys): self.result = keys self.grab_release() self.destroy() def cancel(self, event=None): self.result = '' self.grab_release() self.destroy() def keys_ok(self, keys): """Validity check on user's 'basic' keybinding selection. Doesn't check the string produced by the advanced dialog because 'modifiers' isn't set. """ final_key = self.list_keys_final.get('anchor') modifiers = self.get_modifiers() title = self.keyerror_title key_sequences = [key for keylist in self.current_key_sequences for key in keylist] if not keys.endswith('>'): self.showerror(title, parent=self, message='Missing the final Key') elif (not modifiers and final_key not in FUNCTION_KEYS + MOVE_KEYS): self.showerror(title=title, parent=self, message='No modifier key(s) specified.') elif (modifiers == ['Shift']) \ and (final_key not in FUNCTION_KEYS + MOVE_KEYS + ('Tab', 'Space')): msg = 'The shift modifier by itself may not be used with'\ ' this key symbol.' self.showerror(title=title, parent=self, message=msg) elif keys in key_sequences: msg = 'This key combination is already in use.' self.showerror(title=title, parent=self, message=msg) else: return True return False def bind_ok(self, keys): "Return True if Tcl accepts the new keys else show message." try: binding = self.bind(keys, lambda: None) except TclError as err: self.showerror( title=self.keyerror_title, parent=self, message=(f'The entered key sequence is not accepted.\n\n' f'Error: {err}')) return False else: self.unbind(keys, binding) return True
class LoginFrame: def __init__(self, url): self.url = url self.root = Tk() self.root.title("验证码") while True: try: image_bytes = urlopen(self.url).read() break except socket.timeout: print('获取验证码超时:%s\r\n重新获取.' % (self.url)) continue except urllib.error.URLError as e: if isinstance(e.reason, socket.timeout): print('获取验证码超时:%s\r\n重新获取.' % (self.url)) continue # internal data file data_stream = io.BytesIO(image_bytes) # open as a PIL image object self.pil_image = Image.open(data_stream) # convert PIL image object to Tkinter PhotoImage object self.tk_image = ImageTk.PhotoImage(self.pil_image) self.label = Label(self.root, image=self.tk_image, background='brown') self.label.pack(padx=5, pady=5) self.button = Button(self.root, text="刷新验证码", command=self.refreshImg) self.button.pack(padx=5, pady=5) randCodeLable = Label(self.root, text="验证码:") randCodeLable.pack(padx=5, pady=5) self.randCode = Entry(self.root) self.randCode.pack(padx=5, pady=5) self.loginButton = Button(self.root, text="登录", default=tkinter.ACTIVE) self.loginButton.pack(padx=5, pady=5) def refreshImg(self): url = self.url while True: try: image_bytes = urlopen(url).read() data_stream = io.BytesIO(image_bytes) self.pil_image = Image.open(data_stream) self.tk_image = ImageTk.PhotoImage(self.pil_image) self.label.configure(image=self.tk_image) break except socket.timeout: print('获取验证码超时:%s\r\n重新获取.' % (self.url)) continue except urllib.error.URLError as e: if isinstance(e.reason, socket.timeout): print('获取验证码超时:%s\r\n重新获取.' % (self.url)) continue # 显示URL地址指定图片 def show(self): w, h = self.pil_image.size # 窗体居中 width = w + 100 height = h + 160 ws = self.root.winfo_screenwidth() hs = self.root.winfo_screenheight() x = int((ws / 2) - (width / 2)) y = int((hs / 2) - (height / 2)) self.root.geometry('{}x{}+{}+{}'.format(width, height, x, y)) # 禁止窗体改变大小 self.root.resizable(False, False) self.root.mainloop() def quit(self): self.root.destroy()
class windowFrame(Frame): def __init__(self, parent): self.Data = Data() self.getReciepList() Frame.__init__(self, parent) self.parent = parent self.recipeList = None # Listbox self.recipeName = None # Entry self.prepTime = None # Entry self.prepTimeUnit = None # OptionMenu self.cookTime = None # Entry self.cookTimeUnit = None # OptionMenu self.ingredientName = None # Entry self.ingredientQuantity = None # Entry self.ingredientUnit = None # OptionMenu self.ingredientList = None # Listbox self.procedure = None # Text self.recipes = [] self.ingredients = [] self.activeRecipeID = {"lst": None, "db": None} # (listID, dbID) self.activeIngredientID = {"lst": None, "db": None} # (listID, dbID) self.initUI() self.bind_all("<Control-w>", self.onExit) self.bind_all("<Control-s>", self.recipeSave) # display an error message to the user def msgError(self, error): print("error: " + error) showerror("ERROR!", error) # dispaly a warning to the user def msgWarning(self, warning): showwarning("Warning!", warning) # display caution message to user def msgCaution(self, caution): return askokcancel("Caution!", caution) # Get current ingredient selection from ingredient list def getIngredientSelection(self): if self.ingredients == []: self.msgWarning("No ingredient selected. Try loading a recipe.") return -1 else: return self.ingredientList.index(ACTIVE) # Get current recipe selection from recipe list def getRecipeSelection(self): if self.recipes == []: self.msgError("No recipes available.") return -1 else: selection = list(self.recipeList.curselection()) if selection == []: self.msgError("No recipe selected.") return -1 else: return selection # retrieve recipe list from the database def getReciepList(self): self.recipes = self.Data.dbGetRecipeList() # retrieve recipe info from the database by recipe ID def getRecipeInfo(self, recipeID): return self.Data.dbGetRecipeInfo(recipeID) # retrieve ingredient info from the database by ingredient ID def getIngredientInfo(self, ingredientID): return self.Data.dbGetIngredientInfo(ingredientID) # Populate the recipe list from a provided list of recipes def populateIngredientList(self, ingredients): self.ingredients = sorted(self.ingredients, key=itemgetter(-1)) self.ingredientList.delete(0, END) for ingredient in self.ingredients: ingredientName = str(ingredient[2]) ingredientQuantity = str(ingredient[3]) ingredientUnit = str(ingredient[4]) self.ingredientList.insert(END, ingredientQuantity + " " + ingredientUnit + " of " + ingredientName) # Populate the recipe list from a provided list of recipes def populateRecipeList(self, recipes): self.recipeList.delete(0, END) for recipe in [recipe[1] for recipe in recipes]: self.recipeList.insert(END, recipe) # save currently loaded ingredient info to database def ingredientSaveInfo(self): if self.activeIngredientID["lst"] == None: self.msgWarning("No ingredient is loaded.") else: print("Saving ingredient info") name = self.ingredientName.get() quantity = self.ingredientQuantity.get() unit = self.ingredientUnit.get() ingredient = self.ingredients[self.activeIngredientID["lst"]] print(ingredient) ingredient = (ingredient[0], ingredient[1], name, quantity, unit, ingredient[-1]) print(ingredient) self.ingredients[self.activeIngredientID["lst"]] = ingredient self.populateIngredientList(self.ingredients) # load active ingredient info into GUI elements def ingredientLoadInfo(self, ID=None): if ID == None: currentSelection = self.getIngredientSelection() if currentSelection == -1: return -1 else: self.activeIngredientID["lst"] = currentSelection self.activeIngredientID["db"] = self.ingredients[currentSelection][0] print("\n\nLoading ingredient info for ID " + str(self.activeIngredientID)) ingredient = self.ingredients[self.activeIngredientID["lst"]] elif ID >= 0: self.activeIngredientID["lst"] = ID self.activeIngredientID["db"] = self.ingredients[ID][0] ingredient = self.ingredients[self.activeIngredientID["lst"]] elif ID == -1: print("Clearing ingredient info...") self.activeIngredientID = {"lst": None, "db": None} ingredient = ["", "", "", "", ""] name = ingredient[2] quantity = ingredient[3] unit = ingredient[4] self.ingredientName.delete(0, END) self.ingredientName.insert(END, name) self.ingredientQuantity.delete(0, END) self.ingredientQuantity.insert(END, quantity) self.ingredientUnit.delete(0, END) self.ingredientUnit.insert(END, unit) # Move an ingredient further up in the ingredient list def ingredientMoveUp(self): currentSelection = self.getIngredientSelection() if currentSelection == -1: return -1 elif currentSelection > 0: if ( currentSelection == self.activeIngredientID["lst"] or currentSelection - 1 == self.activeIngredientID["lst"] ): if not self.msgCaution( "Reordering the actively loaded ingredient could cause duplicate and deleted entries when saving. Continue?" ): return print("ingredient %d up\n\n" % currentSelection) self.ingredients[currentSelection] = self.ingredients[currentSelection][0:-1] + ( self.ingredients[currentSelection][-1] - 1, ) self.ingredients[currentSelection - 1] = self.ingredients[currentSelection - 1][0:-1] + ( self.ingredients[currentSelection - 1][-1] + 1, ) self.populateIngredientList(self.ingredients) self.ingredientList.select_set(currentSelection - 1) self.ingredientList.event_generate("<<ListboxSelect>>") # Move an ingredient further down in the ingredient list def ingredientMoveDown(self): ##################################################### # Bug: when repeatedly pressing the down button, # # every press after the first switches the order of # # the first ingredient with the second ingredient. # ##################################################### currentSelection = self.getIngredientSelection() if currentSelection == -1: return -1 elif currentSelection < len(self.ingredients) - 1: if ( currentSelection == self.activeIngredientID["lst"] or currentSelection + 1 == self.activeIngredientID["lst"] ): if not self.msgCaution( "Reordering the actively loaded ingredient could cause duplicate and deleted entries when saving. Continue?" ): return print("ingredient %d down\n\n" % currentSelection) self.ingredients[currentSelection] = self.ingredients[currentSelection][0:-1] + ( self.ingredients[currentSelection][-1] + 1, ) self.ingredients[currentSelection + 1] = self.ingredients[currentSelection + 1][0:-1] + ( self.ingredients[currentSelection + 1][-1] - 1, ) self.populateIngredientList(self.ingredients) self.ingredientList.select_set(currentSelection + 1) self.ingredientList.event_generate("<<ListboxSelect>>") # Add an ingredient slot to the bottom of the list def ingredientAdd(self): if self.activeRecipeID["lst"] == None: self.msgWarning("No recipe loaded.") else: blankIngredient = (None, self.activeRecipeID["db"], "blank", "?", "?", len(self.ingredients)) self.ingredients.append(blankIngredient) self.populateIngredientList(self.ingredients) self.ingredientLoadInfo(len(self.ingredients) - 1) # Delete the currently selected ingredient def ingredientDelete(self): ####################################################### # BUG: when pressing the delete button several times, # # all but the first press just deletes the first # # ingredient in the list. # ####################################################### currentSelection = self.getIngredientSelection() if currentSelection == -1 or self.activeRecipeID["lst"] == None: return -1 elif currentSelection < len(self.ingredients) and currentSelection >= 0: print("remove ingredient %d\n\n" % currentSelection) del self.ingredients[currentSelection] for ingredient in range(currentSelection, len(self.ingredients)): self.ingredients[ingredient] = self.ingredients[ingredient][0:-1] + ( self.ingredients[ingredient][-1] - 1, ) self.populateIngredientList(self.ingredients) self.ingredientList.select_set(currentSelection) self.ingredientList.event_generate("<<ListboxSelect>>") print(self.ingredients) # Display help: about dialogue def helpAbout(self): print("Digital Cookbook v1.0 - Theodore Lindsey") aboutDialog = Toplevel() aboutDialog.geometry("200x100+300+300") aboutDialog.title("About Digital Cookbook") Message(aboutDialog, text="Digital Cookbook v1.0\nTheodore Lindsey").pack(side=TOP, fill=BOTH, expand=1) Button(aboutDialog, text="Ok", command=aboutDialog.destroy).pack(side=TOP) # Import recipe from XML file - need to implement def xmlImport(self): print("Importing XML file...") # add a recipe to the database and create a blank space for the recipe to go - need to implement def recipeAdd(self): print("Adding recipe...") # delete the currently selected recipe - need to implement def recipeDelete(self): recipeID = self.recipeList.curselection() print(recipeID) if len(recipeID) == 0: self.msgError("No recipes selected.") return elif len(recipeID) > 1: if not askokcancel("Caution!", "Are you sure you want to delete these %d recipes?" % len(recipeID)): return print("\nDeleting %d recipes..." % len(recipeID)) else: if not askokcancel("Caution!", "Are you sure you want to delete this recipe?"): return print("\nDeleting recipe %d..." % recipeID) blankrecipe = ((None, "", None, "", "", "", "", ""), []) self.recipeLoad(blankrecipe) # load currently selected recipe def recipeLoad(self, recipe=None): activeSelection = self.getRecipeSelection() if activeSelection == -1: return -1 elif len(activeSelection) > 1: self.msgError("Too many recipes selected.") return -1 else: if recipe == None: listID = activeSelection[0] self.activeRecipeID["lst"] = listID self.activeRecipeID["db"] = self.recipes[listID][0] print(self.activeRecipeID) recipe = self.getRecipeInfo(self.activeRecipeID["db"]) else: print("Clearing recipe info...") self.activeRecipeID = {"lst": None, "db": None} self.ingredientLoadInfo(-1) print(recipe) name = recipe[0][1] servings = recipe[0][2] prepTime = recipe[0][3] prepTimeUnits = recipe[0][4] cookTime = recipe[0][5] cookTimeUnits = recipe[0][6] procedure = recipe[0][7] self.ingredients = recipe[1] self.recipeName.delete(0, END) self.recipeName.insert(END, name) self.prepTime.delete(0, END) self.prepTime.insert(END, prepTime) self.cookTime.delete(0, END) self.cookTime.insert(END, cookTime) self.populateIngredientList(self.ingredients) self.procedure.delete(0.0, END) self.procedure.insert(END, procedure) # save changes to active recipe to database def recipeSave(self, event=""): print(self.activeRecipeID) if self.activeRecipeID["lst"] == None: self.msgError("No active recipe to save.") return -1 listID = self.activeRecipeID["lst"] dbID = self.activeRecipeID["db"] name = self.recipeName.get() servings = 0 # self.recipes[listID][2] prepTime = self.prepTime.get() prepUnit = None # self.prepTimeUnit.????() cookTime = self.cookTime.get() cookUnit = None # self.cookTimeUnit.????() procedure = self.procedure.get(0.0, END) recipeInfo = (dbID, name, servings, prepTime, prepUnit, cookTime, cookUnit, procedure) recipe = (recipeInfo, self.ingredients) self.recipes[listID] = (dbID, name) self.populateRecipeList(self.recipes) # quit the program def onExit(self, event=""): print("Quitting...") sys.exit(0) # Create the UI layout 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) # placeholder function for unimplemented UI elements def placeholder(self): print("Coming soon!")