class TtkStylePropertyEditor(ChoicePropertyEditor): RE_TTKSTYLECLASS = re.compile( '(?i)$|[_A-Za-z](\.[_a-zA-Z0-9]+|[_a-zA-Z0-9]*)*$') def _validate(self): valid = False value = self._get_value() m = self.RE_TTKSTYLECLASS.match(value) if m: valid = True self.show_invalid(not valid) return valid register_editor('ttkstylechoice', TtkStylePropertyEditor) if __name__ == '__main__': root = tk.Tk() root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) def make_on_change_cb(editor): def on_change_cb(event=None): print(editor.value) print(repr(editor.value)) return on_change_cb editor = TtkStylePropertyEditor(root) editor.pack(expand=True, fill='x')
self._entry.edit('') self._cbox.edit('string') def _validate(self): is_valid = True value = self._entry.value if len(value) != 0: if keyword.iskeyword(value): is_valid = False if is_valid and not self.RE_IDENTIFIER.match(value): is_valid = False self.show_invalid(not is_valid) return is_valid register_editor('tkvarentry', TkVarPropertyEditor) if __name__ == '__main__': root = tk.Tk() editor = TkVarPropertyEditor(root) editor.grid() editor.edit('double:mydouble') def see_var(): print(editor.value) btn = ttk.Button(root, text='Value', command=see_var) btn.grid(row=0, column=1) root.mainloop()
return is_valid class ScrollCommandEntry(SimpleCommandEntry): cmd_type = CB_TYPES.SCROLL class ScrollSetCommandEntry(SimpleCommandEntry): cmd_type = CB_TYPES.SCROLLSET class ScaleCommandEntry(SimpleCommandEntry): cmd_type = CB_TYPES.SCALE register_editor('simplecommandentry', SimpleCommandEntry) register_editor('scrollcommandentry', ScrollCommandEntry) register_editor('scrollsetcommandentry', ScrollSetCommandEntry) register_editor('scalecommandentry', ScaleCommandEntry) class CommandPropertyEditor(CommandPropertyBase): def _create_ui(self): self._lbl_callback = _('Callback:') self._plabel = w = ttk.Label(self, text=self._lbl_callback, font='TkSmallCaptionFont') w.grid(row=0, column=0, sticky='nswe') self._cbname = w = EntryPropertyEditor(self) w.grid(row=0, column=1, sticky='nswe')
is_valid = False value = self._get_value() vlen = len(value) if vlen == 0: is_valid = True # Allow empty else: try: int(value) is_valid = True except ValueError: pass self.show_invalid(not is_valid) return is_valid register_editor('pixelcoordinateentry', PixelCoordinatePropertyEditor) if __name__ == '__main__': root = tk.Tk() root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) def make_on_change_cb(editor): def on_change_cb(event=None): print('Property changed: ') print(editor.value) print(repr(editor.value)) return on_change_cb editor = PixelCoordinatePropertyEditor(root)
if self._weditor.value != '' and self._heditor.value != '': value = f'{self._weditor.value}|{self._heditor.value}' return value def _set_value(self, value): if '|' in value: width, heigth = value.split('|') self._weditor.edit(width) self._heditor.edit(heigth) else: self._weditor.edit('') self._heditor.edit('') def _validate(self): isvalid = False w = self._weditor.value h = self._heditor.value if w == '' and h == '': isvalid = True else: try: if int(w) >= 0 and int(h) >= 0: isvalid = True except ValueError: pass self.show_invalid(not isvalid) return isvalid register_editor('whentry', WHPropertyEditor)
def _activate(self, items): self._paint(self._items.keys()) state = [0] * (self.DIM * self.DIM) for item in items: pos = self._items[item] state[pos] = 1 # check valid state found = '' for k, v in self._map.items(): if v == state: found = k break self._paint_state(self._map[found], color='#9999cc') self._set_value(found) self._on_variable_changed() register_editor('stickyentry', StickyPropertyEditor) if __name__ == '__main__': root = tk.Tk() editor = StickyPropertyEditor(root) editor.grid() editor.edit('nsew') def see_var(event=None): print(editor.value) editor.bind('<<PropertyChanged>>', see_var) root.mainloop()
'cbtype': CB_TYPES.ENTRY_VALIDATE, 'args': args, } value = json.dumps(cmd) return value def _validate(self): is_valid = True value = self._cbname.value if len(value) != 0: is_valid = self.is_safe_identifier(value) self.show_invalid(not is_valid) return is_valid register_editor('entryvalidatecommandentry', EntryValidateCommandPropertyEditor) if __name__ == '__main__': root = tk.Tk() root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) editor = EntryValidateCommandPropertyEditor(root) editor.grid(sticky='nsew') def on_change_cb(self, event=None): print('change cb') print(editor.value) editor.bind('<<PropertyChanged>>', on_change_cb) value = '{"value":"mycb", "cbtype": "entryvalidate"}'
m = self.REGEX.match(value) if m: valid = True self.show_invalid(not valid) return valid class TwoDimensionPropertyEditor(DimensionPropertyEditor): REGEX = RE_TWO_DIMENSION class FourDimensionPropertyEditor(DimensionPropertyEditor): REGEX = RE_FOUR_DIMENSION register_editor('dimensionentry', DimensionPropertyEditor) register_editor('twodimensionentry', TwoDimensionPropertyEditor) register_editor('fourdimensionentry', FourDimensionPropertyEditor) if __name__ == '__main__': root = tk.Tk() root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) def make_on_change_cb(editor): def on_change_cb(event=None): print(editor.value) print(repr(editor.value)) return on_change_cb
(_('Tk image formats'), ' '.join(ext)), (_('All Files'), '*.*'), ] } fname = tk.filedialog.askopenfilename(**options) if fname: base, name = os.path.split(fname) # Register image before change event is generated: if not StockImage.is_registered(name): StockImage.register(name, fname) self._set_value(name) self._on_variable_changed(event=None) register_editor('imageentry', ImagePropertyEditor) if __name__ == '__main__': root = tk.Tk() def see_var(): print(var.get()) entry = ImagePropertyEditor(root) entry.grid() entry.edit('image.gif') btn = ttk.Button(root, text='Value', command=see_var) btn.grid(row=0, column=1) root.mainloop()
return self._current.value def _set_value(self, value): self._current.edit(value) def parameters(self, **kw): modes = kw.pop('modes', None) if modes is not None: self._configure_modes(modes) current = kw.pop('mode', 'entry') self.set_mode(current) self._current.parameters(**kw) def _configure_modes(self, modes): for mode in modes: if mode not in self._editors: self._create_editor(mode) def set_mode(self, mode): if mode not in self._editors: self._create_editor(mode) for name, widget in self._editors.items(): if mode == name: widget.grid() else: widget.grid_remove() self._current = self._editors[mode] register_editor('dynamic', DynamicPropertyEditor)
# update button color self._change_color(self._get_value()) def _validate(self): is_valid = True value = self._get_value() if len(value) != 0: default = self._entry.cget('background') try: self._entry.configure(background=value) self._entry.configure(background=default) except tk.TclError: is_valid = False self.show_invalid(not is_valid) return is_valid register_editor('colorentry', ColorPropertyEditor) if __name__ == '__main__': root = tk.Tk() editor = ColorPropertyEditor(root) editor.grid() editor.edit('red') def see_var(event=None): print(editor.value) editor.bind('<<PropertyChanged>>', see_var) root.mainloop()
self._size.edit('') self._bold.edit('') self._italic.edit('') self._underline.edit('') self._overstrike.edit('') def _populate_options(self): sizes = (6, 8, 9, 10, 11, 12, 14, 16, 20, 24, 36, 48, 72) self._size.parameters(values=sizes) families = sorted(tk.font.families()) values = [''] + PREDEFINED_FONTS + families self._name.parameters(values=values) register_editor('fontentry', FontPropertyEditor) if __name__ == '__main__': root = tk.Tk() root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) editor = FontPropertyEditor(root) editor.grid(sticky='nsew') # editor.edit('Anonymous Pro|-50|bold,italic') editor.edit('Anonymous Pro|12|bold,italic') def see_var(): print(editor.value) btn = ttk.Button(root, text='Value', command=see_var)