如何通过按下按钮关闭Tkinter窗口?

时间:2012-04-03 05:35:22

标签: python tkinter

使用标有"Good-bye"的按钮编写GUI应用程序。当。。。的时候 单击Button,窗口关闭。

到目前为止,这是我的代码,但它不起作用。任何人都可以帮我解决我的代码吗?

from Tkinter import *

window = Tk()

def close_window (root): 
    root.destroy()

frame = Frame(window)
frame.pack()
button = Button (frame, text = "Good-bye.", command = close_window)
button.pack()

window.mainloop()

6 个答案:

答案 0 :(得分:29)

对代码进行最少的编辑(不确定他们是否在课程中教过课程),更改:

def close_window(root): 
    root.destroy()

def close_window(): 
    window.destroy()

它应该有效。


<强>解释

您的close_window版本被定义为期望单个参数,即root。随后,对您的close_window版本的任何调用都需要具有该参数,否则Python将为您提供运行时错误

当您创建Button时,您告诉该按钮在单击时运行close_window。但是,Button小部件的源代码类似于:

# class constructor
def __init__(self, some_args, command, more_args):
    #...
    self.command = command
    #...

# this method is called when the user clicks the button
def clicked(self):
    #...
    self.command() # Button calls your function with no arguments.
    #...

正如我的代码所述,Button类将调用您的函数而不带参数。但是你的功能是期待一个论点。因此你有一个错误。所以,如果我们取出那个参数,那么函数调用将在Button类中执行,我们留下:

def close_window(): 
    root.destroy()

但这也不对,因为root永远不会赋值。当您尚未定义print(x)时,就像输入x一样。

查看您的代码,我想您想在destroy上致电window,因此我将root更改为window

答案 1 :(得分:10)

您可以创建一个扩展Tkinter Button类的类,该类将专门用于关闭窗口,方法是将destroy方法与其command属性相关联:

from tkinter import *

class quitButton(Button):
    def __init__(self, parent):
        Button.__init__(self, parent)
        self['text'] = 'Good Bye'
        # Command to close the window (the destory method)
        self['command'] = parent.destroy
        self.pack(side=BOTTOM)

root = Tk()
quitButton(root)
mainloop()

这是输出:

enter image description here


之前你的代码无效的原因:

def close_window (): 
    # root.destroy()
    window.destroy()

我有一种轻微的感觉,你可能从其他地方得到了根,因为你做过window = tk()

当您在Tkinter中调用window上的销毁意味着销毁整个应用程序时,因为您的window(根窗口)是应用程序的主窗口。恕我直言,我认为您应该将window更改为root

from tkinter import *

def close_window():
    root.destroy()  # destroying the main window

root = Tk()
frame = Frame(root)
frame.pack()

button = Button(frame)
button['text'] ="Good-bye."
button['command'] = close_window
button.pack()

mainloop()

答案 2 :(得分:6)

您可以直接将功能对象window.destroycommand的{​​{1}}属性相关联:

button

这样您就不需要函数button = Button (frame, text="Good-bye.", command=window.destroy) 来关闭窗口了。

答案 3 :(得分:2)

您可以使用lambda将对window对象的引用作为close_window函数的参数传递:

button = Button (frame, text="Good-bye.", command = lambda: close_window(window))

这是有效的,因为command属性期望一个可调用或可调用的对象。 lambda是可调用的,但在这种情况下,它本质上是使用set参数调用给定函数的结果。

本质上,你调用函数的lambda包装器没有args,而不是函数本身。

答案 4 :(得分:2)

from tkinter import *

window = tk()
window.geometry("300x300")

def close_window (): 

    window.destroy()

button = Button ( text = "Good-bye", command = close_window)
button.pack()

window.mainloop()

答案 5 :(得分:-1)

from tkinter import *

def close_window():
    import sys
    sys.exit()

root = Tk()

frame = Frame (root)
frame.pack()

button = Button (frame, text="Good-bye", command=close_window)
button.pack()

mainloop()