2008-09-21 10 views

Antwort

93

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

Ich benutzte ähnlichen Code aber mit 'root.destroy()' – 182764125216

+2

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

+3

Auf meinem Python 2.7 unter Windows hatte 'Tkinter' kein Submodul-Message-Box. Ich habe 'import tkMessageBox als messagebox' verwendet – IronManMark20

-13

Verwenden the closeEvent

def closeEvent(self, event): 
# code to be executed 
+3

Diese Antwort benötigt mehr Details. Wo ist diese Linie platziert? Ein bisschen an meinem Ende zu hantieren, scheint es nicht zu funktionieren. – thedayturns

13

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 .