所以我遇到了一些我无法理解并需要帮助的事情。我有 2 个按钮,它们都将您发送到下一帧,它们工作得很好,但是当我调整窗口大小时,它们保持相同的大小并保持在左上角,我希望它们将它们自己放在屏幕的中央。如果有一个关于它们也在成长的例子,那也将是值得赞赏的,但不是必需的。如果可能的话,我也想坚持使用网格。我尝试了 columnconfigure 并将框架放在另一个框架中,但我所做的一切似乎都不起作用。奇怪的是,如果我用 self 替换容器并将 self 放在它可以工作的按钮上但没有命令工作,有人可以向我解释这一点或给我一个很好的例子来说明我做错了什么?
代码示例:
import tkinter as tk
class MYapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.grid(row = 0,column = 0, sticky = "nsew")
container.rowconfigure(0, weight = 1)
container.columnconfigure(0, weight = 1)
container.columnconfigure(1, weight = 1)
self.frames = {}
for FRAME in (N1, N2):
frame = FRAME(container, self)
self.frames[FRAME] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(N1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class N1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
a.grid(row = 0, column = 0, sticky = "nsew")
c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
c.grid(row = 0, column = 1, sticky = "nsew")
class N2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
b = tk.Button(self, text = "N2")
b.grid(row = 0, column = 0, sticky = "nsew")
if __name__ == "__main__":
app = MYapp()
app.mainloop()
已解决:感谢布赖恩。这是带有答案的更新代码。
import tkinter as tk
class MYapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(fill="both", expand=True)
container.rowconfigure(0, weight = 1)
container.columnconfigure(0, weight = 1)
self.frames = {}
for FRAME in (N1, N2):
frame = FRAME(container, self)
self.frames[FRAME] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
frame.rowconfigure(0, weight = 1)
frame.columnconfigure(0, weight = 1)
frame.columnconfigure(1, weight = 1)
self.show_frame(N1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class N1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
a.grid(row = 0, column = 0, sticky = "nsew")
c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
c.grid(row = 0, column = 1, sticky = "nsew")
class N2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
b = tk.Button(self, text = "N2")
b.grid(row = 0, column = 0, sticky = "nsew")
if __name__ == "__main__":
app = MYapp()
app.mainloop()
你不知道首选的行为是什么,只是它在做什么是错误的。我不知道这个建议是否会做你想要的。
根据经验,当您使用时,grid
您应该始终为包含正在管理的小部件的父级赋予至少一行和一列的权重。当您为容器中的小部件执行此操作时,您不会为根窗口执行此操作。因此,容器内的小部件可能会正确调整大小,但您不会看到它,因为容器本身没有调整大小。
如果您只想将一个小部件放入另一个小部件中,我建议您使用,pack
因为您可以在一行代码中完成所有操作。因此,我建议使用pack
而不是grid
容器本身:
container.pack(fill="both", expand=True)
此外,由于您的容器似乎只有一行和一列,您可能不想为第 1 列赋予权重。
最后,您还使用grid
管理每个页面 ( N1
, N2
)内的小部件,但同样,您忘记为这些框架内的任何行或列赋予权重。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句