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