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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top