Wie handhabe ich das Ereignis zum Schließen des Fensters in einem Python Tkinter-Programm (Benutzer, der auf die Schaltfläche 'X' klickt)?Wie handhabe ich das Fenster schließen Ereignis in Tkinter?
Antwort
Tkinter unterstützt einen Mechanismus namens protocol handlers. Hier bezieht sich der Begriff Protokoll auf die Interaktion zwischen der Anwendung und dem Fenstermanager. Das am häufigsten verwendete Protokoll heißt WM_DELETE_WINDOW
und wird verwendet, um zu definieren, was passiert, wenn der Benutzer ein Fenster mithilfe des Fenstermanagers explizit schließt.
Sie können die Methode einen Handler installieren für dieses Protokoll (das Widget eines Tk
oder Toplevel
Widget sein muss):
Hier haben Sie ein konkretes Beispiel:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
def on_closing():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
Verwenden the closeEvent
def closeEvent(self, event):
# code to be executed
Diese Antwort benötigt mehr Details. Wo ist diese Linie platziert? Ein bisschen an meinem Ende zu hantieren, scheint es nicht zu funktionieren. – thedayturns
Matt hat eine klassische Modifikation gezeigt n der Schließen-Schaltfläche.
Der andere ist, den Schließen-Knopf zu haben, um das Fenster zu minimieren.
Sie können dieses Verhalten reproduzieren, indem Sie die iconify Methode
das zweite Argument der Methode protocol Methode haben.
Hier ist ein funktionierendes Beispiel, getestet auf Windows 7:
# Python 3
import tkinter
import tkinter.scrolledtext as scrolledtext
class GUI(object):
def __init__(self):
root = self.root = tkinter.Tk()
root.title('Test')
# make the top right close button minimize (iconify) the main window
root.protocol("WM_DELETE_WINDOW", root.iconify)
# make Esc exit the program
root.bind('<Escape>', lambda e: root.destroy())
# create a menu bar with an Exit command
menubar = tkinter.Menu(root)
filemenu = tkinter.Menu(menubar, tearoff=0)
filemenu.add_command(label="Exit", command=root.destroy)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
# create a Text widget with a Scrollbar attached
txt = scrolledtext.ScrolledText(root, undo=True)
txt['font'] = ('consolas', '12')
txt.pack(expand=True, fill='both')
gui = GUI()
gui.root.mainloop()
In diesem Beispiel haben wir dem Anwender zwei neue Exit-Optionen geben:
das klassische Menü Datei -> Beenden, und auch die Esc Taste .
Ich benutzte ähnlichen Code aber mit 'root.destroy()' – 182764125216
Wenn Sie etwas wie Twisted verwenden, das eine Ereignisschleife unabhängig oder Tkinter (zB: Twisted-Reaktor-Objekt) hält, stellen Sie sicher, dass die äußere Hauptschleife mit was auch immer Smenatics gestoppt wird es bietet für diesen Zweck (zB: reactor.stop() für twisted) –
Auf meinem Python 2.7 unter Windows hatte 'Tkinter' kein Submodul-Message-Box. Ich habe 'import tkMessageBox als messagebox' verwendet – IronManMark20