Module tk_steroids.dialogs
Functions
def main()
def popup(tk_parent, widget_class, args=[], kwargs={}, title=None, grid_pos=(1, 1), sticky='NSWE', grid_weights=(1, 1), close_button=True)
-
Launch a (uninitialized) tkinter widget in a Toplevel window, using grid positioning system.
Options
tk_parent : object Parent widget widget_class: class The (uninitialized) widget to be opened in the toplevel args: list Additional arguments passed to the widget, corresponding to widget(toplevel, args[0], args[1], …) kwargs : dict Additional keyword arguments to the widget. title : string Optional title to the widow grid_pos : tuple Position (row, column) of the created widget sticky : string Tkinter grid sticky option for the widget grid_weights: tuple Row and column weights for grid_{row,column}configure at grid_pos close_button : bool If True, add close button
Returns
toplevel
:object
- The toplevel window
widget
:object
- The initialized widget
def popup_tickselect(tk_parent, *args, title='Make selection', **kwargs)
Classes
class TickSelect (parent, selections, callback_on_ok, close_on_ok=True, ticked=None, callback_args=[], callback_kwargs={}, single_select=False, search=10)
-
User sets ticks to select items from selections group and presses ok -> callback_on_ok gets called as the made selections list as the only input argument.
selections List of strings callback_on_ok Callable, whom a sublist of selections is passed close_on_ok Call root.destroy() when pressing ok ticked A sublist of selections that should be enabled by default. callback_args A list of secondary callback arguments, passed after the selections callback_kwargs A dict of callback keyword arguments single_select Use Radiobuttons instead Checkbutton, allowing only one item to be selected. search : int or bool If True, show the seach bar, false hide. If integer, specifies the number of selections when to start showing the search bar.
Expand source code
class TickSelect(tk.Frame): ''' User sets ticks to select items from selections group and presses ok -> callback_on_ok gets called as the made selections list as the only input argument. ''' def __init__(self, parent, selections, callback_on_ok, close_on_ok=True, ticked=None, callback_args=[], callback_kwargs={}, single_select=False, search=10): ''' selections List of strings callback_on_ok Callable, whom a sublist of selections is passed close_on_ok Call root.destroy() when pressing ok ticked A sublist of selections that should be enabled by default. callback_args A list of secondary callback arguments, passed after the selections callback_kwargs A dict of callback keyword arguments single_select Use Radiobuttons instead Checkbutton, allowing only one item to be selected. search : int or bool If True, show the seach bar, false hide. If integer, specifies the number of selections when to start showing the search bar. ''' tk.Frame.__init__(self, parent) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) self.callback_on_ok = callback_on_ok self.selections = selections self.close_on_ok = close_on_ok self.callback_args = callback_args self.callback_kwargs = callback_kwargs # Add scrollbar - adds canvas and extra frame canvas = tk.Canvas(self) frame = tk.Frame(canvas) frame.grid(row=0, column=0, sticky='NSEW') scrollbar = tk.Scrollbar(self, orient='vertical', command=canvas.yview) scrollbar.grid(row=0, column=1, sticky='NS') canvas.configure(yscrollcommand=scrollbar.set) canvas.create_window((0,0), window=frame, anchor='nw') canvas.grid_rowconfigure(0, weight=1) canvas.grid(row=0, column=0, sticky='NSEW') self.checkbuttons = [] # Create tickboxes and entries if single_select: N_selections = 1 else: N_selections = len(self.selections) tk_variables = [tk.IntVar() for i in range(N_selections)] for i_row, selection in enumerate(self.selections): if single_select: checkbutton = tk.Radiobutton(frame, text=selection, variable=tk_variables[0], value=i_row) else: checkbutton = tk.Checkbutton(frame, text=selection, variable=tk_variables[i_row]) checkbutton.grid(sticky='W') # Set ticked if not ticked is None and selection in ticked: checkbutton.select() self.checkbuttons.append(checkbutton) # Buttons under the selections list self.buttons_frame = tk.Frame(self) tk.Button(self, text='Ok', command=self.on_ok).grid(row=1, column=1) tk.Button(self.buttons_frame, text='Select all', command=self.select_all).grid(row=1, column=0) tk.Button(self.buttons_frame, text='Inverse', command=self.toggle_selection).grid(row=1, column=1) self.buttons_frame.grid(row=1, column=0) if (search is True) or (search is not False and search < len(self.selections)): self.last_search = '' self.searchtext = tk.StringVar() self.searchbox = tk.Entry(self, text='Search', textvariable=self.searchtext) self.searchbox.grid(row=2, column=0, sticky='WE') self.winfo_toplevel().after(2000, lambda: self._update_search(repeat_after=1000)) self.winfo_toplevel().after(50, self._update) self.frame = frame self.canvas = canvas self.tk_variables = tk_variables self.single_select = single_select self.visible_checkbuttons = self.checkbuttons def _update_search(self, repeat_after=None): ''' Check the searchbox input and hide selections that do not match the search. ''' key = str(self.searchtext.get()) if key != self.last_search: self.visible_checkbuttons = [] for checkbutton in self.checkbuttons: checkbutton.grid_remove() if key in checkbutton.cget('text'): checkbutton.grid() self.visible_checkbuttons.append(checkbutton) self.last_search = key if repeat_after: self.winfo_toplevel().after(repeat_after, lambda r=repeat_after: self._update_search(repeat_after=r)) def _update(self): self.canvas.config(scrollregion=(0, 0, self.frame.winfo_reqwidth(), self.frame.winfo_reqheight())) self.winfo_toplevel().after(1000, self._update) def select_all(self): for checkbutton in self.visible_checkbuttons: checkbutton.select() def toggle_selection(self): for checkbutton in self.visible_checkbuttons: checkbutton.toggle() def on_ok(self): ''' Gets called when the OK button is pressed, and calls callback_on_ok with the made selections. ''' made_selections = [] if self.single_select: made_selections.append(self.selections[self.tk_variables[0].get()]) else: for tk_variable, selection in zip(self.tk_variables, self.selections): if tk_variable.get() == 1: made_selections.append(selection) self.callback_on_ok(made_selections, *self.callback_args, **self.callback_kwargs) if self.close_on_ok: self.winfo_toplevel().destroy()
Ancestors
- tkinter.Frame
- tkinter.Widget
- tkinter.BaseWidget
- tkinter.Misc
- tkinter.Pack
- tkinter.Place
- tkinter.Grid
Methods
def on_ok(self)
-
Gets called when the OK button is pressed, and calls callback_on_ok with the made selections.
def select_all(self)
def toggle_selection(self)