class ScrollFrame(Frame): def __init__(self,parent): Frame.__init__(self, master=parent) canvas = tkinter.Canvas(self, highlightthickness=0) self.innerFrame = Frame(canvas) myscrollbar = Scrollbar(self, orient="vertical") myscrollbar.configure(command=canvas.yview) def scrollbarSet(top, bottom): # Hides and shows the scroll frame depending on need if float(top) > 0 or float(bottom) < 1: myscrollbar.grid(row=0, column=1, sticky="NS") else: pass myscrollbar.grid_remove() myscrollbar.set(top, bottom) canvas.configure(yscrollcommand = scrollbarSet) configureFunc = lambda _ : canvas.configure(scrollregion=canvas.bbox("all")) frameID = canvas.create_window((0,0), window=self.innerFrame, anchor='nw') self.innerFrame.bind("<Configure>",configureFunc) canvas.grid(row=0, column=0, sticky="NSEW") myscrollbar.grid(row=0, column=1, sticky="NS") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=0) #canvas.bind("<Configure>", lambda e : canvas.itemconfig(frameID, width=e.width)) canvas.bind("<Configure>", lambda e : canvas.configure(width=self.innerFrame.winfo_width()))
def page_bind_callback(*args, **kwargs): """ Bind a GUIPage into the notebook. This function contains the initialization logic for each GUIPage and also registers the callbacks that embody the dependency between pages. This function ignores all arguments. Returns ------- None """ if page_index + 1 > len(self.page_classes): return if page_index != len(self.pages): return from tkinter.ttk import Frame f = Frame(self.root) backend = TkBackend(master=f) page = self.page_classes[page_index](self.image_paths, block=False, backend=backend, defer_initial_draw=True) page.add_callback_for_writes(self.mark_dirty_later_than(page_index)) page.add_callback_for_writes(self.bind_next_page(page_index + 1)) f.bind('<Map>', page.full_reload) self.notebook.add(f, text=str(page)) self.pages.append(page)
def __init__(self, master, **kwargs): super(Instructions, self).__init__(master, **kwargs) def myfunction(event): canvas.configure(scrollregion=canvas.bbox("all"), width=360, height=220) canvas = Canvas(self) frame = Frame(canvas) myscrollbar = Scrollbar(self, orient="vertical", command=canvas.yview) canvas.configure(yscrollcommand=myscrollbar.set) myscrollbar.pack(side="right", fill="y") canvas.pack(side="left") canvas.create_window((0, 0), window=frame, anchor='nw') frame.bind("<Configure>", myfunction) #Label(frame, font=('a', 11), wraplength=350, justify='left', text=_('Step 1: Download information on your ancestors from familysearch.org using the \"Download Ancestor Data\" tab.')).grid(row=0,column=0) #Label(frame, font=('a', 11), wraplength=350, justify='left', text='Step 2: Edit the *.csv file that you downloaded in step 1 (it will open in excel or any other spreadsheet program). Fill in any missing information and write a short life summary for each person.').grid(row=2,column=0) #Label(frame, font=('a', 11), wraplength=350, justify='left', text='Step 3: Collect photos of your ancestors to put on the cards.').grid(row=4,column=0) #Label(frame, font=('a', 11), wraplength=350, justify='left', text='Step 4: Open the \"Make Cards\" tab. Select your *.csv file to make the cards from. Click \"Make\", and then select a photo for each person. If you don\'t have a photo for someone, just click \"Cancel\" when prompted. The cards will be generated in a folder called \"cards\".').grid(row=6,column=0) #Label(frame, font=('a', 11), wraplength=350, justify='left', text='Step 5: Pages of 6 cards each will be generated in a PDF called \"PrintableCards.pdf\" in the same directory as the app. Print the cards images and cut them out.').grid(row=8,column=0) Label( frame, font=('a', 11), wraplength=350, justify='left', text= 'Step 1: Download information on your ancestors from familysearch.org using the \"Download Ancestor Data\" tab.\n\nStep 2: Edit the *.csv file that you downloaded in step 1 (it will open in Excel or any other spreadsheet program). Fill in any missing information and write a short life summary (no more than 160 words) for each person. The cards can still be generated even if you are missing some information. Anything left blank in the spreadsheet will be blank on the cards.\n\nStep 3: Collect photos of your ancestors to put on the cards. This program will not crop or edit your photos in any way. Whatever you give to this program will be pasted to the cards, unedited.\n\nStep 4: Open the \"Make Cards\" tab. Select your *.csv file that contains all the data on your ancestors. Click \"Make\". You will then be prompted to select a photo for each person, one by one. If you don\'t have a photo for someone, just click \"Cancel\" when prompted. Individual cards will be generated in a folder called \"cards\". Printable pages of cards will be generated in a PDF called \"PrintableCards.pdf\" in the same directory where you placed this app.\n\nStep 5: Print the cards, cut them out, and fold them. The quality of the final product depends very much on how it is printed.' ).grid(row=0, column=0)
class Scrollable(Frame): def __init__(self, master, outer_kwargs={}): Frame.__init__(self, master, **outer_kwargs) self.master = master self.canvas = Canvas(self, borderwidth=0, highlightthickness=0) self.frame = Frame(self.canvas, borderwidth=0) self.scrollbar = Scrollbar(self, orient=VERTICAL, command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.scrollbar.set) self.scrollbar.pack(side=RIGHT, fill=Y, expand=False) self.canvas.pack(side=LEFT, fill=BOTH, expand=True) self.canvas.create_window((0, 0), window=self.frame, tag='self.frame') self.frame.bind( '<Configure>', lambda event: self.canvas.configure( scrollregion=self.canvas.bbox('all'))) self.canvas.bind( '<Configure>', lambda event: self.canvas.itemconfig('self.frame', width=event.width)) self.canvas.bind_all( '<MouseWheel>', lambda event: self.canvas.yview_scroll( -2 * event.delta // 120, 'units')) self.canvas.yview_moveto(0) def scroll_to(self, coord: float): self.canvas.yview_moveto(coord) def get_coord(self): return self.canvas.yview()
def add_label(section: ttk.Frame, text: str) -> ttk.Label: """Add text to the setting dialog. This is useful for explaining what some options do with more than a few words. The text is always as wide as the dialog is, even when the dialog is resized. """ label = ttk.Label(section, text=text) label.grid(column=0, columnspan=3, sticky='we', pady=10) section.bind( '<Configure>', (lambda event: cast(None, label.config(wraplength=event.width))), add=True) return label
class Page3(Frame): '''Note: the canvas used is from tkinter but the rest of the widgets are from ttk ''' def __init__(self, master): Frame.__init__(self, master) self.style = Style() self.style.configure('TButton', takefocus=0) self.canvas = Canvas(self, background='#471d0f') self.scroll_history = Scrollbar(self, orient='vertical', command=self.canvas.yview) self.moving_frame = Frame(self.canvas) self.canvas.create_window((0, 0), window=self.moving_frame, anchor='nw') self.moving_frame.bind( "<Configure>", lambda event: self.canvas.configure( scrollregion=self.canvas.bbox("all"))) self.canvas.configure(yscrollcommand=self.scroll_history.set) self.update_button = Button(self.moving_frame, text='Update History', command=self.update_history) self.scroll_history.pack(fill='both', side='right') self.canvas.pack(fill='both', side='left', expand=True) self.update_button.pack(anchor='ne', fill='x', expand=True) # Label(self.moving_frame, text='HISTORY HERE').pack(anchor='ne', fill='x') self.grid(row=0, column=0) def update_history(self): if Task.tasks: for task in Task.tasks: if task.on_display == False: history_instance = LabelFrame(self.moving_frame, text=task.task_name) Label( history_instance, text= f'Task Duration: {datetime.timedelta(seconds=task.task_duration)}' ).pack() Label( history_instance, text=f'Break Duration: {task.break_duration}').pack() Label(history_instance, text=f'Made on: {task.init_date}').pack() history_instance.pack(anchor='n', fill='both') task.on_display = True
class ScrollableFrame(Frame): def __init__(self, container, *args, **kwargs): super().__init__(container, *args, **kwargs) canvas = tk.Canvas(self) scrollbar = Scrollbar(self, orient="vertical", command=canvas.yview) self.scrollable_frame = Frame(canvas) self.scrollable_frame.bind( "<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
class ScrolledFrame(Frame): """ A scrolling frame inside a canvas. Based on tkinter.scrolledtext.ScrolledText """ def __init__(self, master: Widget ,**kwargs): self.container = Frame(master) self.canvas = Canvas(self.container, relief=None, highlightthickness=0) self.v_scroll = Scrollbar(self.container, orient=VERTICAL) self.h_scroll = Scrollbar(self.container, orient=HORIZONTAL) kwargs.update({'master': self.canvas}) Frame.__init__(self, **kwargs) self.__layout() self.__commands() # Copy geometry methods of self.container without overriding Frame # methods -- hack! text_meths = vars(Listbox).keys() methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys() methods = methods.difference(text_meths) for m in methods: if m[0] != '_' and m != 'config' and m != 'configure': setattr(self, m, getattr(self.container, m)) def __layout(self): self.canvas.grid(column=0, row=0, sticky=NW+SE) self.v_scroll.grid(column=1, row=0, sticky=N+S+E) self.h_scroll.grid(column=0, row=1, sticky=E+W+S) self.scrolled_frame = self.canvas.create_window((0,0), window=self, anchor=NW) def __commands(self): self.v_scroll.configure(command=self.canvas.yview) self.h_scroll.configure(command=self.canvas.xview) self.canvas.configure(yscrollcommand=self.v_scroll.set) self.canvas.configure(xscrollcommand=self.h_scroll.set) self.container.bind('<Configure>', self._container_configure_handler) self.bind('<Configure>', self._self_configure_handler) def _container_configure_handler(self, event: Event): self.canvas.configure( width=event.width - self.v_scroll.winfo_width(), height=event.height - self.h_scroll.winfo_height() ) def _self_configure_handler(self, *__): self.canvas.configure(scrollregion=self.canvas.bbox(ALL))
class ScrollableFrame(Frame): def __init__(self, root): Frame.__init__(self, root) self.canvas = ResizingCanvas(self, borderwidth=0) self.frame = Frame(self.canvas) self.vsb = Scrollbar( self, 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) def OnFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' # print "OnFrameConfigure" self.canvas.configure(scrollregion=self.canvas.bbox("all"))
class ScrollableTableWidget(tk.Frame): def __init__(self, container, *args, **kwargs): super().__init__(container, *args, **kwargs) frameTHeader = Frame(self) frameTHeader.pack(side=TOP, fill="x") frameTBody = Frame(self) frameTBody.pack(fill="both", expand=True) canvas_table_header = tk.Canvas(frameTHeader, height=20) self.scrollable_theader = Frame(canvas_table_header) self.scrollable_theader.bind( "<Configure>", lambda e: canvas_table_header.configure( scrollregion=canvas_table_header.bbox("all") ) ) canvas_table_body = tk.Canvas(frameTBody) def multiple_xview(*args): canvas_table_header.xview(*args) canvas_table_body.xview(*args) scrollbar_horizontal = Scrollbar(frameTBody, orient="horizontal", command=multiple_xview) scrollbar_vertical = Scrollbar(frameTBody, orient="vertical", command=canvas_table_body.yview) self.scrollable_frame = Frame(canvas_table_body) self.scrollable_frame.bind( "<Configure>", lambda e: canvas_table_body.configure( scrollregion=canvas_table_body.bbox("all") ) ) canvas_table_header.create_window((0, 0), window=self.scrollable_theader, anchor="nw") canvas_table_header.configure(xscrollcommand=scrollbar_horizontal.set) canvas_table_body.create_window((0, 0), window=self.scrollable_frame, anchor="nw") canvas_table_body.configure(yscrollcommand=scrollbar_vertical.set, xscrollcommand=scrollbar_horizontal.set) scrollbar_vertical.pack(side="right", fill="y") scrollbar_horizontal.pack(side="bottom", fill="x") canvas_table_header.pack(fill="x", expand=True) canvas_table_body.pack( fill="both", expand=True)
class ScrollFrame(Frame): def __init__(self, parent): Frame.__init__(self, master=parent) canvas = tkinter.Canvas(self, highlightthickness=0) self.innerFrame = Frame(canvas) myscrollbar = Scrollbar(self, orient="vertical") myscrollbar.configure(command=canvas.yview) def scrollbarSet(top, bottom): # Hides and shows the scroll frame depending on need if float(top) > 0 or float(bottom) < 1: myscrollbar.grid(row=0, column=1, sticky="NS") else: pass myscrollbar.grid_remove() myscrollbar.set(top, bottom) canvas.configure(yscrollcommand=scrollbarSet) configureFunc = lambda _: canvas.configure(scrollregion=canvas.bbox( "all")) frameID = canvas.create_window((0, 0), window=self.innerFrame, anchor='nw') self.innerFrame.bind("<Configure>", configureFunc) canvas.grid(row=0, column=0, sticky="NSEW") myscrollbar.grid(row=0, column=1, sticky="NS") self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=0) #canvas.bind("<Configure>", lambda e : canvas.itemconfig(frameID, width=e.width)) canvas.bind( "<Configure>", lambda e: canvas.configure(width=self.innerFrame.winfo_width()))
class PomodoroParams(Frame): def __init__(self, parent, **options): """ créer le Toplevel permettant de modifier les paramètres """ Frame.__init__(self, parent, **options) self.onglets = Notebook(self) self.onglets.pack(fill='both', expand=True) self.im_color = PhotoImage(master=self, file=IM_COLOR) self.im_plus = PhotoImage(master=self, file=IM_ADD) self.im_moins = PhotoImage(master=self, file=IM_DEL) self.okfct = self.register(only_nb) self.style = Style(self) self.nb_task = len(CONFIG.options("PomodoroTasks")) # --- Général (temps, police et langue) self.general = Frame(self.onglets, padding=10) self.general.columnconfigure(1, weight=1) self.onglets.add(self.general, text=_("General")) # --- --- Temps Label(self.general, text=_("Times (min)"), style='title.TLabel').grid(row=0, pady=4, padx=(2, 10), sticky="w") self.time_frame = Frame(self.general) self.time_frame.grid(row=0, column=1, sticky="w", padx=4) Label(self.time_frame, text=_("Work")).grid(row=0, padx=4, column=0) self.travail = Entry(self.time_frame, width=4, justify='center', validatecommand=(self.okfct, '%P'), validate='key') self.travail.insert(0, CONFIG.get("Pomodoro", "work_time")) self.travail.grid(row=0, column=1, padx=(0, 10)) Label(self.time_frame, text=_("Break")).grid(row=0, column=2, padx=4) self.pause = Entry(self.time_frame, width=4, justify='center', validatecommand=(self.okfct, '%P'), validate='key') self.pause.insert(0, CONFIG.get("Pomodoro", "break_time")) self.pause.grid(row=0, column=3, padx=(0, 10)) Label(self.time_frame, text=_("Rest")).grid(row=0, column=4, padx=4) self.rest = Entry(self.time_frame, width=4, justify='center', validatecommand=(self.okfct, '%P'), validate='key') self.rest.insert(0, CONFIG.get("Pomodoro", "rest_time")) self.rest.grid(row=0, column=5) Separator(self.general, orient='horizontal').grid(row=1, columnspan=2, sticky="ew", pady=10) # --- --- Police Label(self.general, text=_("Font"), style='title.TLabel').grid(row=2, sticky='nw', padx=(2, 10)) self.font = FontFrame(self.general, font=CONFIG.get('Pomodoro', 'font'), sample_text="02:17") self.font.grid(row=2, column=1, padx=4, sticky='w') Separator(self.general, orient='horizontal').grid(row=3, columnspan=2, sticky="ew", pady=10) # --- --- Opacity self.opacity = OpacityFrame(self.general) self.opacity.grid(row=5, columnspan=2, sticky='w', padx=(2, 4), pady=4) Separator(self.general, orient='horizontal').grid(row=6, columnspan=2, sticky="ew", pady=10) # --- --- Son self.sound = SoundFrame(self.general, CONFIG.get("Pomodoro", "beep"), mute=CONFIG.getboolean("Pomodoro", "mute"), label=_("Sound"), style='title.TLabel') self.sound.grid(row=7, columnspan=2, sticky='ew', pady=4) # --- Couleurs self.couleurs = Frame(self.onglets, padding=10) self.couleurs.columnconfigure(3, weight=1) self.onglets.add(self.couleurs, text=_("Colors")) self.bg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "background"), _("Background")) self.work_bg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "work_bg"), _("Background")) self.break_bg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "break_bg"), _("Background")) self.rest_bg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "rest_bg"), _("Background")) self.fg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "foreground"), _("Foreground")) self.work_fg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "work_fg"), _("Foreground")) self.break_fg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "break_fg"), _("Foreground")) self.rest_fg = ColorFrame(self.couleurs, CONFIG.get("Pomodoro", "rest_fg"), _("Foreground")) Label(self.couleurs, text=_("General"), style='title.TLabel').grid(row=0, column=0, pady=4, padx=(2, 10), sticky="w") self.bg.grid(row=0, column=1, sticky='e', padx=8, pady=4) self.fg.grid(row=0, column=2, sticky='e', padx=8, pady=4) Separator(self.couleurs, orient='horizontal').grid(row=1, sticky="ew", pady=10, columnspan=4) Label(self.couleurs, text=_("Work"), style='title.TLabel').grid(row=2, column=0, pady=4, padx=(2, 10), sticky="w") self.work_bg.grid(row=2, column=1, sticky='e', padx=8, pady=4) self.work_fg.grid(row=2, column=2, sticky='e', padx=8, pady=4) Separator(self.couleurs, orient='horizontal').grid(row=3, sticky="ew", pady=10, columnspan=4) Label(self.couleurs, text=_("Break"), style='title.TLabel').grid(row=4, column=0, pady=4, padx=(2, 10), sticky="w") self.break_bg.grid(row=4, column=1, sticky='e', padx=8, pady=4) self.break_fg.grid(row=4, column=2, sticky='e', padx=8, pady=4) Separator(self.couleurs, orient='horizontal').grid(row=5, sticky="ew", pady=10, columnspan=4) Label(self.couleurs, text=_("Rest"), style='title.TLabel').grid(row=6, column=0, pady=4, padx=(2, 10), sticky="w") self.rest_bg.grid(row=6, column=1, sticky='e', padx=8, pady=4) self.rest_fg.grid(row=6, column=2, sticky='e', padx=8, pady=4) # --- Tasks self.stats = Frame(self.onglets, padding=10) self.stats.columnconfigure(0, weight=1) self.stats.rowconfigure(2, weight=1) self.onglets.add(self.stats, text=_("Tasks")) # graph legend legend_frame = Frame(self.stats) Label(legend_frame, style='title.TLabel', text=_('Maximum number of rows in the legend')).pack(side='left') self.legend_row_nb = Entry(legend_frame, width=4, justify='center', validatecommand=(self.okfct, '%P'), validate='key') self.legend_row_nb.insert( 0, CONFIG.get('Pomodoro', 'legend_max_height', fallback='6')) self.legend_row_nb.pack(side='left', padx=4) # task colors can = Canvas(self.stats, bg=self.style.lookup('TFrame', 'background'), highlightthickness=0, width=1, relief='flat') scroll = AutoScrollbar(self.stats, orient='vertical', command=can.yview) can.configure(yscrollcommand=scroll.set) self.task_frame = Frame(can) can.create_window(0, 0, anchor='nw', window=self.task_frame) tasks = CONFIG.options("PomodoroTasks") tasks.sort() cmap = [CONFIG.get("PomodoroTasks", task) for task in tasks] self.tasks = {} self._tasks_btns = {} for i, (coul, task) in enumerate(zip(cmap, tasks)): self.tasks[task] = ColorFrame(self.task_frame, coul, task.capitalize()) self.tasks[task].grid(row=i, column=0, sticky='e', padx=4, pady=4) b = Button(self.task_frame, image=self.im_moins, padding=2, command=lambda t=task: self.del_task(t)) b.grid(row=i, column=1, sticky='w', padx=4, pady=4) self._tasks_btns[task] = b if len(tasks) == 1: self._tasks_btns[tasks[0]].state(['disabled']) legend_frame.grid(row=0, columnspan=2, sticky='w', pady=4) Label(self.stats, text=_('Colors in the statistic graph'), style='title.TLabel').grid(row=1, column=0, sticky='w', pady=4) can.grid(row=2, column=0, sticky='ewns') scroll.grid(row=2, column=1, sticky='ns') Button(self.stats, image=self.im_plus, command=self.add_task).grid(row=3, column=0, sticky='w') self.update_idletasks() can.configure(width=self.task_frame.winfo_reqwidth()) can.configure(scrollregion=can.bbox('all')) can.bind('<4>', lambda e: self._scroll(e, -1)) can.bind('<5>', lambda e: self._scroll(e, 1)) self.task_frame.bind( '<Configure>', lambda e: can.configure(scrollregion=can.bbox('all'))) def _scroll(self, event, delta): if event.widget.yview() != (0, 1): event.widget.yview_scroll(delta, 'units') def choix_couleur(self, type_mode): """ sélection de la couleur du fond/texte pour chaque mode (travail/pause/repos) """ coul = askcolor(self.style.lookup(type_mode + ".TButton", 'background'), parent=self) if coul: self.style.configure(type_mode + ".TButton", background=coul) def coul_stat(self, i): """ choix des couleurs pour l'affichage des stats """ coul = askcolor(self.style.lookup("t%i.TButton" % i, "background"), parent=self) if coul: self.style.configure("t%i.TButton" % i, background=coul) def valide(self): """Update config and return whether the pomodor timer should be stopped.""" old_tpsw = CONFIG.getint("Pomodoro", "work_time") old_tpsp = CONFIG.getint("Pomodoro", "break_time") old_tpsr = CONFIG.getint("Pomodoro", "rest_time") try: tpsw = int(self.travail.get()) except ValueError: # empty entry tpsw = 0 if tpsw == 0: tpsw = old_tpsw try: tpsp = int(self.pause.get()) except ValueError: tpsp = 0 if tpsp == 0: tpsp = old_tpsp try: tpsr = int(self.rest.get()) except ValueError: tpsr = 0 if tpsr == 0: tpsr = old_tpsr sound, mute = self.sound.get() font_prop = self.font.get_font() font = "{} {}".format(font_prop['family'].replace(' ', '\ '), font_prop['size']) try: legend_rows = int(self.legend_row_nb.get()) except ValueError: legend_rows = 0 if legend_rows == 0: legend_rows = CONFIG.getint("Pomodoro", "legend_max_height") if not os.path.exists(sound): showerror( _("Error"), _("The file {filepath} does not exists, the old file will be used." ).format(filepath=sound)) sound = CONFIG.get("Pomodoro", "beep") CONFIG.set("Pomodoro", "alpha", str(self.opacity.get_opacity())) CONFIG.set("Pomodoro", "font", font) CONFIG.set("Pomodoro", "background", self.bg.get_color()) CONFIG.set("Pomodoro", "foreground", self.fg.get_color()) CONFIG.set("Pomodoro", "work_time", str(tpsw)) CONFIG.set("Pomodoro", "work_bg", self.work_bg.get_color()) CONFIG.set("Pomodoro", "work_fg", self.work_fg.get_color()) CONFIG.set("Pomodoro", "break_time", str(tpsp)) CONFIG.set("Pomodoro", "break_bg", self.break_bg.get_color()) CONFIG.set("Pomodoro", "break_fg", self.break_fg.get_color()) CONFIG.set("Pomodoro", "rest_time", str(tpsr)) CONFIG.set("Pomodoro", "rest_bg", self.rest_bg.get_color()) CONFIG.set("Pomodoro", "rest_fg", self.rest_fg.get_color()) CONFIG.set("Pomodoro", "beep", sound) CONFIG.set("Pomodoro", "mute", str(mute)) CONFIG.set("Pomodoro", "legend_max_height", str(legend_rows)) for task, widget in self.tasks.items(): CONFIG.set("PomodoroTasks", task, widget.get_color()) return old_tpsw != tpsw or old_tpsp != tpsp or old_tpsr != old_tpsr def del_task(self, task): """ Suppression de tâches """ rep = askyesno( _("Confirmation"), _("Are you sure you want to delete the task {task}? This action cannot be undone." ).format(task=task.capitalize())) if rep: CONFIG.remove_option("PomodoroTasks", task) # remove stats db = sqlite3.connect(PATH_STATS) cursor = db.cursor() try: cursor.execute('DROP TABLE {}'.format( scrub(task.lower().replace(' ', '_')))) db.commit() except sqlite3.OperationalError: pass # no stats yet db.close() self.tasks[task].destroy() self._tasks_btns[task].destroy() del self.tasks[task] del self._tasks_btns[task] if len(CONFIG.options("PomodoroTasks")) == 1: CONFIG.set("PomodoroTasks", _("Work"), CMAP[0]) self._tasks_btns[CONFIG.options("PomodoroTasks")[0]].state( ['disabled']) save_config() def add_task(self): def ajoute(event=None): task = nom.get().lower().strip() if task in self.tasks: showerror( _("Error"), _("The task {task} already exists.").format(task=task), parent=self) elif task: coul = CMAP[(len(self.tasks) + 1) % len(CMAP)] i = self.task_frame.grid_size()[1] + 1 self.tasks[task] = ColorFrame(self.task_frame, coul, task.capitalize()) self.tasks[task].grid(row=i, column=0, sticky='e', padx=4, pady=4) b = Button(self.task_frame, image=self.im_moins, padding=2, command=lambda t=task: self.del_task(t)) b.grid(row=i, column=1, sticky='w', padx=4, pady=4) self._tasks_btns[task] = b self._tasks_btns[CONFIG.options("PomodoroTasks")[0]].state( ['!disabled']) top.destroy() top = Toplevel(self) top.title(_("New task")) top.transient(self) top.grab_set() nom = Entry(top, width=20, justify='center') nom.grid(row=0, columnspan=2, sticky="ew") nom.focus_set() nom.bind('<Key-Return>', ajoute) Button(top, text=_("Cancel"), command=top.destroy).grid(row=1, column=0) Button(top, text=_("Ok"), command=ajoute).grid(row=1, column=1) top.wait_window(top)
class ScrolledWindow(Frame): """ 1. Master widget gets scrollbars and a canvas. Scrollbars are connected to canvas scrollregion. 2. self.scrollwindow is created and inserted into canvas Usage Guideline: Assign any widgets as children of <ScrolledWindow instance>.scrollwindow to get them inserted into canvas __init__(self, parent, canv_w = 400, canv_h = 400, *args, **kwargs) docstring: Parent = master of scrolled window canv_w - width of canvas canv_h - height of canvas """ def __init__(self, parent, *args, **kwargs): """Parent = master of scrolled window canv_w - width of canvas canv_h - height of canvas """ super().__init__(parent, *args, **kwargs) self.parent = parent self.canv_w = kwargs.get("width", 10) self.canv_h = kwargs.get("height", 10) # creating a scrollbars self.yscrlbr = Scrollbar(self.parent) self.yscrlbr.grid(column=1, row=0, sticky='ns') # creating a canvas self.canv = Canvas(self.parent) self.canv.config(relief='flat', width=self.canv_w, heigh=self.canv_h, bd=2) # placing a canvas into frame self.canv.grid(column=0, row=0, sticky='nsew') # accociating scrollbar comands to canvas scroling self.yscrlbr.config(command=self.canv.yview) # creating a frame to inserto to canvas self.scrollwindow = Frame(self.parent) self.canv.create_window(0, 0, window=self.scrollwindow, anchor='nw') self.canv.config(yscrollcommand=self.yscrlbr.set, scrollregion=(0, 0, self.canv_w, self.canv_h)) self.yscrlbr.lift(self.scrollwindow) self.scrollwindow.bind('<Configure>', self._configure_window) self.scrollwindow.bind('<Enter>', self._bound_to_mousewheel) self.scrollwindow.bind('<Leave>', self._unbound_to_mousewheel) return def _bound_to_mousewheel(self, event): self.canv.bind_all("<MouseWheel>", self._on_mousewheel) def _unbound_to_mousewheel(self, event): self.canv.unbind_all("<MouseWheel>") def _on_mousewheel(self, event): self.canv.yview_scroll(int(-1 * (event.delta / 120)), "units") def _configure_window(self, event): # update the scrollbars to match the size of the inner frame size = (self.scrollwindow.winfo_reqwidth(), self.scrollwindow.winfo_reqheight()) try: self.canv.config(scrollregion='0 0 %s %s' % size) except: return if self.scrollwindow.winfo_reqwidth() != self.canv.winfo_width(): # update the canvas's width to fit the inner frame self.canv.config( width=min(self.scrollwindow.winfo_reqwidth(), self.canv_w)) s_h = self.scrollwindow.winfo_reqheight() if s_h != self.canv.winfo_height(): # update the canvas's width to fit the inner frame self.canv.config(height=min(s_h, self.canv_h))
class MainGUI(Frame): def __init__(self, kernel, master=None): self.master = master self.master.title("Stuffer 2000") Frame.__init__(self, master) self.kernel = kernel # Create the list of checkboxes and their values self.topic_dict = {} self.checkb_topics = [] self.checkb_ask = [] self.checkb_given = [] self.values_topics = [] self.values_ask = [] self.values_given = [] self.name_topics = [] self.name_subtop = [] self.toggle_1 = IntVar() self.toggle_2 = IntVar() self.toggle_3 = IntVar() self.toggle_1.set(1) self.toggle_2.set(1) self.toggle_3.set(1) # Create topics frame t_frame = self.build_topics_frame() # Create control frame frame_control = self.build_control_frame() # Layout t_frame.grid(row=0, column=0, sticky=S + E + W + N) frame_control.grid(row=0, column=1, sticky=S + N) # Bindings self.kernel.populate_topics(gui=self) def onFrameConfigure(self, event): """ Reset the scroll region to encompass the inner frame """ self.canvas_topics.configure( scrollregion=self.canvas_topics.bbox("all")) def build_topics_frame(self): """ Building and returning the frame that will be populated with topic widgets. """ # Create widgets t_frame = Frame(self.master, relief=GROOVE, borderwidth=2) lbl_topics = Label(t_frame, text="Include topics") self.canvas_topics = Canvas(t_frame, borderwidth=0, width=200, height=200) self.frame_topics = Frame(self.canvas_topics) self.frame_topics.grid(sticky=E + W + N + S) self.scroll_topics = Scrollbar(t_frame, orient="vertical", command=self.canvas_topics.yview) self.canvas_topics.configure(yscrollcommand=self.scroll_topics.set) # Layout lbl_topics.grid(row=0, column=0) self.scroll_topics.grid(row=1, column=3, sticky=E + N + S) self.canvas_topics.grid(row=1, column=0, columnspan=3, sticky=W + E + N + S) # Bindings self.canvas_topics.create_window((1, 1), window=self.frame_topics, anchor="nw", tags="self.frame", width="100000") self.frame_topics.bind("<Configure>", self.onFrameConfigure) return t_frame def build_control_frame(self): """ Building and returning the frame that holds the settings for the quiz. """ frame_control = Frame(self.master, relief=GROOVE, borderwidth=2) Label(frame_control, text="Quiz settings").grid(row=0, column=0) Label(frame_control, text="Number of questions:").grid(row=1, column=0, sticky=W + N) Label(frame_control, text="Save statistics:").grid(row=2, column=0, sticky=W + N) nrq_var = StringVar() nrq_var.set("10") Spinbox(frame_control, from_=1, to=500, width=3, textvariable=nrq_var).grid(row=1, column=1, sticky=E) save_stats = IntVar() save_stats.set(1) self.topic_dict["save_stats"] = save_stats self.topic_dict["number_of_questions"] = nrq_var Checkbutton(frame_control, text="", variable=save_stats).grid(row=2, column=1, sticky=E) Button(frame_control, text="Start quiz", command=self.kernel.launch_quiz).grid(row=10, column=1, sticky=S + E) return frame_control
def create_content(self, **kw): self.minsize(190, 190) self.on = False # is the timer on? if not CONFIG.options("Tasks"): CONFIG.set("Tasks", _("Work"), CMAP[0]) self._stats = None # --- colors self.background = { _("Work"): CONFIG.get("Pomodoro", "work_bg"), _("Break"): CONFIG.get("Pomodoro", "break_bg"), _("Rest"): CONFIG.get("Pomodoro", "rest_bg") } self.foreground = { _("Work"): CONFIG.get("Pomodoro", "work_fg"), _("Break"): CONFIG.get("Pomodoro", "break_fg"), _("Rest"): CONFIG.get("Pomodoro", "rest_fg") } self.rowconfigure(1, weight=1) self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) # nombre de séquence de travail effectuées d'affilée (pour # faire des pauses plus longues tous les 4 cycles) self.nb_cycles = 0 self.pomodori = IntVar(self, 0) # --- images self.im_go = PhotoImage(master=self, file=IM_START) self.im_stop = PhotoImage(master=self, file=IM_STOP) self.im_tomate = PhotoImage(master=self, file=IM_POMODORO) self.im_graph = PhotoImage(master=self, file=IM_GRAPH) # --- tasks list tasks_frame = Frame(self, style='pomodoro.TFrame') tasks_frame.grid(row=3, column=0, columnspan=3, sticky="wnse") tasks = [t.capitalize() for t in CONFIG.options("PomodoroTasks")] tasks.sort() self.task = StringVar(self, tasks[0]) self.menu_tasks = Menu(tasks_frame, relief='sunken', activeborderwidth=0) self.choose_task = Menubutton(tasks_frame, textvariable=self.task, menu=self.menu_tasks, style='pomodoro.TMenubutton') Label(tasks_frame, text=_("Task: "), style='pomodoro.TLabel', font="TkDefaultFont 12", width=6, anchor="e").pack(side="left", padx=4) self.choose_task.pack(side="right", fill="x", pady=4) # --- display self.tps = [CONFIG.getint("Pomodoro", "work_time"), 0] # time: min, sec self.activite = StringVar(self, _("Work")) self.titre = Label(self, textvariable=self.activite, font='TkDefaultFont 14', style='timer.pomodoro.TLabel', anchor="center") self.titre.grid(row=0, column=0, columnspan=2, sticky="we", pady=(4, 0), padx=4) self.temps = Label(self, text="{0:02}:{1:02}".format(self.tps[0], self.tps[1]), style='timer.pomodoro.TLabel', anchor="center") self.temps.grid(row=1, column=0, columnspan=2, sticky="nswe", padx=4) self.aff_pomodori = Label(self, textvariable=self.pomodori, anchor='e', padding=(20, 4, 20, 4), image=self.im_tomate, compound="left", style='timer.pomodoro.TLabel', font='TkDefaultFont 14') self.aff_pomodori.grid(row=2, columnspan=2, sticky="ew", padx=4) # --- buttons self.b_go = Button(self, image=self.im_go, command=self.go, style='pomodoro.TButton') self.b_go.grid(row=4, column=0, sticky="ew") self.b_stats = Button(self, image=self.im_graph, command=self.display_stats, style='pomodoro.TButton') self.b_stats.grid(row=4, column=1, sticky="ew") self._corner = Sizegrip(self, style="pomodoro.TSizegrip") self._corner.place(relx=1, rely=1, anchor='se') # --- bindings self.bind('<3>', lambda e: self.menu.tk_popup(e.x_root, e.y_root)) tasks_frame.bind('<ButtonPress-1>', self._start_move) tasks_frame.bind('<ButtonRelease-1>', self._stop_move) tasks_frame.bind('<B1-Motion>', self._move) self.titre.bind('<ButtonPress-1>', self._start_move) self.titre.bind('<ButtonRelease-1>', self._stop_move) self.titre.bind('<B1-Motion>', self._move) self.temps.bind('<ButtonPress-1>', self._start_move) self.temps.bind('<ButtonRelease-1>', self._stop_move) self.temps.bind('<B1-Motion>', self._move) self.b_stats.bind('<Enter>', self._on_enter) self.b_stats.bind('<Leave>', self._on_leave)
class BibleReferenceCollectionWindow( BibleResourceWindow ): #class BibleReferenceCollectionWindow( ChildWindow ): def __init__( self, parentApp, internalBible ): """ Given a collection name, try to open an empty Bible resource collection window. """ if BibleOrgSysGlobals.debugFlag: print( "BibleReferenceCollectionWindow.__init__( {}, {} )".format( parentApp, internalBible.name ) ) self.parentApp, self.internalBible = parentApp, internalBible BibleResourceWindow.__init__( self, self.parentApp, 'BibleReferenceCollectionWindow', internalBible.name ) #ChildWindow.__init__( self, self.parentApp, 'BibleResource' ) #self.winType = 'InternalBibleReferenceBox' self.geometry( INITIAL_REFERENCE_COLLECTION_SIZE ) self.minimumSize, self.maximumSize = MINIMUM_REFERENCE_COLLECTION_SIZE, MAXIMUM_REFERENCE_COLLECTION_SIZE self.minsize( *parseWindowSize( self.minimumSize ) ) self.maxsize( *parseWindowSize( self.maximumSize ) ) # Get rid of the default widgets self.vScrollbar.destroy() self.textBox.destroy() # Make a frame inside a canvas inside our window (in order to get a scrollbar) self.canvas = tk.Canvas( self, borderwidth=0, background="#ffffff" ) self.frame = Frame( self.canvas ) #, background="#ffffff" ) self.vsb = Scrollbar( self, orient="vertical", command=self.canvas.yview ) self.canvas.configure( yscrollcommand=self.vsb.set ) self.vsb.pack( side="right", fill="y" ) self.canvas.pack( side=tk.LEFT, fill=tk.BOTH, expand=True ) self.canvas.create_window( (4,4), window=self.frame, anchor="nw", tags="self.frame" ) self.frame.bind( "<Configure>", self.OnFrameConfigure ) #self.BCVUpdateType = 'ReferencesMode' # Leave as default self.folderPath = self.filename = self.filepath = None self.referenceBoxes = BibleReferenceBoxes( self ) # end of BibleReferenceCollectionWindow.__init__ def OnFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure( scrollregion=self.canvas.bbox("all") ) def setFolderPath( self, newFolderPath ): """ Store the folder path for where our internal Bible files will be. We're still waiting for the filename. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.setFolderPath( {} )").format( repr(newFolderPath) ) ) assert( self.filename is None ) assert( self.filepath is None ) self.folderPath = newFolderPath # end of BibleReferenceCollectionWindow.setFolderPath def createMenuBar( self ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceBox.createMenuBar()") ) self.menubar = tk.Menu( self ) #self['menu'] = self.menubar self.config( menu=self.menubar ) # alternative fileMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=fileMenu, label='File', underline=0 ) #fileMenu.add_command( label='Info...', underline=0, command=self.doShowInfo, accelerator=self.parentApp.keyBindingDict['Info'][0] ) #fileMenu.add_separator() #fileMenu.add_command( label='Rename', underline=0, command=self.doRename ) #fileMenu.add_separator() fileMenu.add_command( label='Close', underline=0, command=self.doClose, accelerator=self.parentApp.keyBindingDict['Close'][0] ) # close this window if 0: editMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=editMenu, label='Edit', underline=0 ) editMenu.add_command( label='Copy', underline=0, command=self.doCopy, accelerator=self.parentApp.keyBindingDict['Copy'][0] ) editMenu.add_separator() editMenu.add_command( label='Select all', underline=0, command=self.doSelectAll, accelerator=self.parentApp.keyBindingDict['SelectAll'][0] ) searchMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=searchMenu, label='Search', underline=0 ) searchMenu.add_command( label='Goto line...', underline=0, command=self.doGotoLine, accelerator=self.parentApp.keyBindingDict['Line'][0] ) searchMenu.add_separator() searchMenu.add_command( label='Find...', underline=0, command=self.doFind, accelerator=self.parentApp.keyBindingDict['Find'][0] ) searchMenu.add_command( label='Find again', underline=5, command=self.doRefind, accelerator=self.parentApp.keyBindingDict['Refind'][0] ) gotoMenu = tk.Menu( self.menubar ) self.menubar.add_cascade( menu=gotoMenu, label='Goto', underline=0 ) #gotoMenu.add_command( label='Previous book', underline=-1, command=self.doGotoPreviousBook ) #gotoMenu.add_command( label='Next book', underline=-1, command=self.doGotoNextBook ) #gotoMenu.add_command( label='Previous chapter', underline=-1, command=self.doGotoPreviousChapter ) #gotoMenu.add_command( label='Next chapter', underline=-1, command=self.doGotoNextChapter ) #gotoMenu.add_command( label='Previous section', underline=-1, command=self.notWrittenYet ) #gotoMenu.add_command( label='Next section', underline=-1, command=self.notWrittenYet ) #gotoMenu.add_command( label='Previous verse', underline=-1, command=self.doGotoPreviousVerse ) #gotoMenu.add_command( label='Next verse', underline=-1, command=self.doGotoNextVerse ) #gotoMenu.add_separator() #gotoMenu.add_command( label='Forward', underline=0, command=self.doGoForward ) #gotoMenu.add_command( label='Backward', underline=0, command=self.doGoBackward ) #gotoMenu.add_separator() #gotoMenu.add_command( label='Previous list item', underline=0, state=tk.DISABLED, command=self.doGotoPreviousListItem ) #gotoMenu.add_command( label='Next list item', underline=0, state=tk.DISABLED, command=self.doGotoNextListItem ) #gotoMenu.add_separator() #gotoMenu.add_command( label='Book', underline=0, command=self.doGotoBook ) #gotoMenu.add_separator() self._groupRadioVar.set( self.groupCode ) gotoMenu.add_radiobutton( label='Group A', underline=6, value='A', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label='Group B', underline=6, value='B', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label='Group C', underline=6, value='C', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) gotoMenu.add_radiobutton( label='Group D', underline=6, value='D', variable=self._groupRadioVar, command=self.changeBibleGroupCode ) self.viewMenu = tk.Menu( self.menubar, tearoff=False ) # Save this reference so we can disable entries later self.menubar.add_cascade( menu=self.viewMenu, label='View', underline=0 ) if self.contextViewMode == 'BeforeAndAfter': self._viewRadioVar.set( 1 ) #elif self.contextViewMode == 'BySection': self._viewRadioVar.set( 2 ) elif self.contextViewMode == 'ByVerse': self._viewRadioVar.set( 3 ) #elif self.contextViewMode == 'ByBook': self._viewRadioVar.set( 4 ) #elif self.contextViewMode == 'ByChapter': self._viewRadioVar.set( 5 ) else: print( self.contextViewMode ); halt self.viewMenu.add_radiobutton( label='Before and after...', underline=7, value=1, variable=self._viewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label='One section', underline=4, value=2, variable=self._viewRadioVar, command=self.changeBibleContextView ) self.viewMenu.add_radiobutton( label='Single verse', underline=7, value=3, variable=self._viewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label='Whole book', underline=6, value=4, variable=self._viewRadioVar, command=self.changeBibleContextView ) #self.viewMenu.add_radiobutton( label='Whole chapter', underline=6, value=5, variable=self._viewRadioVar, command=self.changeBibleContextView ) #if 'DBP' in self.winType: # disable excessive online use #self.viewMenu.entryconfigure( 'Whole book', state=tk.DISABLED ) #self.viewMenu.entryconfigure( 'Whole chapter', state=tk.DISABLED ) #resourcesMenu = tk.Menu( self.menubar, tearoff=False ) #self.menubar.add_cascade( menu=resourcesMenu, label=_('Resources'), underline=0 ) #resourcesMenu.add_command( label='Online (DBP)...', underline=0, command=self.doOpenDBPBibleResource ) #resourcesMenu.add_command( label='Sword module...', underline=0, command=self.doOpenSwordResource ) #resourcesMenu.add_command( label='Other (local)...', underline=1, command=self.doOpenInternalBibleResource ) toolsMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=toolsMenu, label='Tools', underline=0 ) toolsMenu.add_command( label='Options...', underline=0, command=self.notWrittenYet ) windowMenu = tk.Menu( self.menubar, tearoff=False ) self.menubar.add_cascade( menu=windowMenu, label='Window', underline=0 ) windowMenu.add_command( label='Bring in', underline=0, command=self.notWrittenYet ) helpMenu = tk.Menu( self.menubar, name='help', tearoff=False ) self.menubar.add_cascade( menu=helpMenu, underline=0, label='Help' ) helpMenu.add_command( label='Help...', underline=0, command=self.doHelp, accelerator=self.parentApp.keyBindingDict['Help'][0] ) helpMenu.add_separator() helpMenu.add_command( label='About...', underline=0, command=self.doAbout, accelerator=self.parentApp.keyBindingDict['About'][0] ) # end of BibleReferenceCollectionWindow.createMenuBar def refreshTitle( self ): self.title( "[{}] {} Bible Reference Collection".format( self.groupCode, self.internalBible.name ) ) #self.currentVerseKey.getBBB(), self.currentVerseKey.getChapterNumber(), self.currentVerseKey.getVerseNumber() ) ) # end if BibleReferenceCollectionWindow.refreshTitle #def openDBPBibleReferenceBox( self, moduleAbbreviation, windowGeometry=None ): #""" #Create the actual requested DBP Bible resource window. #Returns the new DBPBibleReferenceBox object. #""" #if BibleOrgSysGlobals.debugFlag: #print( exp("openDBPBibleReferenceBox()") ) #self.parentApp.setDebugText( "openDBPBibleReferenceBox..." ) #assert( moduleAbbreviation and isinstance( moduleAbbreviation, str ) and len(moduleAbbreviation)==6 ) ##tk.Label( self, text=moduleAbbreviation ).pack( side=tk.TOP, fill=tk.X ) #dBRB = DBPBibleReferenceBox( self, moduleAbbreviation ) #if windowGeometry: halt; dBRB.geometry( windowGeometry ) #if dBRB.DBPModule is None: #logging.critical( exp("Application.openDBPBibleReferenceBox: Unable to open resource {}").format( repr(moduleAbbreviation) ) ) #dBRB.destroy() #showerror( self, APP_NAME, _("Sorry, unable to open DBP resource") ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Failed openDBPBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return None #else: #dBRB.updateShownBCV( self.parentApp.getVerseKey( dBRB.groupCode ) ) #self.referenceBoxes.append( dBRB ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Finished openDBPBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return dBRB ## end of BibleReferenceCollectionWindow.openDBPBibleReferenceBox #def openInternalBibleReferenceBox( self, modulePath, windowGeometry=None ): #""" #Create the actual requested local/internal Bible resource window. #Returns the new InternalBibleReferenceBox object. #""" #if BibleOrgSysGlobals.debugFlag: #print( exp("openInternalBibleReferenceBox()") ) #self.parentApp.setDebugText( "openInternalBibleReferenceBox..." ) ##tk.Label( self, text=modulePath ).pack( side=tk.TOP, fill=tk.X ) #iBRB = InternalBibleReferenceBox( self, modulePath ) #if windowGeometry: halt; iBRB.geometry( windowGeometry ) #if iBRB.internalBible is None: #logging.critical( exp("Application.openInternalBibleReferenceBox: Unable to open resource {}").format( repr(modulePath) ) ) #iBRB.destroy() #showerror( self, APP_NAME, _("Sorry, unable to open internal Bible resource") ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Failed openInternalBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return None #else: #iBRB.updateShownBCV( self.parentApp.getVerseKey( iBRB.groupCode ) ) #self.referenceBoxes.append( iBRB ) #if BibleOrgSysGlobals.debugFlag: self.parentApp.setDebugText( "Finished openInternalBibleReferenceBox" ) #self.parentApp.setReadyStatus() #return iBRB ## end of BibleReferenceCollectionWindow.openInternalBibleReferenceBox #def openBox( self, boxType, boxSource ): #""" #(Re)open a text box. #""" #if boxType == 'DBP': self.openDBPBibleReferenceBox( boxSource ) #elif boxType == 'Sword': self.openSwordBibleReferenceBox( boxSource ) #elif boxType == 'Internal': self.openInternalBibleReferenceBox( boxSource ) #elif BibleOrgSysGlobals.debugFlag: halt ## end of BibleReferenceCollectionWindow.openBox def updateShownBCV( self, newReferenceVerseKey ): """ """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceCollectionWindow.updateShownBCV( {} ) for".format( newReferenceVerseKey ), self.moduleID ) assert( isinstance( newReferenceVerseKey, SimpleVerseKey ) ) refBBB, refC, refV, refS = newReferenceVerseKey.getBCVS() BBB, C, V, S = self.BibleOrganisationalSystem.convertFromReferenceVersification( refBBB, refC, refV, refS ) newVerseKey = SimpleVerseKey( BBB, C, V, S ) self.updateShownReferences( mapReferencesVerseKey( newVerseKey ) ) # end of BibleReferenceCollectionWindow.updateShownBCV def updateShownReferences( self, newReferencesVerseKeys ): """ Updates self.textBox in various ways depending on the contextViewMode held by the enclosing window. The new verse key is in the reference versification system. Leaves the textbox in the disabled state. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( "BibleReferenceCollectionWindow.updateShownReferences( {}) for".format( newReferencesVerseKeys ), self.moduleID ) #print( "contextViewMode", self.contextViewMode ) assert( isinstance( newReferencesVerseKeys, list ) or newReferencesVerseKeys is None ) # Remove any previous resource boxes for referenceBox in self.referenceBoxes: referenceBox.destroy() self.referenceBoxes = BibleReferenceBoxes( self ) if newReferencesVerseKeys is not None: # open new resource boxes assert( isinstance( newReferencesVerseKeys, list ) ) for newReferencesVerseKey in newReferencesVerseKeys: assert( isinstance( newReferencesVerseKey, FlexibleVersesKey ) ) for verseKeyObject in newReferencesVerseKey: #print( " BRCWupdateShownReferences: {}".format( verseKeyObject ) ) referenceBox = BibleReferenceBox( self.frame, self.parentApp, self.internalBible, verseKeyObject ) self.referenceBoxes.append( referenceBox ) self.currentVerseKeys = newReferencesVerseKeys # The FlexibleVersesKey object self.refreshTitle() # end of BibleReferenceCollectionWindow.updateShownReferences def doHelp( self, event=None ): """ Display a help box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.doHelp()") ) from Help import HelpBox helpInfo = ProgNameVersion helpInfo += "\nHelp for {}".format( self.winType ) helpInfo += "\n Keyboard shortcuts:" for name,shortcut in self.myKeyboardBindingsList: helpInfo += "\n {}\t{}".format( name, shortcut ) hb = HelpBox( self, self.genericWindowType, helpInfo ) # end of BibleReferenceCollectionWindow.doHelp def doAbout( self, event=None ): """ Display an about box. """ if BibleOrgSysGlobals.debugFlag and debuggingThisModule: print( exp("BibleReferenceCollectionWindow.doAbout()") ) from About import AboutBox aboutInfo = ProgNameVersion aboutInfo += "\nInformation about {}".format( self.winType ) ab = AboutBox( self, self.genericWindowType, aboutInfo )
def makeFrameWidget(self): ''' makes frame widget ''' #make regular frame stuff -- label and tier self.frames_canvas = Canvas(self.canvas_frame, width=self.canvas_width, height=self.canvas_height, background='gray', highlightthickness=0) frames_label = Canvas(self.frame, width=self.label_width, height=self.canvas_height, highlightthickness=0, background='gray') frames_label.create_text(self.label_width, 0, anchor='ne', justify='center', text='frames: ', width=self.label_width, activefill='blue') # make subframe to go on top of label canvas sbframe = Frame(frames_label) #put new widgets onto subframe offset = self.app.Data.getFileLevel('offset') if offset != None: self.frame_shift.set(offset) # for audio alignment go_btn = Button(sbframe, text='Offset', command=self.shiftFrames, takefocus=0) # minmax = len(self.app.Audio.sfile)*1000 txtbox = Spinbox(sbframe, textvariable=self.frame_shift, width=7, from_=-10000000, to=10000000) txtbox.bind('<Escape>', lambda ev: sbframe.focus()) txtbox.bind('<Return>', lambda ev: self.shiftFrames()) go_btn.grid(row=0, column=0, sticky='e') txtbox.grid(row=0, column=1, sticky='e') # put subframe on canvas window = frames_label.create_window(self.label_width * .3, self.canvas_height / 3, anchor='nw', window=sbframe) # ensure position of subframe gets updated frames_label.bind( '<Configure>', lambda e: frames_label.itemconfig(window, width=e.width)) sbframe.bind( '<Configure>', lambda e: frames_label.configure( scrollregion=frames_label.bbox("all"))) self.TkWidgets.append({ 'name': self.frameTierName, 'frames': self.frames_canvas, 'frames-label': frames_label }) self.frames_canvas.bind("<Button-1>", self.getClickedFrame)
def init_ui(self): self.master.title("VAD Test") self.pack(side="top", fill=BOTH, expand=True) # VAD Controls section for controlling these VAD settings: controls_frame = LabelFrame(self, text="Controls", height=30) Label(controls_frame, text="tau_up:").grid(row=0, column=0) self.tau_up = Entry(controls_frame, width=15) self.tau_up.grid(row=1, column=0) Label(controls_frame, text="tau_down:").grid(row=0, column=1) self.tau_down = Entry(controls_frame, width=15) self.tau_down.grid(row=1, column=1) Label(controls_frame, text="threshold_up:").grid(row=0, column=2) self.threshold_up = Entry(controls_frame, width=15) self.threshold_up.grid(row=1, column=2) Label(controls_frame, text="threshold_down:").grid(row=0, column=3) self.threshold_down = Entry(controls_frame, width=15) self.threshold_down.grid(row=1, column=3) Label(controls_frame, text="large_input:").grid(row=0, column=4) self.large_input = Entry(controls_frame, width=15) self.large_input.grid(row=1, column=4) Label(controls_frame, text="gain_att:").grid(row=0, column=5) self.gain_att = Entry(controls_frame, width=15) self.gain_att.grid(row=1, column=5) Label(controls_frame, text="level_threshold:").grid(row=0, column=6) self.level_threshold = Entry(controls_frame, width=15) self.level_threshold.grid(row=1, column=6) controls_frame.pack(side=TOP) # Input section input_frame = LabelFrame(self, text="Input") input_frame.bind("-", self.on_minus_key) input_frame.bind("+", self.on_plus_key) input_frame.pack(fill=X) self.play_button = Button(input_frame, text="Play", command=self.on_play_button_click) self.play_button.pack(side=RIGHT, padx=4) self.rec_button = Button(input_frame, text="Rec", command=self.on_rec_button_click) self.rec_button.pack(side=RIGHT, padx=4) self.wav_filename_entry = Entry(input_frame, width=24) self.wav_filename_entry.pack(fill=X) self.wav_filename_entry.delete(0, END) # Feature section features_frame = LabelFrame(self, text="Features") features_frame.pack(fill=X) features_control_frame = Frame(features_frame) features_control_frame.pack(fill=X) load_features_button = Button(features_control_frame, text="Load", command=self.on_load_featurizer_model) load_features_button.pack(side=RIGHT) self.features_entry = Entry(features_control_frame, width=8) self.features_entry.pack(fill=X) self.features_entry.delete(0, END) viz_frame = Frame(features_frame) viz_frame.bind("%w", self.on_resized) viz_frame.pack(fill=X) self.features_figure = Figure(figsize=(5, 4), dpi=96) self.subplot = self.features_figure.add_subplot(211) self.subplot2 = self.features_figure.add_subplot(212) self.canvas = FigureCanvasTkAgg(self.features_figure, master=viz_frame) self.canvas.draw() self.canvas.show() self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=True) # Output section output_frame = LabelFrame(self, text="Output") output_frame.pack(fill=BOTH, expand=True) self.bind("<Configure>", self.on_resized) self.output_text = Text(output_frame) self.output_text.pack(fill=BOTH, padx=4, expand=True)
class GUI_filter(Frame): def __init__(self, kernel, master=None, title="", session_type="N/A"): self.title = title self.session_type = session_type Frame.__init__(self, master) self.kernel = kernel def launch(self): self.grid() self.master.title(self.title) self.master.geometry("950x950+500+100") # Use this list to keep references to the images used in the buttons. Without a reference # the garbage collector will remove them! self.images = [] # Create option frame where the buttons are located and the view frame where the images # are shown self.master.rowconfigure(1, weight=1) self.master.columnconfigure(0, weight=1) self.master.bind('<Configure>', self.kernel.layout) self.master.protocol("WM_DELETE_WINDOW", self.kernel.close_filter) self.option_frame = Frame(self.master, bg="white") self.option_frame.grid(row=0, column=0, sticky=W + E + N + S) self.view_canvas = ttk.Canvas(self.master, borderwidth=0, background="white") self.view_frame = Frame(self.view_canvas, background="white") self.vsb = Scrollbar(self.master, orient="vertical", command=self.view_canvas.yview) self.view_canvas.configure(yscrollcommand=self.vsb.set) self.vsb.grid(row=1, column=0, sticky=E + N + S) self.view_canvas.grid(row=1, column=0, sticky=W + E + N + S) self.view_canvas.create_window((4, 4), window=self.view_frame, anchor="nw", tags="self.frame") self.view_frame.bind("<Configure>", self.onFrameConfigure) # This list is used to keep a reference of the images displayed in the view frame. self.photos = [] # This list is to be able to reference the labels and delete them when the filter # is updated. self.view_labels = [] self.view_checks = [] self.view_ch_val = [] btn_frame = Frame(self.option_frame, bg="white") btn_frame.grid(row=0, column=2, rowspan=1, padx=(30, 30), sticky=W + E + N + S) btn = Button(btn_frame, text="Pick", command=self.kernel.send_pick) btn.grid(row=0, column=0, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Point", command=self.kernel.send_point) btn.grid(row=1, column=0, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Show labels", command=self.kernel.send_showLabels) btn.grid(row=2, column=0, padx=(5, 5), sticky=N + W + E) self.start_btn = Button(btn_frame, text="Start", command=self.kernel.start) self.start_btn.grid(row=0, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="End session", command=self.kernel.close_filter) btn.grid(row=1, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Unselect all", command=self.kernel.unselect) btn.grid(row=2, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Remove", command=self.kernel.find_and_remove) btn.grid(row=3, column=1, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Hide labels", command=self.kernel.send_hideLabels) btn.grid(row=3, column=0, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Clear", command=self.kernel.send_clear) btn.grid(row=0, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Planning failed", command=self.kernel.send_sorryPlanning) btn.grid(row=1, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Grasping failed", command=self.kernel.send_sorryGrasping) btn.grid(row=2, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="Not understand", command=self.kernel.send_badRequest) btn.grid(row=3, column=3, padx=(5, 5), sticky=N + W + E) btn = Button(btn_frame, text="New request", command=self.kernel.send_newRequest) btn.grid(row=2, column=2, padx=(5, 5), sticky=N + W + E) self.send = IntVar() self.send.set(1) Checkbutton(btn_frame, text="Send data to server", variable=self.send, bg="white").grid(row=3, column=2, sticky=N + W + E) img1 = ImageTk.PhotoImage( PIL.Image.open( resource_filename("Commands.resources.images", "back.png"))) self.init_lbl = Label(btn_frame, image=img1, bg="white") self.init_lbl.grid(row=0, column=2, padx=(5, 5), sticky=N + W + E) self.images.append(img1) # Set up the option frame. Start with the color radiobuttons self.color_frame = Frame(self.option_frame, background="white") self.color_frame.grid(row=0, column=0, rowspan=2, padx=(30, 30), sticky=W + E + N + S) lbl = Label(self.color_frame, text="Color filter", background="white") lbl.grid(row=0, column=0, columnspan=5) self.color = StringVar() self.color.set("all") colors = self.kernel.get_colors() image = PIL.Image.open( resource_filename("Commands.resources.images", "default_dont_know.png")) photo_def = ImageTk.PhotoImage(image) image_select = PIL.Image.open( resource_filename("Commands.resources.images", "default_dont_know_sel.png")) photo_select_def = ImageTk.PhotoImage(image_select) rb1 = Radiobutton(self.color_frame, image=photo_def, selectimage=photo_select_def, variable=self.color, value="all", command=lambda: self.kernel.update_filter(self), indicatoron=False) rb1.grid(row=1, column=0, rowspan=2, sticky=W + E + N + S) self.images.append(photo_select_def) self.images.append(photo_def) for i, col in enumerate(colors): image = PIL.Image.open( resource_filename("Commands.resources.images", "{}.png".format(col))) photo = ImageTk.PhotoImage(image) image_select = PIL.Image.open( resource_filename("Commands.resources.images", "{}_sel.png".format(col))) photo_select = ImageTk.PhotoImage(image_select) rb = Radiobutton(self.color_frame, image=photo, selectimage=photo_select, variable=self.color, value=col, command=lambda: self.kernel.update_filter(self), indicatoron=False) rb.grid(row=(int((i + 1) / 5) * 2) + 1, column=(i + 1) % 5, rowspan=2, sticky=W + E + N + S) rb.deselect() self.images.append(photo_select) self.images.append(photo) self.shape_frame = Frame(self.option_frame, background="white") self.shape_frame.grid(row=0, column=1, rowspan=2, padx=(30, 30), sticky=W + E + N + S) lbl = Label(self.shape_frame, text="Shape filter", background="white") lbl.grid(row=0, column=0, columnspan=5) self.shape = StringVar() self.shape.set("all") shapes = self.kernel.get_shapes() rb1 = Radiobutton(self.shape_frame, image=photo_def, selectimage=photo_select_def, variable=self.shape, value="all", command=lambda: self.kernel.update_filter(self), indicatoron=False) rb1.grid(row=1, column=0, rowspan=2, sticky=W + E + N + S) for i, sha in enumerate(shapes): image = PIL.Image.open( resource_filename("Commands.resources.images", "shape_{}.png".format(sha))) photo = ImageTk.PhotoImage(image) image_select = PIL.Image.open( resource_filename("Commands.resources.images", "shape_{}_sel.png".format(sha))) photo_select = ImageTk.PhotoImage(image_select) rb = Radiobutton(self.shape_frame, image=photo, selectimage=photo_select, variable=self.shape, value=sha, command=lambda: self.kernel.update_filter(self), indicatoron=False) rb.grid(row=(int((i + 1) / 5) * 2) + 1, column=(i + 1) % 5, rowspan=2, sticky=W + E + N + S) rb.deselect() self.images.append(photo_select) self.images.append(photo) self.kernel.update_filter(self) def onFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.view_canvas.configure(scrollregion=self.view_canvas.bbox("all"))