Использование унаследованного подкласса кнопки с методом click-event-метода и его синтаксисом в python tkinter - PullRequest
0 голосов
/ 19 апреля 2020

Цель программы - стать калькулятором, где в поле ввода отображается буква / цифра, которую представляет кнопка. Всегда есть способ грубой силы определить параметры каждой кнопки. Мне нужен настроенный класс кнопок с определенными свойствами, чтобы мне не нужно было переопределять каждую кнопку. Поэтому я наследую класс Button для создания подкласса. Я решил поместить click-event-method в класс, который показан ниже. Но, кажется, выдает ошибку, когда я нажимаю кнопку, когда отображается главное окно. Можете ли вы помочь мне выяснить, что не так. Полный код приведен ниже.

import tkinter as tk
import tkinter.font as tkFont

root = tk.Tk()
root.title("Simple Calculator")
myFont = tkFont.Font(family='Helvetica', size=19, weight='bold')

e = tk.Entry(root, width = 20,font=myFont)
e.grid(column=0,row=0,columnspan=4)

class calc_button(tk.Button):
    def __init__(self, parent, *args, **kwargs):
        tk.Button.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self["height"]=1
        self["width"]=6
        self["font"]=myFont
    def ClickMe(self):
        print(f'The text is {self["text"]} ')


button1 = calc_button(root,text="1",command=calc_button.ClickMe)
button1.grid(row=4,column=1)


root.mainloop()

Ошибка, как показано ниже:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\subramaniantr\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
TypeError: ClickMe() missing 1 required positional argument: 'self'

1 Ответ

0 голосов
/ 19 апреля 2020

Когда вы делаете command=calc_button.ClickMe, вы вызываете метод для класса , а не экземпляра класса. Вам нужно создать экземпляр.

Поскольку вы используете класс, чтобы вам не нужно было переопределять одно и то же свойство для каждого экземпляра, вы можете определить метод command внутри __init__ Примерно так:

class calc_button(tk.Button):
    def __init__(self, parent, *args, **kwargs):
        tk.Button.__init__(self, parent, *args, **kwargs)
        ...
        self["command"]=self.ClickMe

Если вы хотите sh определить command вне __init__, как вы сейчас пытаетесь это сделать, потребуется два шага, так как вы не можете ссылаться на кнопку перед ее созданием:

button1 = calc_button(root,text="1")
button1.configure(,command=button1.ClickMe)

Вне зависимости от задаваемого вопроса, ваш код будет легче понять другим, если вы будете придерживаться PEP8 стандартов именования. Например, имена классов всегда должны начинаться с заглавной буквы, а имена функций всегда должны начинаться со строчной буквы.

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