Заставить окно верхнего уровня следовать за корневым окном Tk

Я ничего не могу найти по этому поводу и задаюсь вопросом, возможно ли это вообще.

Есть ли способ заставить окно верхнего уровня следовать за корневым окном Tk, когда вы перемещаете окно Tk по экрану?

Что я делаю, так это создаю корневое окно Tk root=Tk(). Затем я создаю верхний уровень window=Toplevel() и делаю окно верхнего уровня на одном уровне с корневым окном с правой стороны. Что мне любопытно, так это то, как привязать окно верхнего уровня к корню, чтобы, когда я перетаскивал корневое окно, окно верхнего уровня следовало за ним.


person E. Oregel    schedule 25.08.2017    source источник


Ответы (1)


Вы можете привязаться к событию <Configure> корневого окна, которое срабатывает при перемещении или изменении размера окна. При этом вы можете настроить расположение верхнего уровня.

import tkinter as tk

class Example:
    def __init__(self):
        self.root = tk.Tk()
        label = tk.Label(self.root, text="Move me around...")
        label.pack(side="top", fill="both", expand=True, padx=20, pady=20)

        self.top = tk.Toplevel()
        label = tk.Label(self.top, text="... and I will follow!")
        label.pack(side="top", fill="both", expand=True, padx=20, pady=20)

        self.root.bind("<Configure>", self.sync_windows)

    def start(self):
        self.root.mainloop()

    def sync_windows(self, event=None):
        x = self.root.winfo_x() + self.root.winfo_width() + 4
        y = self.root.winfo_y()
        self.top.geometry("+%d+%d" % (x,y))

Example().start()
person Bryan Oakley    schedule 25.08.2017
comment
Итак, теперь еще один вопрос. Могу ли я сделать это для двух верхних уровней одновременно? Это работает для одного, но если я открою оба, будет следовать только последний, на который я нажал. Есть ли что-то вроде ‹Configure-2› или что-то в этом роде? - person E. Oregel; 28.08.2017
comment
@E.Oregel: <Configure-2> нет. Нет никаких ограничений на количество верхних уровней, которые вы можете иметь. - person Bryan Oakley; 28.08.2017