Правильно расширить виджет tkinter, используя наследование - PullRequest
2 голосов
/ 20 февраля 2020

Я немного новичок в python классах, и я пока не знаю, как с ними хорошо справиться, и я обещаю, что провел некоторое исследование, чтобы решить эту проблему, но все еще не могу понять, как это сделать. Итак, вот и все:

Я пытаюсь использовать python классы для определения виджетов tkinter, чтобы я мог их реализовать довольно быстро. Все хорошо работало с кнопками и надписями, но я не могу получить это с записями. Я покажу вам, как я кодировал кнопки и метки, чтобы проиллюстрировать, что я пытаюсь сделать с записями (и, может быть, вы, ребята, можете помочь мне улучшить это при необходимости?).

class buttonStatic:
    def __init__(self, parent, row, col,rowspan, text, font, bg, fg, bd,width=None, function=None,sticky=None):
        button = tk.Button(parent, text=text, font=(font), bg=bg, fg=fg,bd=bd, width=width, command=function)
        button.grid(row=row, column=col,rowspan=rowspan, padx=padx, pady=pady, sticky=sticky)

class buttonDinamic:
    def __init__(self, parent, row, col,rowspan, textVar, font, bg, fg,bd,width=None, function=None,sticky=None):
        variable = tk.StringVar()
        variable.set(textVar)
        button = tk.Button(parent, textvariable=variable, font=(font), bg=bg, fg=fg,bd=bd, width=width, command=function)
        button.grid(row=row, column=col,rowspan=rowspan, padx=padx, pady=pady, sticky=sticky)


class labelStatic:
    def __init__(self, parent, row, col, text, font, bg, fg, sticky=None):
        label = tk.Label(parent, text=text, font=(font), bg=bg, fg=fg)
        label.grid(row=row, column=col, padx=padx, pady=pady, sticky=sticky)


class labelDinamic:
    def __init__(self, parent, row, col, textVar, font, bg, fg, sticky=None):
        variable = tk.StringVar()
        variable.set(textVar)
        label = tk.Label(parent, textvariable=variable, font=(font), bg=bg, fg=fg)
        label.grid(row=row, column=col, padx=padx, pady=pady, sticky=sticky)

Теперь, это то, что я кодировал для записей, следуя ответу в this (я добавил несколько лямбда-функций, чтобы сделать его «многоразовым»)

def focusIn(entry):
    entry.delete(0,'end')
    entry.config(fg=fColor_1)
    return

def focusOut(entry):
    entry.delete(0,'end')
    entry.config(fg=fColor_3)
    entry.insert(0,'Presupuesto')
    return

def enter(entry):
    x = entry.get()
    print(entry.get())
    focusOut(entry)
    return

testEntry = tk.Entry(module,bg=bgColor_1,width = 30, fg='grey')
testEntry.grid(row=0,column = 1)
testEntry.insert(0,'Presupuesto')
testEntry.bind('<FocusIn>',lambda x: focusIn(testEntry))
testEntry.bind('<FocusOut>',lambda x: focusIn(testEntry))
testEntry.bind('<Return>',lambda x: enter(testEntry))

Вот мой фактический вопрос

Как создать класс и как использовать методы .get() и .set(), когда виджет преобразован в класс?

Как я не очень опытный в python классах (и особенно комбинируя их с tkinter), я даже не знаю, возможно ли то, что я спрашиваю! pd: Извините, если мой английский sh не очень хорош, это не мой родной язык

1 Ответ

2 голосов
/ 20 февраля 2020

Вопрос : Как превратить в собственное class из tkinter.Entry

Это называется наследованием.
Все. унаследованные методы, например .get() ведут себя одинаково.

class MyEntry(tk.Entry):
    def __init__(self, parent, **kwargs):
        # Defaults
        kwargs['fg'] = 'grey'
        super().__init__(parent, **kwargs)

        self.bind('<FocusIn>', self.on_event)
        self.bind('<FocusOut>', self.on_event)
        self.bind('<Return>', self.on_event)

    def on_event(self, event):
        print('on_event type:{}'.format(event.type))

Использование :

testEntry = MyEntry(module, bg=bgColor_1, width = 30)
testEntry.grid(row=0,column = 1)
testEntry.insert(0,'Presupuesto')

print(testEntry.get())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...