使用标有"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()
答案 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()
这是输出:
之前你的代码无效的原因:
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.destroy
与command
的{{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()