代码更改后运行时的Tkinter行为不一致

时间:2017-06-05 16:43:15

标签: python oop tkinter

注意:我不是贸易或教育程序员,所以请耐心等待。采取以下简单的应用程序:

import tkinter as tk
root = tk.Tk()

class app(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.button1= tk.Button(self, text='1')
        self.button1.pack(side='top')

        self.quit_button= tk.Button(self, text='quit', command=self.quit_button.destroy())
        self.quit_button.pack(side='bottom')

application = app(root)
application.mainloop()

当我运行此代码时,我被告知destroy()不是quit_button的方法。如果我将其更改为:

self.quit_button= tk.Button(self, text='quit', command=self.dest)

我添加方法:

def dest(self):
    self.quit_button.destroy()

然后它起作用 - 我认为这与按钮在创建时无法引用自身有关(如果可以,请更正/启发我,因为我不能完全理解这个行为)。

然而,我真正要问的是第一次程序运行 之后我收到此错误,我得到一个带有两个按钮的窗口,以及仅使用 按钮1(适当打包)的X额外窗口,其中X是我发生错误的次数。显然我可以“不这样做”#34;但是,了解tkinter如何以这种方式行事对我来说是非常有教育意义的。有人在这里熟悉OOP来帮忙吗?我先创建根窗口,所以在任何情况下都应该只有一个。

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题。全部在线:

self.quit_button= tk.Button(self, text='quit', command=self.quit_button.destroy())

首先,您要在创建它的同时尝试引用self.quit_button。第二个有点相关的问题是,command=self.quit_button.destroy()部分实际上试图调用这个不存在的Button方法之一,而不仅仅是提供它的引用(因为其名称后面的()个。)

这是修复了这些问题的版本:

import tkinter as tk
root = tk.Tk()

class app(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.button1= tk.Button(self, text='1')
        self.button1.pack(side='top')

        self.quit_button = tk.Button(self, text='quit')
        self.quit_button.config(command=self.quit_button.destroy)  # set function to execute
        self.quit_button.pack(side='bottom')

application = app(root)
application.mainloop()