def _set_fill(self) -> None: ''' Only Mixer must call this when toggling the fill. ''' self.ml_scale.grid_forget() self.fill_label.grid(row=self.mixer.get_ingredient_grid_row(self), column=1) self.ml_entry.configure(state='readonly') try: self.ml.trace_vdelete('w', self._ml_traceid) del(self._ml_traceid) except (AttributeError, tk._tkinter.TclError): # not set pass try: self._fill_traceid except AttributeError: self._fill_traceid = self.ml_max.trace('w', lambda var, idx, op: self.ml.set( int((self.mixer.get_bottle_volume() - sum([float_or_zero(ingr.ml.get()) for ingr in self.mixer._ingredient_list if ingr != self])) * 10) / 10 )) self.mixer.update(self) set_icon(self.fill_button, icons['bottle-icon-filled'], compound=tk.NONE) self.fill_set = True
def OnInit(self): wx.InitAllImageHandlers() _theme() frame = dialogs.ImageInspectorFrame(None, size=dialogs.imageInspector.SIZE) images.set_icon(frame, 'inspector') frame.OpenImages(self.paths) frame.Show() self.SetTopWindow(frame) return 1
def __init__(self, actionlist, *args, **keyw): frame.Frame.__init__(self, *args, **keyw) _theme() self.dlg_library = None self.dirty = False self.EnableBackgroundPainting(self.empty) self._menu() self._toolBar() self._plugin() self.on_menu_file_new() images.set_icon(self, 'phatch') self._title() self._description() self._drop() self._set_size() self._events() self._pubsub() if actionlist.endswith(ct.EXTENSION): self._open(actionlist)
def _unset_fill(self) -> None: ''' Only Mixer must call this when toggling the fill. ''' self.fill_label.grid_forget() self.ml_scale.grid(row=self.mixer.get_ingredient_grid_row(self), column=1, sticky=tk.EW) self.ml_entry.configure(state='normal') try: self.ml_max.trace_vdelete('w', self._fill_traceid) del(self._fill_traceid) except (AttributeError, tk._tkinter.TclError): # not set pass try: self._ml_traceid except AttributeError: self._ml_traceid = self.ml.trace('w', lambda var, idx, op: self.mixer.update(self)) self.mixer.update(self) set_icon(self.fill_button, icons['bottle-icon-fill'], compound=tk.NONE) self.fill_set = False
def __init__(self, mixer: Mixer, liquid: fludo.Liquid, auto_add: bool = True): if not isinstance(mixer, Mixer): raise Exception('Mixer parameter not instance of Mixer class.') if not isinstance(liquid, fludo.Liquid): raise Exception('Liquid parameter not instance of fludo.Liquid class.') self.mixer = mixer self.liquid = liquid self.ml = tk.StringVar() self.ml.set(float(self.liquid.ml)) self._ml_traceid = self.ml.trace('w', lambda var, idx, op: self.mixer.update(self)) self.name = tk.StringVar() self.name.set(self.liquid.name) self.name_label = ttk.Label(self.mixer.frame.interior, textvariable=self.name) self.name_label_ttip = CreateToolTip(self.name_label, '%(pg)dPG/%(vg)dVG, Nic. %(nic).1f' % { 'pg': self.liquid.pg, 'vg': self.liquid.vg, 'nic': self.liquid.nic}) self.ml_scale = ttk.Scale(self.mixer.frame.interior, orient=tk.HORIZONTAL, length=250, to=mixer.get_bottle_volume(), variable=self.ml, command=lambda value: self.ml.set(round_digits(self.ml_scale.get(), 1))) self.ml_scale_ttip = CreateToolTip(self.ml_scale, 'Adjust amount') self.ml_max = tk.StringVar() self.ml_max_label = ttk.Label(self.mixer.frame.interior, textvariable=self.ml_max) self.ml_max_label_ttip = CreateToolTip(self.ml_max_label, 'Max possible amount\nfor the ingredient.') self.ml_entry = ttk.Entry(self.mixer.frame.interior, width=7, textvariable=self.ml) # FloatValidator self.ml_entry_validator = self.ml_entry.register(self.validate_float_entry) # This function always returns the max volume possible for the ingredient, so that the # validator follows the changes in the max possible volume self.get_max_ml = lambda: self.ml_scale.cget('to') self.ml_entry.configure(validate='all', validatecommand=(self.ml_entry_validator, '%d', '%P', 'ml_entry', 0, 'get_max_ml')) # Shown instead of the scale if fill is selected for the component self.fill_label = ttk.Label(self.mixer.frame.interior, text='(will fill bottle)') self.fill_button = ttk.Button(self.mixer.frame.interior, width=32, command=lambda: self.mixer.toggle_fill(self)) set_icon(self.fill_button, icons['bottle-icon-fill'], compound=tk.NONE) self.fill_button_ttip = CreateToolTip(self.fill_button, 'Fill bottle') self.edit_button = ttk.Button(self.mixer.frame.interior, width=32, command=lambda: self.show_editor_dialog()) set_icon(self.edit_button, icons['edit-2'], compound=tk.NONE) self.edit_button_ttip = CreateToolTip(self.edit_button, 'Edit ingredient') self.destroy_button = ttk.Button(self.mixer.frame.interior, width=4, command=lambda: self.show_remove_dialog()) set_icon(self.destroy_button, icons['minus'], compound=tk.NONE) self.destroy_button_ttip = CreateToolTip(self.destroy_button, 'Remove ingredient') grid_row_idx = self.mixer.get_last_grid_row() # Grid row number within Mixer frame self.name_label.grid( row=grid_row_idx, column=0, padx=10, sticky=tk.E) self.ml_scale.grid( row=grid_row_idx, column=1, sticky=tk.EW) self.ml_max_label.grid( row=grid_row_idx, column=2, padx=17) self.fill_button.grid( row=grid_row_idx, column=3, padx=5) self.ml_entry.grid( row=grid_row_idx, column=4, padx=5) self.edit_button.grid( row=grid_row_idx, column=5, padx=5) self.destroy_button.grid( row=grid_row_idx, column=6, padx=14) self.fill_set = False self.editor_dialog = None self.remove_dialog = None # Add self to Mixer if auto_add is True. if auto_add: self.mixer.add_ingredient(self)
def __init__(self, parent: tk.Widget = None, mixture_name: str = DEFAULT_MIXTURE_NAME, save_callback: types.FunctionType = None, save_callback_args: list = [], discard_callback: types.FunctionType = None, discard_callback_args: list = []): if parent is None: # assume that we need to be Tk root self.parent = None self.toplevel = tk.Tk() else: self.parent = parent self.toplevel = tk.Toplevel(self.parent) self.root = self.toplevel.nametowidget('.') self.toplevel.withdraw() self.name = tk.StringVar() self.name.set(mixture_name) self.toplevel.title('Eliq | Liquid Mixer') self.toplevel.iconbitmap(icons['titlebar']) self.toplevel.minsize(0, 280) self.toplevel.resizable(False, True) self.toplevel.grid_columnconfigure(0, weight=1) self.toplevel.grid_rowconfigure(3, weight=1) self.name_frame = ttk.Frame(self.toplevel) self.name_entry = ttk.Entry(self.name_frame, textvariable=self.name) self.name_entry.configure(font=('Arial', 19)) self._name_entry_validator = self.name_entry.register(self.validate_name_entry) self.name_entry.configure(validate='all', validatecommand=(self._name_entry_validator, '%d', '%P')) self.name_entry.grid(row=0, column=0, padx=10, sticky=tk.EW) self.name_frame.grid_columnconfigure(0, weight=1) self.name_frame.grid(row=1, column=0, padx=10, pady=10, sticky=tk.EW) self.frame = VerticalScrolledFrame(self.toplevel) self.frame.interior.grid_columnconfigure(1, weight=1) self.frame.interior.grid_columnconfigure(2, minsize=80) self.frame.grid(row=3, column=0, sticky=tk.EW + tk.NS) self.labels_frame = ttk.Frame(self.toplevel) self.max_label = ttk.Label(self.labels_frame, text='Max. (ml)') self.max_label.grid(row=0, column=0, padx=5) self.labels_frame.columnconfigure(1, minsize=45) self.ml_label = ttk.Label(self.labels_frame, text='Vol. (ml)') self.ml_label.grid(row=0, column=2, padx=5) self.labels_frame.columnconfigure(3, minsize=118) self.statusbar_frame = ttk.Frame(self.toplevel) self.statusbar_frame.grid(row=999, column=0, sticky=tk.EW) self.statusbar_frame.grid_columnconfigure(2, weight=1) self.liquid_volume = tk.StringVar() self.total_label = ttk.Label(self.statusbar_frame, textvariable=self.liquid_volume) self.total_label.configure(font=('Arial', 11)) self.total_label.grid(row=0, column=1, pady=2, sticky=tk.W) self.mixture_description = tk.StringVar() self.mixture_description_label = ttk.Label(self.statusbar_frame, textvariable=self.mixture_description) self.mixture_description_label.configure(font=('Arial', 11, 'bold')) self.mixture_description_label.grid(row=0, column=0, pady=3, padx=5, sticky=tk.W) self.start_label = ttk.Label(self.frame.interior, text='Add some ingredients to your mixture:') self.start_label.grid(row=998, column=0, columnspan=6, sticky=tk.E) self.add_button = ttk.Button(self.frame.interior, text='', width=4, command=self.show_add_ingredient_dialog) self.add_button_ttip = CreateToolTip(self.add_button, 'Add new ingredient to the mixture.') set_icon(self.add_button, icons['plus'], compound=tk.NONE) self.add_button.grid(row=998, column=6, padx=14, pady=3) self.toplevel.bind('<Control-Shift-A>', lambda event: self.show_add_ingredient_dialog()) self.toplevel.bind('<Control-Shift-a>', lambda event: self.show_add_ingredient_dialog()) self.button_frame = ttk.Frame(self.toplevel) self.button_frame.grid(row=0, column=0, columnspan=2, sticky=tk.EW) self.change_bottle_button = ttk.Button(self.button_frame, text='Resize Bottle', width=22, command=self.show_change_bottle_dialog) self.change_bottle_button_ttip = CreateToolTip(self.change_bottle_button, 'Resize the bottle preserving ingredient proportions.') set_icon(self.change_bottle_button, icons['bottle-icon-resize']) self.change_bottle_button.grid(row=0, column=0) self.view_bottle_button = ttk.Button(self.button_frame, text='View Bottle', width=22, command=self.show_bottle_viewer) set_icon(self.view_bottle_button, icons['bottle-icon']) self.view_bottle_button.grid(row=0, column=1) self.add_notes_button = ttk.Button(self.button_frame, text='Add Notes', width=22, command=self.show_add_notes_dialog) set_icon(self.add_notes_button, icons['file']) self.add_notes_button.grid(row=0, column=2) self.save_button = ttk.Button(self.button_frame, text='Save & Close', width=22, command=lambda: self.close(True)) set_icon(self.save_button, icons['save']) self.save_button.grid(row=0, column=3) self.discard_button = ttk.Button(self.button_frame, text='Discard & Close', width=22, command=self.show_discard_dialog) set_icon(self.discard_button, icons['x-square']) self.discard_button.grid(row=0, column=4) self.fill_set = False self._labels_shown = False self._ingredient_list = [] self._bottle_vol = 100 # Default to 100ml self.total_cost = 0 self.notes = DEFAULT_NOTES_CONTENT self.save_callback = save_callback self.save_callback_args = save_callback_args self.discard_callback = discard_callback self.discard_callback_args = discard_callback_args self.new_ingredient_dialog = None self.change_bottle_dialog = None self.add_notes_dialog = None self.discard_dialog = None self.bottle_viewer = None # center_toplevel(self.toplevel) # self.toplevel.lift() self.toplevel.deiconify()