Tkinter:将代码放入类中断Python

时间:2016-01-29 02:50:14

标签: python class tkinter

我有这么简单和简短的几行代码:

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已停止工作"信息。它不会对程序本身产生影响,但我想知道导致它的原因以及为什么它在一个类之外完美运行。

1 个答案:

答案 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内部取决于未被子类化(即使这是一个错误),它具有内部“画布” “属性,等等。

只需使用构图并且快乐。