【问题标题】:Tkinter: Putting Code Into Class Breaks PythonTkinter:将代码放入 Class Breaks Python
【发布时间】:2016-01-29 02:50:14
【问题描述】:

我有这个非常简单和简短的几行代码:

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 已停止工作”消息。它不会影响程序本身,但我想知道是什么导致了它以及为什么它在类之外完美运行。

【问题讨论】:

  • 停止是什么意思?
  • 如何运行这段代码?直接在终端/控制台/cmd.exe 或 IDE/IDLE 中?
  • 当我单击 X 或从 cmd.exe 停止它时。
  • 我可以说:代码没问题。我不知道您为什么会收到此消息(但我不使用 Windows,也无法测试此问题)但我不会打扰这个
  • 我不想在每次关闭程序时都无缘无故地看到错误消息。

标签: python class tkinter


【解决方案1】:

Tkinter 的 Tk 和其他类有数百个方法和属性。我知道,如果从 Windows 3.x 时代开始阅读古老的 GUI 编程书籍,创建自己的 Windows 的建议是子类化底层库小部件并编写 yoru 代码。这就是您在上面尝试做的事情,通过子类化 Tk。

好吧,不要那样做。真的,不要。这样你就不能在你的类上创建任何属性,而不需要三重检查,如果它没有与其他属性发生冲突。

在 OO 中使用 inhretance 来创建您自己的类层次结构 - 这是一个相关且有序的事情,这将使您更轻松。从 GUI 代码的 Window 继承,并将成员附加到它,如“name_text_entry”和“name_variable”(并对程序中的每个输入控件重复此操作)很容易被视为混合了非常不同的东西(窗口控件属性和方法)与您自己的程序的内部工作。 Here is a more extensive consideration 为什么这种模式不起作用(不是在 Python 中,但我只是从第一个谷歌结果中挑选出来的)

所以,只需创建您自己的程序,不要管 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)

然后工作。 在 cmets 中看到的错误消息不是确定性的,并且可以由许多不同的因素产生 - 从 tkinter.Tk 内部取决于没有被子类化(即使这是一个错误),它具有内部“画布” "属性等等。

只要使用作文并快乐。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2016-11-06
    • 2023-04-05
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2019-07-24
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多