Я пытаюсь понять, как создавать управляемые объектно-ориентированные приложения на Python, используя свои знания о том, что я научился делать для Java в университете.
У меня есть 2 файла python в каталоге моей программы, app.py в качестве драйвера и canvas.py для создания графического интерфейса Tkinter для программы. Это довольно простой графический интерфейс, состоящий всего из двух кнопок, где я хочу, чтобы одна кнопка закрывала программу, а одна кнопка использовала метод getCommand () в app.py. Проблема в том, что когда я создаю свой объект холста в app.py, я получаю метод ошибки:
TypeError: 'module' object is not callable
Вот код в canvas.py: импортировать tkinter как tk
class canvas:
def __init__():
root =tk.Tk()
root.geometry("400x400")
frame = tk.Frame(self)
tk.Button(frame, text = "Speak", command=getCommand).pack(side=tk.LEFT)
tk.Button(frame, text = "Quit", command=quit).pack(side=tk.LEFT)
frame.pack()
и в app.py я создаю объект с помощью
root = canvas()
root.mainloop()
Любые советы и ответы о том, что мне следует делать, приветствуются!
Переместите tk.Tk
в class canvas(tk.Tk):
. Измените root =tk.Tk()
на super().__init__()
и root.geometry(...
на self.geometry(
.
Чтобы создать новый экземпляр холста класса, вам необходимо использовать синтаксис canvas.canvas (), поскольку холст - это и имя класса, и имя метода конструктора (как упоминалось).
Однако обратите внимание, что на данный момент вы устанавливаете переменную root как экземпляр холста класса, и поэтому root.mainloop () не будет работать должным образом, поскольку холст не является корнем Tkinter. Я рекомендую следующее:
В вашем классе холста:
class canvas:
def __init__(self, root):
self.root = root
self.root.geometry("400x400")
self.frame = tk.Frame(self)
self.tk.Button(frame, text = "Speak", command=getCommand).pack(side=tk.LEFT)
self.tk.Button(frame, text = "Quit", command=quit).pack(side=tk.LEFT)
self.frame.pack()
Затем в app.py:
root = tk.Tk()
canvas = canvas.canvas(root) # note proper const. of canvas instance
root.mainloop()
Еще одно замечание: если вы планируете использовать Python в долгосрочной перспективе, рекомендуется придерживаться соглашений о стиле кода Python (например, PEP-8). В этом случае имена классов должны начинаться с заглавных букв, а имена методов / функций должны быть полностью строчными с символами подчеркивания ('_'), используемыми для ясности по мере необходимости. Это противоположно верблюжьему регистру (например, someFunction), который распространен в Java.
Вам, вероятно, понадобится
canvas.canvas()
, посколькуcanvas
- это и имя модуля, и имя класса внутри модуля.