class VerticalScrollPack(Frame): def __init__(self, root): Frame.__init__(self, root) self.canvas = Canvas(root, borderwidth=0) self.frame = Frame(self.canvas) self.vsb = Scrollbar(root, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.vsb.set) self.vsb.pack(side="right", fill="y") self.canvas.pack(side="left", fill="both", expand=True) self.canvas.create_window((4, 4), window=self.frame, anchor="nw", tags="self.frame") self.frame.bind("<Configure>", self.onFrameConfigure) self.frame.bind_all("<MouseWheel>", self.on_mousewheel) def onFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure(scrollregion=self.canvas.bbox("all")) def on_mousewheel(self, event): self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units") def go_to_top(self, event=None): self.canvas.yview_moveto(0)
class VerticalScrollGrid(Frame): def __init__(self, root): Frame.__init__(self, root) self.canvas = Canvas(root, borderwidth=0) self.frame = Frame(self.canvas) self.vsb = Scrollbar(root, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.vsb.set) self.vsb.grid(row=0, column=1, sticky='NS') self.vsb.configure(command=self.canvas.yview) self.canvas.grid(row=0, column=0, sticky='NSEW') self.canvas.create_window((4, 4), window=self.frame, anchor="nw", tags="self.frame") self.frame.bind("<Configure>", self.onFrameConfigure) self.frame.bind_all("<MouseWheel>", self.on_mousewheel) # self.frame.bind("<Button-4>", self.on_mousewheel_up) # self.frame.bind("<Button-5>", self.on_mousewheel_down) def onFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure(scrollregion=self.canvas.bbox("all")) # def on_mousewheel_down(self, event): self.canvas.yview_scroll(1, "units") # def on_mousewheel_up(self, event): self.canvas.yview_scroll(-1, "units") def on_mousewheel(self, event): self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units") def go_to_top(self, event=None): self.canvas.yview_moveto(0)
# lbl_display = Label() # ent_text = Entry() # btn_start = Button(text="Start") # btn_finish = Button(text="Finish") # btn_restart = Button(text="Restart") # Label to display words # Highlight current word # matching character to character, no reversed # try again button # something like speedtest? frame = Frame(app, width=100, height=100) frame.bind_all("<Key>",key) frame.pack() # lbl_display.grid(row=0, column=0, columnspan=3) # ent_text.grid(row=1, column=0, columnspan=3) # btn_start.grid(row=2, column=0) # btn_finish.grid(row=2, column=1) # btn_restart.grid(row=2, column=2) # FEATURES # words per minute # accuracy # mistakes # difficulty levels
class SettingsWindow: def __init__(self, parent): self.parent = parent self.settings = Settings(self.parent.settings) self.settings.edit_flag = False self.frame0 = Frame(self.parent) self.title = Label(self.frame0, text='Settings', font='arial 20') self.BackButton = Button(self.title, text='<< Back', background='#888', foreground='#000', padx='0', width='8', pady='0', command=self.back) self.frame1 = Frame(self.parent, relief='groove', bd=1, height=150, width=480) self.frame1.pack_propagate(0) self.canvas = Canvas(self.frame1) self.frame_keys = Frame(self.canvas) self.scrollbar_keys = Scrollbar(self.frame1, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.scrollbar_keys.set) self.frame_keys.bind("<Configure>", self.scrolling) self.frame_keys.bind_all("<MouseWheel>", self._on_mousewheel) self.frame_actions = Frame(self.parent) self.AddButton = Button( self.frame_actions, text='Add key', background='#888', foreground='#000', padx='2', pady='0', width='10', command=lambda: self.add_key(self.frame_keys)) self.ClearButton = Button( self.frame_actions, text='Clear keys', background='#888', foreground='#000', padx='2', pady='0', width='10', command=lambda: self.delete_key('all', self.frame_keys)) self.GetKeyButton = Button(self.frame_actions, text='Get API key', background='#888', foreground='#000', padx='2', pady='0', width='10', command=lambda: webbrowser.open_new_tab( 'https://tinypng.com/developers')) self.SaveButton = Button( self.parent, text='Save', background='#888', foreground='#000', padx='2', pady='0', width='10', font='arial 12', command=lambda: self.parent.settings.save_settings( self.settings, self.parent.init_menu_window)) def show(self): self.frame0.pack(fill='x') self.title.pack(fill='x', pady=5, side='left', expand=True, ipady=4) self.BackButton.pack(side='left') self.frame1.pack(fill='x', ipadx=1) self.frame_keys.pack(ipadx=3) self.scrollbar_keys.pack(side='right', fill='y') self.canvas.pack() self.canvas.create_window((0, 0), window=self.frame_keys, anchor='nw') self.frame_keys.rowconfigure(0, pad=2) self.frame_keys.columnconfigure(0, pad=2) self.frame_keys.columnconfigure(1, pad=1) self.frame_keys.columnconfigure(2, pad=1) self.frame_keys.columnconfigure(3, pad=1) self.frame_actions.pack(fill='x', pady=10) self.AddButton.pack(side='left', padx=4) self.ClearButton.pack(side='left', padx=4) self.GetKeyButton.pack(side='right', padx=4) self.SaveButton.pack(pady=10) self.show_keys(self.frame_keys) def show_keys(self, target_frame): if len(self.settings.keys): target_frame.config(background='BLACK') Label(target_frame, text='№', width=3).grid(row=0, column=0) Label(target_frame, text='API key', width=30).grid(row=0, column=1) Label(target_frame, text="Compression count", width=15).grid(row=0, column=2) Label(target_frame, text="Action", width=11).grid(row=0, column=3) i = 1 for key in self.settings.keys: target_frame.rowconfigure(i, pad=1) Label(target_frame, text=i, width=3, height=2).grid(row=i, column=0) Label(target_frame, text=key, width=30, height=2).grid(row=i, column=1) Label(target_frame, text=self.settings.keys[key], width=15, height=2).grid(row=i, column=2) button_frame = Frame(target_frame, width=83, height=36) button_frame.pack_propagate(0) button_frame.grid(row=i, column=3) Button(button_frame, text='Edit', background='#888', foreground='#000', width=4, height=1, bd=1, command=lambda arg=key: self.edit_key( arg, target_frame)).pack(pady=5, side='left') Button(button_frame, text='Delete', background='#888', foreground='#000', width=6, height=1, bd=1, command=lambda arg=key: self.delete_key( arg, target_frame)).pack(pady=5, side='left') i += 1 else: target_frame.config(background='') Label(target_frame, text='Please add your TinyPNG API key', font='arial 15').pack(fill='x', padx=70, pady=4) Button(target_frame, text='Get API key', background='#888', foreground='#000', padx='2', pady='0', width='10', font='arial 15', command=lambda: webbrowser.open_new_tab( 'https://tinypng.com/developers')).pack() def scrolling(self, event): height = event.height if height > 150: height = 150 self.canvas.configure(scrollregion=self.canvas.bbox("all"), width=440, height=height) def _on_mousewheel(self, event): self.canvas.yview_scroll(int((-1 * (event.delta / 120))), "units") def add_key(self, target_frame=None): self.AddEditWindow(self.parent, self.settings) if target_frame: Window.destroy_elements(target_frame) self.show_keys(target_frame) def edit_key(self, key, target_frame=None): self.AddEditWindow(self.parent, self.settings, key) if target_frame: Window.destroy_elements(target_frame) self.show_keys(target_frame) def delete_key(self, key, target_frame=None): if key == 'all': if messagebox.askyesno(title='Delete?', message='Delete all keys?'): self.settings.keys.clear() else: del self.settings.keys[key] self.settings.edit_flag = True if target_frame: Window.destroy_elements(target_frame) self.show_keys(target_frame) def back(self): if self.settings.edit_flag: if messagebox.askyesno(title='Exit?', message='Exit without saving?'): self.parent.init_menu_window() else: self.parent.init_menu_window() class AddEditWindow: def __init__(self, root, settings, key=None): self.window = Toplevel(root) key_val = StringVar() self.window.transient(root) self.window.grab_set() self.window.focus_set() if key: button_text = 'Edit' key_val.set(key) else: button_text = 'Add' self.window.title(button_text + ' key (Transform Image TinyPNG)') key_entry = Entry(self.window, textvariable=key_val, width=50) key_entry.pack(pady=5) key_entry.focus_set() frame = Frame(self.window) frame.pack() Button(frame, text=button_text, width=10, background='#888', foreground='#000', command=lambda: self.add_or_edit_key( settings, key_val, key)).pack(side='left', padx=5) Button(frame, text='Cancel', width=10, background='#888', foreground='#000', command=self.window.destroy).pack(side='left', padx=5) Window.center_window(self.window) self.window.wait_window() def add_or_edit_key(self, settings, key_val, key): if tPNG.validate_key(key_val.get()): old_keys = settings.keys new_keys = {} if key: for old_key in old_keys: if old_key == key: new_keys.update({key_val.get(): ''}) else: new_keys.update({old_key: old_keys[old_key]}) old_keys.clear() old_keys.update(new_keys) else: old_keys.update({key_val.get(): ''}) settings.edit_flag = True self.window.destroy() else: Window.error_message('invalid_key')