2016-08-02 26 views

Antwort

1

Sie können so etwas versuchen: Fen ist Ihr Toplevel

fen.bind("<FocusOut>", fen.quit) 
+0

'' scheint zu funktionieren, aber nicht sehr reaktionsschnell, wenn ich innerhalb des Hauptfensters klicken (funktioniert nur, wenn ich außerhalb anklicken). Irgendwelche anderen Möglichkeiten? –

+0

Sie können dann eine hinzufügen –

0

Ich hatte ein ähnliches Problem, und es fixiert. Das folgende Beispiel funktioniert gut. Es zeigt ein Toplevel-Fenster über dem Hauptfenster als ein benutzerdefiniertes Konfigurationsmenü an. Wenn der Benutzer irgendwo anders klickt, verschwindet das Konfigurationsmenü.

Warnung: Verwenden Sie .Transient (übergeordnet) nicht im Toplevel-Fenster, sonst passiert das beschriebene Symptom: Wenn Sie auf das Hauptfenster klicken, verschwindet das Menü nicht. Sie können im folgenden Beispiel versuchen, die Zeile "self.transient (parent)" auszukommentieren, um Ihr Problem zu reproduzieren.

Beispiel:

import Tix 


class MainWindow(Tix.Toplevel): 

    def __init__(self, parent): 
     # Init 
     self.parent = parent 
     Tix.Toplevel.__init__(self, parent) 
     self.protocol("WM_DELETE_WINDOW", self.destroy) 
     w = Tix.Button(self, text="Config menu", command=self.openMenu) 
     w.pack() 

    def openMenu(self): 
     configWindow = ConfigWindow(self) 
     configWindow.focus_set() 


class ConfigWindow(Tix.Toplevel): 

    def __init__(self, parent): 
     # Init 
     self.parent = parent 
     Tix.Toplevel.__init__(self, parent) 
     # If you uncomment this line it reproduces the issue you described 
     #self.transient(parent) 
     # Hides the window while it is being configured 
     self.withdraw() 
     # Position the menu under the mouse 
     x = self.parent.winfo_pointerx() 
     y = self.parent.winfo_pointery() 
     self.geometry("+%d+%d" % (x, y)) 
     # Configure the window without borders 
     self.update_idletasks() # Mandatory for .overrideredirect() method 
     self.overrideredirect(True) 
     # Binding to close the menu if user does something else 
     self.bind("<FocusOut>", self.close) # User focus on another window 
     self.bind("<Escape>", self.close) # User press Escape 
     self.protocol("WM_DELETE_WINDOW", self.close) 
     # The configuration items 
     w = Tix.Checkbutton(self, text="Config item") 
     w.pack() 
     # Show the window 
     self.deiconify() 


    def close(self, event=None): 
     self.parent.focus_set() 
     self.destroy() 


tixRoot = Tix.Tk() 
tixRoot.withdraw() 
app = MainWindow(tixRoot) 
app.mainloop()