Пример #1
0
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()))
Пример #2
0
        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)
Пример #3
0
    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)
Пример #4
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()
Пример #5
0
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
Пример #6
0
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)
Пример #8
0
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))
Пример #9
0
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"))
Пример #10
0
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)
Пример #11
0
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()))
Пример #12
0
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))
Пример #14
0
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
Пример #15
0
    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)
Пример #16
0
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 )
Пример #17
0
    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)
Пример #18
0
    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)
Пример #19
0
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"))