2010-07-20 12 views

risposta

33

Sembra che la finestra di salvataggio debba essere modal.

Se questa è una finestra di salvataggio di base, perché stai reinventando la ruota? Tk ha uno tkFileDialog per questo scopo.


Se quello che vuoi è quello di ignorare il comportamento predefinito di distruggere la finestra, si può semplicemente fare:

root.protocol('WM_DELETE_WINDOW', doSomething) # root is your root window 

def doSomething(): 
    # check if saving 
    # if not: 
    root.destroy() 

In questo modo, è possibile intercettare la chiamata destroy() quando qualcuno chiude la finestra (da qualsiasi mezzo) e fai ciò che ti piace.

1

Ho trovato un riferimento su Tkinter here. Non è perfetto, ma copre quasi tutto ciò di cui ho bisogno. Immagino che la sezione 30.3 (tipi di eventi) aiuti, ci dice che c'è un evento "Destroy" per i widget. Suppongo che .bind() l'inserimento dei tuoi lavori di salvataggio su quell'evento della tua finestra principale dovrebbe fare il trucco.

È anche possibile chiamare mainwindow.overrideredirect (True) (sezione 24), che disabilita la riduzione al minimo, il ridimensionamento e la chiusura tramite i pulsanti nella barra del titolo.

+0

overrideredirect (flag = None) [#] Imposta o ottiene il flag di reindirizzamento override. Se diverso da zero, ciò impedisce al window manager di decorare la finestra. In altre parole, la finestra non avrà un titolo o un bordo e non potrà essere spostata o chiusa con mezzi ordinari. – Jacob

2

Il comando che stai cercando è wm_protocol, dandogli il "WM_DELETE_WINDOW" come protocollo da associare. Ti consente di definire una procedura da chiamare quando il gestore delle finestre chiude la finestra (che è ciò che accade quando fai clic su [x]).

5

Utilizzando il metodo procotol, siamo in grado di ridefinire il protocollo WM_DELETE_WINDOW associando con sé la chiamata a una funzione, in questo caso, la funzione viene chiamata on_exit:

import tkinter as tk 
from tkinter import messagebox 


class App(tk.Tk): 

    def __init__(self): 
     tk.Tk.__init__(self) 
     self.title("Handling WM_DELETE_WINDOW protocol") 
     self.geometry("500x300+500+200") 
     self.make_topmost() 
     self.protocol("WM_DELETE_WINDOW", self.on_exit) 

    def on_exit(self): 
     """When you click to exit, this function is called""" 
     if messagebox.askyesno("Exit", "Do you want to quit the application?"): 
      self.destroy() 

    def center(self): 
     """Centers this Tk window""" 
     self.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id())) 

    def make_topmost(self): 
     """Makes this window the topmost window""" 
     self.lift() 
     self.attributes("-topmost", 1) 
     self.attributes("-topmost", 0) 


if __name__ == '__main__': 
    App().mainloop() 
+0

[Intercept Tkinter "Exit" command?] (Http://stackoverflow.com/questions/4643007/intercept-tkinter-exit-command) –

Problemi correlati