Python tkinter-克隆根窗口属性并将其应用于顶级窗口

Python tkinter-克隆根窗口属性并将其应用于顶级窗口,python,tkinter,Python,Tkinter,我想创建多个外观几乎相同的窗口,而不在每个函数中复制/粘贴所有窗口属性 def child_window(): childwindow.geometry("400x800") def window_one(): childwindow = Toplevel(root) childwindow.title("title window one") child_window() def window_two(): childwindow = Toplevel

我想创建多个外观几乎相同的窗口,而不在每个函数中复制/粘贴所有窗口属性

def child_window():
    childwindow.geometry("400x800")

def window_one():
    childwindow = Toplevel(root)
    childwindow.title("title window one")
    child_window()

def window_two():
    childwindow = Toplevel(root)
    childwindow.title("title window two")
    child_window()
该代码不起作用,因为childwindow不会从常规函数child_window中接管几何体属性。
是否有任何可能的方法可以将设计复制到所有窗口,而不将整个代码放入每个函数中。

您的代码不必要地重复自身并失败,以下是解决问题的方法,并遵循原则

from tkinter import *
from tkinter.ttk import *

def main():
    root = Tk()

    tops = list()
    for i in range(2):
        tops.append(same_top(root, 'title window ' + str(i)))

    mainloop()


def same_top(root, toptitle):
    child = Toplevel(root)
    child.title(toptitle)
    child.geometry("400x800")

    return child


if __name__ == '__main__':
    main()
您的问题是,您的子函数不知道谁是
childwindow
,如果您将
childwindow
传递给几何体函数,则它将工作

您的代码已修复:

from tkinter import *
from tkinter.ttk import *

def main():
    root = Tk()

    window_one(root)
    window_two(root)

    mainloop()


def child_window(childwindow):
    childwindow.geometry("400x800")

def window_one(root):
    childwindow = Toplevel(root)
    childwindow.title("title window one")
    child_window(childwindow)

def window_two(root):
    childwindow = Toplevel(root)
    childwindow.title("title window two")
    child_window(childwindow)


if __name__ == '__main__':
    main()

如果将
Toplevel
对象传递给
child\u窗口
函数,则可以使用该对象直接设置该
Toplevel
窗口的几何图形(也请不要重用变量名称):


我同意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()
有关OOP方法,请参见以下示例:

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()

您的
child\u window()
函数不知道
childwindow
顶级窗口。这有两个原因。这两个函数仅在本地命名空间中工作,因此不共享信息。您还可以将维度保留在
child\u窗口
函数中,并在创建
root
后立即调用
child\u窗口(root)
,以使所有窗口具有相同的大小。
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()