Я согласен с fhdrsdg в его решении, но я бы изменил одну вещь.Вместо функции, содержащей одно установленное значение для размера, пусть эта функция сначала проверяет размер корневого окна, а затем применяет тот же размер к окну верхнего уровня.
Ваша основная проблема может быть решена несколькими методами.Один из способов - передать окно верхнего уровня функции, отвечающей за назначение геометрии.Вы также можете создать класс (IMO - лучший вариант по разным причинам), и вы также можете использовать global
для управления вашими верхними окнами в глобальном пространстве имен.
Как это:
import tkinter as tk
def child_window(window):
window.geometry("{}x{}".format(root.winfo_width(), root.winfo_height()))
def window_one():
childwindow = tk.Toplevel(root)
childwindow.title("title window one")
child_window(childwindow)
def window_two():
childwindow = tk.Toplevel(root)
childwindow.title("title window two")
child_window(childwindow)
root = tk.Tk()
root.geometry("500x300")
# I added this delay due to an issue tkinter has with reading the root size before the mainloop has had a change to fully load the root window.
root.after(1000, window_one)
root.after(1000, window_two)
root.mainloop()
Для подхода ООП см. Этот пример:
import tkinter as tk
class Example(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.geometry("500x300")
self.after(1000, self.window_one)
self.after(1000, self.window_two)
def child_window(self, window):
print("{}x{}".format(self.winfo_width(), self.winfo_height()))
window.geometry("{}x{}".format(self.winfo_width(), self.winfo_height()))
def window_one(self):
childwindow = tk.Toplevel(self)
childwindow.title("title window one")
self.child_window(childwindow)
def window_two(self):
childwindow = tk.Toplevel(self)
childwindow.title("title window two")
self.child_window(childwindow)
if __name__ == "__main__":
Example().mainloop()