2017-08-28 165 views
0

我有一个UI根窗口,其中两个其他Toplevel窗口在单独的按钮单击上创建。这些Toplevel窗口被锚定到根窗口并沿着带有根窗口的屏幕拖动。当按钮窗口点击时,使Toplevel窗口弹出到顶部

我的问题是如果我有另一个窗口打开,我的用户界面隐藏在它后面,如果我点击我的用户界面从任务栏或小我可以看到在屏幕上,只有根窗口弹出和另一个Toplevel窗户仍然藏在另一个窗户后面。

我试过toplevel.lift()toplevel.wm_attributes("-topmost", 1),但都不给我想要的东西。

我该如何绑定Toplevel窗口,以便如果它们打开并且我点击根窗口Toplevel窗口也会弹出到顶部?

+0

请提供[MCVE] –

+0

尝试'toplevel_name.attributes(“ - 层次最高的”,真)' –

+0

事情是这使得顶层窗口的最顶层高于一切,即使我点击另一个窗口。我想让整个UI消失,如果我点击其他东西,但是如果我再次点击UI并且Toplevel打开,我想要顶层以及当单击根Tk()窗口时出现在前面。 –

回答

1

下面是一个简单的例子,它将打开2个窗口并禁用根窗口上的所有内容,同时还绑定与该根窗口的任何交互操作以提取其上的所有顶层窗口。

我还绑定了顶级关闭事件,首先删除根绑定,然后销毁顶级,然后重新启用根窗口中的所有小部件。这应该成为你想要做的古代事例。

让我知道如果您有任何问题。

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

这是锁定我的Toplevel窗口到我的根Tk窗口,这是伟大的。然而,当我再次点击主窗口时,Toplevel窗口仍然没有弹出。我打开Toplevel,点击让我们说我已经打开的文本文件,然后点击任务栏中的用户界面,只弹出根Tk窗口。 Toplevel窗口隐藏在该文本文件的后面,我必须专门点击Toplevel窗口才能让它们弹出到前面。 –

+0

它适合我。我唯一注意到的是,如果点击Chrome之外的任何应用程序,然后重新选择它,只会显示其中一个顶层窗口。我大概可以解决这个问题,但是如果我点击根窗口上的任何位置,2个顶部窗口会立即提升到主窗口上的位置。 –

+0

好的。我会看看我的实施,并让你知道这里。 Ty –

相关问题