class SpinBox(Widget): def __init__(self, master, **kwargs): self._textv = StringVar() super().__init__(tk=ttk.Spinbox(master, textvariable=self._textv), **kwargs) self._setter = self.connect_to_prop("value", self.on_changed_value) self._trace = self._textv.trace_add( "write", lambda *_: self._setter(self._textv.get())) def on_changed_value(self, value): if value: self._textv.set(value) def on_disposed(self): self._textv.trace_remove("write", self._trace) self._setter = None
class CalendarWidget(Widget): def __init__(self, master, **kwargs): self._textv = StringVar() super().__init__(tk=Datepicker(master, datevar=self._textv, dateformat=kwargs.get("node").get_attr( "dateformat", "%Y-%m-%d")), **kwargs) self._setter = self.connect_to_prop("value", self.on_changed_value) self._trace = self._textv.trace_add( "write", lambda *_: self._setter(self._textv.get())) def on_changed_value(self, value): self._textv.set(value) def on_disposed(self): self._textv.trace_remove("write", self._trace) self._setter = None
class RadioButton(Widget): def __init__(self, master, **kwargs): self._v = StringVar() super().__init__(tk=ttk.Radiobutton(master, variable=self._v), **kwargs) self._setter = self.connect_to_prop("value", self.on_changed_value) self.connect_to_prop("sel", self.on_changed_sel) self._trace = self._v.trace_add("write", lambda *_: self._setter(self._v.get())) def on_changed_value(self, value): self._v.set(value) def on_changed_sel(self, value): self._tk.config(value=value) def on_disposed(self): self._v.trace_remove("write", self._trace) self._trace = None self._setter = None
class ComboBox(Widget): def __init__(self, master, **kwargs): self._textv = StringVar() super().__init__(tk=AutocompleteCombobox(master=master, textvariable=self._textv), **kwargs) self._setter = self.connect_to_prop("value", self.on_changed_value) self._trace = self._textv.trace_add( "write", lambda *_: self._setter(self._textv.get())) self.connect_to_prop("suggestion", self.on_changed_suggestion) def on_changed_suggestion(self, value): if self._textv.get() == None or self._textv.get() == "": if value and len(value) > 0: self._setter(value[0]) self._tk.set_completion_list(value if value else []) def on_changed_value(self, value): self._textv.set(value) def on_disposed(self): self._textv.trace_remove("write", self._trace) self._setter = None