我有这么简单和简短的几行代码:
import Tkinter as tk
master = tk.Tk()
w = tk.Canvas(master, width=800, height=600)
w.pack(side="top", fill="both", expand=True)
master.mainloop()
为了可读性,扩展功能,可移植性和其他原因,我想将代码放入类中,如下所示:
class Example(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.create_window()
def create_window(self):
self.canvas = tk.Canvas(self, width=800, height=600)
self.canvas.pack(side="top", fill="both", expand=True)
if __name__ == "__main__":
app = Example()
app.mainloop()
代码运行正常,与上面的代码完全相同,但当我停止程序时,我得到了一个" Python已停止工作"信息。它不会对程序本身产生影响,但我想知道导致它的原因以及为什么它在一个类之外完美运行。
答案 0 :(得分:0)
Tkinter的Tk和其他类有数百种方法和属性。我知道,如果从Windows 3.x的时代开始阅读古老的GUI编程书籍,建议创建自己的Windows将是子类化底层库小部件和wrtite yoru代码。这就是你在上面尝试做的事情,通过继承Tk。
嗯,不要那样做。真的,不要。这样,如果没有三重检查,如果它没有与其他属性发生冲突,则无法在类上创建任何属性。
在OO中使用imphretance来创建自己的类层次结构 - 这是一个相关且有序的东西,可以让您更轻松。要继承GUI代码'Window,并将成员附加到它上面,如“name_text_entry”和“name_variable”(并为程序中的每个输入控件重复一遍),这很容易被视为混合非常不同的东西(窗口控件属性)和方法)与您自己的程序的内部工作。 Here is a more extensive consideration说明为什么这种模式不起作用(不是在Python中,而是我从第一个Google结果中选择它)
所以,只需创建自己的程序,然后单独留下Tkinter的类 - 除非你要创建一个新的自定义Widget(用于代码的另一部分)。
您的代码应该更像:
class Example(object):
def __init__(self, *args, **kw):
self.tk = tk.Tk(*args, **kw)
self.create_window()
def create_window(self):
self.canvas = tk.Canvas(self, width=800, height=600)
self.canvas.pack(side="top", fill="both", expand=True)
只是工作。 错误消息,如注释中所示,不是确定性的,可以通过许多不同的因素产生 - 来自tkinter.Tk内部取决于未被子类化(即使这是一个错误),它具有内部“画布” “属性,等等。
只需使用构图并且快乐。