簡體   English   中英

如何通過按下按鈕關閉Tkinter窗口?

[英]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直接關聯到buttoncommand屬性:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM