2017-08-28 1 views
0

Ich habe ein UI-Root-Fenster, in dem zwei andere Toplevel-Fenster mit separaten Schaltflächenklicks erstellt werden. Diese Toplevel-Fenster sind im Root-Fenster verankert und ziehen mit dem Root-Fenster über den Bildschirm.Stellen Sie das Toplevel-Fenster an die oberste Stelle, wenn das Root-Fenster geklickt wurde

Mein Problem ist, wenn ich ein anderes Fenster geöffnet habe und meine UI sich dahinter verbirgt, wenn ich auf meine UI von der Taskleiste klicke oder das kleine ich auf dem Bildschirm sehe, erscheint nur das Root Tk Fenster und das andere Toplevel-Fenster verstecken sich immer noch hinter dem anderen Fenster.

Ich versuchte toplevel.lift() und toplevel.wm_attributes("-topmost", 1), aber keiner gibt mir, was ich will.

Wie kann ich die Toplevel-Fenster binden, so dass, wenn sie geöffnet sind und ich auf das Stammfenster klicke, das Toplevel-Fenster ebenfalls oben erscheint?

+0

Bitte geben Sie eine [MCVE] –

+0

'toplevel_name.attributes versuchen („- oberste“, True)' –

+0

Die Sache ist dies die oberste oben etwas anderes, selbst wenn ich auf ein anderes Fenster klicken Sie auf das Toplevel-Fenster macht. Ich möchte, dass die gesamte Benutzeroberfläche verschwindet, wenn ich auf etwas anderes klicke, aber wenn ich erneut auf die Benutzeroberfläche klicke und das Toplevel geöffnet ist, möchte ich, dass das Toplevel nach vorne kommt, wenn das Root-Tk() -Fenster angeklickt wird. –

Antwort

1

Hier ist ein einfaches Beispiel, das 2 Fenster öffnet und alles im Root-Fenster deaktiviert, während es auch jede Interaktion mit diesem Root-Fenster bindet, um alle oberen Fenster darüber zu heben.

Ich habe auch das Close-Ereignis der obersten Ebene gebunden, um zuerst die Root-Bindung zu entfernen und dann die obersten Ebenen zu zerstören und dann alle Widgets im Root-Fenster wieder zu aktivieren. Dies sollte ein antikes Beispiel dessen sein, was Sie zu tun versuchen.

Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.

import tkinter as tk 


class ExampleApp(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self, master) 
     self.master = master 
     self.master.geometry("400x150") 
     self.main_frame = tk.Frame(self.master) 
     self.main_frame.pack(expand=tk.YES, fill=tk.BOTH) 
     self.master.protocol('<WM_LBUTTONDBLCLK>', self.motion) 
     tk.Label(self.main_frame, text = "This is the main window").pack() 
     tk.Button(self.main_frame, text = "Open 2 top level windows!", command = self.open_windows).pack() 

    def motion(self, event): 
     x, y = event.x, event.y 
     print('{}, {}'.format(x, y)) 

    def open_windows(self): 
     self.top1 = tk.Toplevel(self.master) 
     self.top2 = tk.Toplevel(self.master) 
     self.top1.geometry("100x100") 
     self.top2.geometry("100x100") 
     # ties the window close event to our customer close method for toplevel 
     self.top1.protocol("WM_DELETE_WINDOW", self.close_toplevels) 
     self.top2.protocol("WM_DELETE_WINDOW", self.close_toplevels) 
     self.master.bind("<Unmap>", self.icon_all) 
     self.top1.bind("<Unmap>", self.icon_all) 
     self.top2.bind("<Unmap>", self.icon_all) 
     self.master.bind("<Map>", self.de_icon_all) 
     self.top1.bind("<Map>", self.de_icon_all) 
     self.top2.bind("<Map>", self.de_icon_all) 

     for child in self.main_frame.winfo_children(): 
      child.configure(state='disable') 

     tk.Label(self.top1, text ="Topwindow 1").pack() 
     tk.Label(self.top2, text ="Topwindow 2").pack() 

     # sets the top windows to their initial locations 
     self.lock_top_to_root() 

     #keeps the top windows in the specified locations compared to root window 
     self.master.bind("<Configure>", self.lock_top_to_root) 

    def withdraw_tops(self, event=None): 
     self.top1.withdraw() 
     self.top2.withdraw() 

    def de_icon_tops(self, event=None): 
     self.top1.deiconify() 
     self.top2.deiconify() 

    def icon_all(self, event=None): 
     self.withdraw_tops() 
     self.master.iconify() 

    def de_icon_all(self, event=None): 
     self.de_icon_tops() 
     self.master.deiconify() 
     self.lock_top_to_root() 

    def lock_top_to_root(self, event=None): 
     self.top1.lift() # lift both toplevel windows about root 
     self.top2.lift() 
     # places each top level at each side 
     # this is not set up to compensate for the root being resized but can be if you need it to. 
     self.top1.geometry('+{}+{}'.format(self.master.winfo_x()+10, self.master.winfo_y()+30)) 
     self.top2.geometry('+{}+{}'.format(self.master.winfo_x()+275, self.master.winfo_y()+30)) 

    def close_toplevels(self): 
     # customer close method to reset everything 
     self.master.unbind('<Configure>') 
     self.master.unbind("<Unmap>") 
     self.master.unbind("<Map>") 
     self.top1.destroy() 
     self.top2.destroy() 
     for child in self.main_frame.winfo_children(): 
      child.configure(state='active') 

root = tk.Tk() 
my_example = ExampleApp(root) 
root.mainloop() 
+0

Das schließt meine Toplevel-Fenster an mein Root-Tk-Fenster, was großartig ist. Allerdings erscheinen die Toplevel-Fenster immer noch nicht, wenn ich erneut auf das Hauptfenster klicke. Ich öffne den Toplevel, klicke auf eine Textdatei, die ich geöffnet habe, dann klicke auf die UI in der Taskleiste, und nur das Root-Tk-Fenster erscheint. Toplevel-Fenster bleiben hinter dieser Textdatei verborgen und ich muss speziell auf die Toplevel-Fenster klicken, um sie nach vorne zu bringen. –

+0

Es funktioniert für mich. Das einzige, was mir aufgefallen ist, ist, wenn man auf etwas außerhalb der App wie Chrom klickt und dann die Tab-Taste darüber nur eines der oberen Fenster zeigt. Ich könnte das wahrscheinlich beheben, aber wenn ich irgendwo auf das Hauptfenster klicke, werden die 2 oberen Fenster sofort auf ihre Plätze im Hauptfenster gehoben. –

+0

ok. Ich werde meine Implementierung überprüfen und Sie hier informieren. Ty –

Verwandte Themen