Como posso fechar uma janela tkinter?
Pergunta
Como faço para acabar com um programa Tkinter? Digamos que eu tenho este código:
from Tkinter import *
def quit():
# code to exit
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()
Como devo definir a função quit
para sair a minha candidatura?
Solução
Você deve usar destroy()
para fechar uma janela tkinter.
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()
Explicação:
root.quit()
A linha acima apenas Shunt o root.mainloop()
ou seja root.mainloop()
ainda será executado em segundo plano se o comando quit()
é executado.
root.destroy()
Enquanto comando destroy()
desaparecer fora root.mainloop()
ou seja root.mainloop()
pára.
Então, como você só quer sair do programa para que você deve usar root.destroy()
como ele irá parar o mainloop()
.
Mas se você quiser rodar algum loop infinito e você não quer destruir sua janela Tk e quer executar algum código após a linha root.mainloop()
então você deve usar root.quit()
. Ex:
from Tkinter import *
def quit():
global root
root.quit()
root = Tk()
while True:
Button(root, text="Quit", command=quit).pack()
root.mainloop()
#do something
Outras dicas
def quit()
root.quit()
ou
def quit()
root.destroy()
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()
Eu acho que você erroneamente entendida a função de Tkinter sair. Esta função não exige que você definir.
Primeiro, você deve modificar a sua função como segue:
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()
Em seguida, você deve usar '.pyw' sufixo para salvar estes arquivos e clique duas vezes no arquivo '.pyw' para executar o seu GUI, desta vez, você pode acabar com a GUI com um clique do botão, e você pode também acho que não haverá nenhuma janela do DOS desagradável. (Se você executar o arquivo '.py', a função de parar falhará.)
O método usual para sair de um programa Python:
sys.exit()
(para o qual você também pode passar um status de saída) ou
raise SystemExit
vai funcionar bem em um programa de Tkinter.
Iluminação em caso de confusão ...
def quit(self):
self.destroy()
exit()
A) destroy () pára o mainloop e mata a janela, mas folhas python em execução
B) exit () pára todo o processo
Só para esclarecer o caso de alguém perdeu o Destroy () estava fazendo, e o OP também perguntou como "fim" de um programa tkinter.
No módulo idlelib.PyShell
, variável root
do tipo Tk
é definido para ser global
No final da função PyShell.main()
ele chama função root.mainloop()
que é um loop infinito e funciona até que o ciclo é interrompido pela função root.quit()
. Assim, root.quit()
só irá interromper a execução de mainloop
A fim de destruir todos os widgets pertencentes a essa janela idlelib, necessidades root.destroy()
a ser chamado, que é a última linha da função idlelib.PyShell.main()
.
Você pode usar:
root.destroy()
ou
root.quit()
Se isso não funcionar, a mudança de raiz para o que sempre sua variável foi no início de seu programa
import tkinter
main = Tk()
main.destroy()
main.mainloop
A maneira mais fácil seria clique no botão vermelho (mais à esquerda no MacOS e mais à direita no Windows). Se você deseja vincular uma função específica a um widget botão, você pode fazer isso:
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()
Ou, para tornar as coisas um pouco mais complexas, manipuladores de uso de protocolo e o método destroy()
.
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()
No caso de alguém quiser ligar o seu botão de Escape para fechar toda a GUI:
master = Tk()
master.title("Python")
def close(event):
sys.exit()
master.bind('<Escape>',close)
master.mainloop()
você só precisa digitar o seguinte:
root.destroy()
e você não precisa mesmo o quit () função porque quando você definir isso como commmand ele vai parar todo o programa.
def quit1():
root.destroy()
Button(root, text="Quit", command=quit1).pack()
root.mainloop()
import sys
from Tkinter import *
def quit():
sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()
Deve fazer o que você está pedindo.
Para barras de 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()
Eu uso a seguir os códigos para a saída da janela Tkinter:
from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()
ou
from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()
ou
from tkinter import*
root=Tk()
Button(root,text="quit",command=quit).pack()
root.mainloop()
ou
from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()
Tente isto:
from Tkinter import *
import sys
def exitApp():
sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()
tentar isso.
self.parent.destroy()
self.parent.quit()
talvez você enviar raiz como parâmetro para um quadro que você fez. Então, se você quer terminá-lo você tem que chamar seu pai para que ele possa fechar tudo, em vez de fechar cada um de seus filhos.