Làm cách nào để đóng cửa sổ tkinter?


83

Làm cách nào để kết thúc chương trình Tkinter? Giả sử tôi có mã này:

from Tkinter import *

def quit():
    # code to exit

root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

Tôi nên xác định quitchức năng thoát ứng dụng của mình như thế nào?

Câu trả lời:


113

Bạn nên sử dụng destroy()để đóng cửa sổ tkinter.

from Tkinter import *

root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()

Giải trình:

root.quit()

Dòng trên chỉ Bỏ qua các root.mainloop()ví dụ root.mainloop()vẫn sẽ chạy ở chế độ nền nếu quit()lệnh được thực thi.

root.destroy()

destroy()Lệnh While biến mất root.mainloop()tức là root.mainloop()dừng lại.

Vì vậy, khi bạn chỉ muốn thoát khỏi chương trình, bạn nên sử dụng root.destroy()vì nó sẽ dừng mainloop().

Nhưng nếu bạn muốn chạy một số vòng lặp vô hạn và bạn không muốn phá hủy cửa sổ Tk của mình và muốn thực thi một số mã sau root.mainloop()dòng thì bạn nên sử dụng root.quit(). Ví dụ:

from Tkinter import *
def quit():
    global root
    root.quit()

root = Tk()
while True:
    Button(root, text="Quit", command=quit).pack()
    root.mainloop()
    #do something

2
Nếu root.quit () được sử dụng, làm cách nào để có thể tìm thấy lại cửa sổ sau này trong một tập lệnh khác sẽ bị hủy (để không tiếp tục sử dụng tài nguyên hệ thống)?
Raj

3
Tuyên bố đầu tiên của bạn là sai. gọi quitsẽ phá hủy tất cả các vật dụng; nếu widget bị phá hủy, mainloopsẽ thoát.
Bryan Oakley

1
Sau một số nghiên cứu, tôi tin rằng điều này cũng áp dụng cho TẤT CẢ mã đang được thực thi. Vì vậy, nếu bạn có một mainloop () của TKinter trong tập lệnh dòng lệnh, hãy sử dụng root.quit () chứ không phải root.destroy (), nếu không tập lệnh dòng lệnh của bạn sẽ không tiếp tục thực thi mã sau mainloop (). Tôi đã thử nghiệm này và nó làm việc cho tôi (Tôi biết rằng Tkinter không có ý định sẽ được sử dụng trong một thiết kế như vậy, tuy nhiên, nó hoạt động)
Alex

Nó có phải là một giải pháp tốt để phá hủy cửa sổ Tkinter nhiều lần và bắt đầu nhiều lần không
Nitesh Waghmare

40
def quit()
    root.quit()

hoặc là

def quit()
    root.destroy()

Có ai biết phương pháp nào là thêm 'đúng' hoặc là nó là một trường hợp một là dễ đọc hơn so khác
Opal

8
xin lỗi, tôi đã tìm thấy câu trả lời và chỉ nghĩ rằng tôi sẽ chia sẻ nó. Tốt hơn là sử dụng root.destroy()vì nó kết thúc vòng lặp chương trình chính. Xem: http://www.daniweb.com/software-development/python/threads/66698
Opal

17
import Tkinter as tk

def quit(root):
    root.destroy()

root = tk.Tk()
tk.Button(root, text="Quit", command=lambda root=root:quit(root)).pack()
root.mainloop()

7

Phương pháp thông thường để thoát khỏi chương trình Python:

sys.exit()

(mà bạn cũng có thể vượt qua trạng thái thoát) hoặc

raise SystemExit

sẽ hoạt động tốt trong chương trình Tkinter.


3
Câu hỏi là về việc đóng một cửa sổ tkinter, không phải một chương trình sử dụng tkinter.
kevr

7

Tôi nghĩ rằng bạn đã hiểu sai chức năng thoát của Tkinter. Chức năng này không yêu cầu bạn xác định.

Trước tiên, bạn nên sửa đổi chức năng của mình như sau:

from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()

Sau đó, bạn nên sử dụng hậu tố '.pyw' để lưu các tệp này và nhấp đúp vào tệp '.pyw' để chạy GUI của bạn, lần này, bạn có thể kết thúc GUI bằng một lần nhấp vào Nút và bạn cũng có thể tìm thấy sẽ không có cửa sổ DOS khó chịu. (Nếu bạn chạy tệp '.py', chức năng thoát sẽ không thành công.)


5

Chiếu sáng trong trường hợp nhầm lẫn ...

def quit(self):
    self.destroy()
    exit()

A) kill () dừng mainloop và giết cửa sổ, nhưng để python chạy

B) exit () dừng toàn bộ quá trình

Chỉ để làm rõ trong trường hợp ai đó bỏ lỡ những gì hủy () đang làm, và OP cũng hỏi cách "kết thúc" một chương trình tkinter.


3

bạn chỉ cần gõ cái này:

root.destroy()

và bạn thậm chí không cần đến nguyên nhân của hàm exit () khi bạn đặt nó là lệnh commmand, nó sẽ thoát khỏi toàn bộ chương trình.


2

Trong trường hợp bất kỳ ai muốn liên kết nút Escape của họ để đóng toàn bộ GUI:

master = Tk()
master.title("Python")

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()

1

Trong idlelib.PyShellmô-đun, rootbiến kiểu Tkđược định nghĩa là toàn cục

Khi kết thúc PyShell.main()hàm, nó gọi root.mainloop()hàm là một vòng lặp vô hạn và nó chạy cho đến khi vòng lặp bị ngắt bởi root.quit()hàm. Do đó, root.quit()sẽ chỉ làm gián đoạn việc thực thimainloop

Để hủy tất cả các widget liên quan đến cửa sổ idlelib đó, root.destroy()cần được gọi, là dòng cuối cùng của idlelib.PyShell.main()hàm.


1

Bạn có thể dùng:

root.destroy()

Hoặc là

root.quit()

Nếu điều đó không hiệu quả, hãy thay đổi gốc thành biến của bạn đã từng có khi bắt đầu chương trình của bạn

import tkinter

main = Tk()

main.destroy()

main.mainloop

1

Cách dễ nhất là nhấp vào nút màu đỏ (ngoài cùng bên trái trên macOS và ngoài cùng bên phải trên Windows). Nếu bạn muốn liên kết một chức năng cụ thể với một tiện ích nút, bạn có thể thực hiện điều này:

class App:
    def __init__(self, master)
        frame = Tkinter.Frame(master)
        frame.pack()
        self.quit_button = Tkinter.Button(frame, text = 'Quit', command = frame.quit)
        self.quit_button.pack()

Hoặc, để làm cho mọi thứ phức tạp hơn một chút, hãy sử dụng trình xử lý giao thức và destroy()phương pháp.

import tkMessageBox

def confirmExit():
    if tkMessageBox.askokcancel('Quit', 'Are you sure you want to exit?'):
        root.destroy()
root = Tk()
root.protocol('WM_DELETE_WINDOW', confirmExit)
root.mainloop()


0
import sys
from Tkinter import *
def quit():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

Nên làm những gì bạn đang yêu cầu.


Này Harrison, bạn có một câu trả lời rất muộn và không cung cấp thêm gì cho các câu trả lời hiện có. Mặc dù chúng tôi đánh giá rất cao sự tham gia nhưng câu trả lời của bạn không cung cấp thêm bất kỳ thông tin chi tiết nào. Hãy xem một số câu trả lời khác chẳng hạn, chúng làm rất tốt việc giải thích lý do tại sao một số cách tiếp cận hiệu quả và những cách khác thì không.
TheOneWhoPrograms

0

Đối với thanh menu:

def quit():
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=quit)
menubar.add_cascade(label="menubarname", menu=filemenu)
root.config(menu=menubar)
root.mainloop()

0

Tôi sử dụng các mã dưới đây để thoát khỏi cửa sổ Tkinter:

from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()

hoặc là

from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()

hoặc là

from tkinter import*
root=Tk()
Button(root,text="quit",command=quit).pack()
root.mainloop()

hoặc là

from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()

0

Đoạn mã bên dưới. Tôi đang cung cấp một kịch bản nhỏ.

import tkinter as tk
from tkinter import *

root = Tk()

def exit():
    if askokcancel("Quit", "Do you really want to quit?"):
        root.destroy()

menubar = Menu(root, background='#000099', foreground='white',
               activebackground='#004c99', activeforeground='white')

fileMenu = Menu(menubar,  tearoff=0, background="grey", foreground='black',
                activebackground='#004c99', activeforeground='white')
menubar.add_cascade(label='File', menu=fileMenu)

fileMenu.add_command(label='Exit', command=exit)

root.config(bg='#2A2C2B',menu=menubar)

if __name__ == '__main__':
    root.mainloop()

Tôi đã tạo một cửa sổ trống ở đây và thêm tùy chọn menu tệp trên cùng một cửa sổ (cửa sổ gốc), nơi tôi chỉ thêm một lối ra tùy chọn .

Sau đó chỉ cần chạy mainloop để root .

Hãy thử làm một lần


0

root.destroysẽ làm việc.
root.quitcũng sẽ hoạt động.

Trong trường hợp của tôi, tôi đã có

quitButton = Button(frame, text = "Quit", command = root.destroy)

Hy vọng nó giúp.


0

Có một câu trả lời đơn giản một dòng:

Viết - exit()trong lệnh

Đó là nó!



-2

Thử đi:

from Tkinter import *
import sys
def exitApp():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()

-4

thử đi.

    self.parent.destroy() 
    self.parent.quit()

có thể bạn gửi tham số root like cho một khung mà bạn đã làm. vì vậy muốn xong bạn phải gọi cho bố để bố đóng hết thay vì đóng từng đứa một.


4
Vui lòng không đăng câu trả lời suy đoán. Tốt nhất là bạn chỉ nên đăng khi bạn có một câu trả lời đã được chứng minh và kiểm chứng. Nếu bạn có đề xuất, những người đó có thể vào bình luận.
SuperBiasedMan

Khi bạn đang sử dụng một lớp, self.parent.destroy () là thứ hoạt động trong tình huống của tôi.
Zak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.