Domanda

Come posso terminare un programma Tkinter? Diciamo che ho questo codice:

from Tkinter import *

def quit():
    # code to exit

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

Come devo definire la funzione quit per uscire dalla mia applicazione?

È stato utile?

Soluzione

Dovresti usare destroy () per chiudere una finestra di tkinter.

from Tkinter import *

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

Spiegazione:

root.quit()

La riga sopra è solo Bypass root.mainloop () cioè root.mainloop () sarà ancora in esecuzione in background se viene eseguito il comando quit () .

root.destroy()

Mentre il comando destroy () scompare root.mainloop () ovvero root.mainloop () si interrompe.

Quindi, se vuoi semplicemente uscire dal programma, dovresti usare root.destroy () poiché fermerà mainloop () .

Ma se vuoi eseguire un ciclo infinito e non vuoi distruggere la tua finestra Tk e vuoi eseguire un po 'di codice dopo la riga root.mainloop () , allora dovresti usare root.quit () . Es:

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

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

Altri suggerimenti

def quit()
    root.quit()

o

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()

Penso che tu abbia capito erroneamente la funzione di chiusura di Tkinter. Questa funzione non richiede di definire.

Innanzitutto, è necessario modificare la funzione come segue:

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

Quindi, dovresti usare il suffisso '.pyw' per salvare questi file e fare doppio clic sul file '.pyw' per eseguire la tua GUI, questa volta puoi terminare la GUI con un clic del pulsante e puoi scopri anche che non ci saranno finestre DOS spiacevoli. (Se si esegue il file '.py', la funzione quit fallirà.)

Il solito metodo per uscire da un programma Python:

sys.exit()

(a cui è anche possibile passare uno stato di uscita) o

raise SystemExit

funzionerà bene in un programma Tkinter.

Illuminazione in caso di confusione ...

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

A) destroy () arresta il mainloop e uccide la finestra, ma lascia python in esecuzione

B) exit () arresta l'intero processo

Giusto per chiarire nel caso in cui qualcuno avesse perso ciò che stava distruggendo () e l'OP chiedeva anche come "terminare". un programma tkinter.

Nel modulo idlelib.PyShell , la variabile root di tipo Tk è definita come globale

Alla fine della funzione PyShell.main () chiama la funzione root.mainloop () che è un ciclo infinito e funziona fino a quando il ciclo viene interrotto da < code> root.quit () . Pertanto, root.quit () interromperà solo l'esecuzione di mainloop

Per distruggere tutti i widget relativi a quella finestra idlelib, è necessario chiamare root.destroy () , che è l'ultima riga di idlelib.PyShell.main () funzione.

Puoi usare:

root.destroy()

o

root.quit()

Se ciò non funziona, cambia root in qualunque sia stata la tua variabile all'inizio del programma

import tkinter

main = Tk()

main.destroy()

main.mainloop

Il modo più semplice sarebbe quello di fare clic sul pulsante rosso (all'estrema sinistra su macOS e all'estrema destra su Windows). Se vuoi associare una funzione specifica a un widget pulsante, puoi farlo:

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()

Oppure, per rendere le cose un po 'più complesse, usa i gestori di protocollo e il metodo 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()

Nel caso in cui qualcuno desideri associare il pulsante Escape alla chiusura dell'intera GUI:

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

def close(event):
    sys.exit()

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

devi solo digitare questo:

root.destroy()

e non hai nemmeno bisogno della funzione quit () perché quando lo imposti come comando, si chiuderà l'intero programma.

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()

Dovrebbe fare quello che stai chiedendo.

Per le barre dei 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()

Uso i codici seguenti per uscire dalla finestra di Tkinter:

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

o

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

o

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

o

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

Prova questo:

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

prova questo.

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

forse invii il parametro root come a un frame che hai fatto. quindi se vuoi finirlo devi chiamare tuo padre in modo che possa chiudere tutto, invece di chiudere ognuno dei suoi figli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top