[英]How to close a Tkinter window by pressing a Button?
使用標有"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()
只需對代碼進行最少的編輯(不確定他們是否在課程中教授過課程),請更改:
def close_window(root):
root.destroy()
至
def close_window():
window.destroy()
它應該工作。
說明:
您的close_window
版本被定義為期望單個參數,即root
。 隨后,對您的close_window
版本的任何調用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
永遠不會賦值。 當你還沒有定義x
,就像輸入print(x)
一樣。
看着你的代碼,我想你想在window
上調用destroy
,所以我將root
更改為window
。
您可以創建一個擴展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
上的destroy時,意味着銷毀整個應用程序,因為您的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()
您可以將函數對象window.destroy
直接關聯到button
的command
屬性:
button = Button (frame, text="Good-bye.", command=window.destroy)
這樣您就不需要函數close_window
來關閉窗口了。
您可以使用lambda
將對window
對象的引用作為close_window
函數的參數close_window
:
button = Button (frame, text="Good-bye.", command = lambda: close_window(window))
這是因為command
屬性期望可調用或可調用的對象。 lambda
是可調用的,但在這種情況下,它本質上是使用set參數調用給定函數的結果。
實質上,您正在調用函數的lambda包裝器,該函數沒有args,而不是函數本身。
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()
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.