2008-09-21 123 views

Respuesta

93

Tkinter admite un mecanismo llamado protocol handlers. Aquí, el término protocolo se refiere a la interacción entre la aplicación y el administrador de ventanas. El protocolo más comúnmente utilizado se llama WM_DELETE_WINDOW, y se usa para definir qué sucede cuando el usuario cierra una ventana explícitamente usando el administrador de ventanas.

se puede utilizar el método de -instalar un controlador de para este protocolo (el widget debe ser un widget Tk o Toplevel):

Aquí tienen un ejemplo concreto:

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

utilicé un código similar pero con 'root.destroy()' – 182764125216

+2

Si está utilizando algo como Twisted que mantiene un bucle de evento independientemente o Tkinter (por ejemplo: objeto de reactor retorcido) asegúrese de que el bucle principal externo se detenga con cualquier smenatics proporciona para ese propósito (por ejemplo: reactor.stop() para twisted) –

+3

En mi Python 2.7 en Windows, 'Tkinter' no tenía un cuadro de mensaje de submódulo. Utilicé 'import tkMessageBox como messagebox' – IronManMark20

-13

Uso el cierreEvent

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

Esta respuesta necesita más detalles. ¿Dónde se coloca esta línea? Un poco de tiddling de mi parte parece que no puede hacer que funcione. – thedayturns

13

Matt ha mostrado una modificación clásica n del botón de cerrar.
El otro es hacer que el botón Cerrar minimice la ventana.
Puede reproducir este comportamiento haciendo que el método iconify
sea el segundo argumento del método protocol.

Aquí está un ejemplo de trabajo, probado en 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() 

En este ejemplo que damos al usuario dos nuevas opciones de salida:
el menú archivo clásico -> Salir, y también el botón de Esc .

Cuestiones relacionadas