Сделать всплывающее окно верхнего уровня вверху при нажатии корневого окна

У меня есть корневое окно пользовательского интерфейса, в котором два других окна верхнего уровня создаются отдельными нажатиями кнопок. Эти окна верхнего уровня привязаны к корневому окну и перетаскиваются по экрану вместе с корневым окном.

Моя проблема заключается в том, что если у меня открыто другое окно, и мой пользовательский интерфейс скрывается за ним, если я нажимаю на свой пользовательский интерфейс на панели задач или немногое, что я вижу на экране, всплывает только окно root Tk, а другие окна верхнего уровня все еще прячется за другим окном.

Я пробовал toplevel.lift() и toplevel.wm_attributes("-topmost", 1), но ни один из них не дал мне того, что я хочу.

Как я могу связать окна верхнего уровня, чтобы, если они открыты, и я нажимаю на корневое окно, окно верхнего уровня также всплывает наверх?


person E. Oregel    schedule 28.08.2017    source источник
comment
Предоставьте минимальный воспроизводимый пример   -  person Bryan Oakley    schedule 28.08.2017
comment
попробуй toplevel_name.attributes("-topmost", True)   -  person Mike - SMT    schedule 28.08.2017
comment
Дело в том, что это делает окно Toplevel самым верхним над всем остальным, даже если я нажму на другое окно. Я хочу, чтобы весь пользовательский интерфейс исчез, если я нажму что-то еще, но если я снова нажму на пользовательский интерфейс и откроется верхний уровень, я хочу, чтобы верхний уровень также вышел на передний план, когда нажимается окно root Tk().   -  person E. Oregel    schedule 28.08.2017


Ответы (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()
person Mike - SMT    schedule 28.08.2017
comment
Это блокирует мои окна верхнего уровня в моем корневом окне Tk, и это здорово. Однако окна верхнего уровня по-прежнему не появляются, когда я снова нажимаю на главное окно. Я открываю Toplevel, нажимаю, скажем, на открытый текстовый файл, затем нажимаю на пользовательский интерфейс внизу на панели задач, и появляется только окно root Tk. Окна верхнего уровня остаются скрытыми за этим текстовым файлом, и мне приходится нажимать на окна верхнего уровня специально, чтобы они появлялись на переднем плане. - person E. Oregel; 28.08.2017
comment
Меня устраивает. Единственное, что я заметил, это то, что если щелкнуть что-либо за пределами приложения, например хром, а затем вернуться назад, отображается только одно из верхних окон. Вероятно, я мог бы это исправить, но если я щелкну где-нибудь в корневом окне, 2 верхних окна мгновенно поднимутся на свои места в главном окне. - person Mike - SMT; 28.08.2017
comment
в порядке. Я рассмотрю свою реализацию и дам вам знать здесь. Тай - person E. Oregel; 28.08.2017
comment
@E.Oregel Я играл с приложением. Я добавил несколько дополнительных привязок. Дайте мне знать, если это поможет. - person Mike - SMT; 29.08.2017