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)
Example #5
0
        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()
Example #7
0
                '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
Example #9
0
                (_('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()
Example #10
0
        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)
Example #11
0
        # 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)