Python tkinter 帧不会使用 Grid 填充父容器



我有点被这个问题困住了。我正在尝试构建一个包含多个页面的应用程序。为此,我创建了一个主框架,然后我在每个时刻都提升了我需要的框架。这是我到目前为止编写的代码:

class Main(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
main_container = tk.Frame(self)
main_container.grid(sticky = "nsew")
main_container.grid_rowconfigure(0, weight = 1)
main_container.grid_columnconfigure(0, weight = 1)
menu_bar = tk.Menu(main_container)
file_menu = tk.Menu(menu_bar, tearoff = 0) 
file_menu.add_command(label = "Save settings", command = lambda: popupmsg("Not supported yet!"))
file_menu.add_separator()
file_menu.add_command(label = "Exit", command = quit)
menu_bar.add_cascade(label = "File", menu = file_menu)
tk.Tk.config(self, menu = menu_bar)
self.frames = {}
for fr in (MainPage, GraphsPage, Page2):
frame = fr(main_container, self)
self.frames[fr] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(MainPage)

def show_frame(self, pointer):
frame = self.frames[pointer]
frame.tkraise()

然后,例如,主页是:

class MainPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
#Tried this but it doesn't work
#self.columnconfigure(0, weight = 1)
#self.rowconfigure(0, weight = 1)
#self.rowconfigure(1, weight = 1)
#self.rowconfigure(2, weight = 1)
#self.rowconfigure(3, weight = 1)
label = tk.Label(self, text = "Main Page", font = LARGE_FONT)
label.grid(row = 0, padx = 10, pady = 10)
button1 = ttk.Button(self, text = "Graphs", command = lambda: controller.show_frame(GraphsPage))
button1.grid(row = 1, sticky = 'nswe')
button2 = ttk.Button(self, text = "Page 2", command = lambda: controller.show_frame(Page2))
button2.grid(row = 2, sticky = 'nswe')
button3 = ttk.Button(self, text = "Exit", command = quit)
button3.grid(row = 3, sticky = 'nswe')

(为了简单起见,我不显示GraphsPage和Page 2(。最后,我运行程序如下:

app = Main()
app.geometry("1280x720")
app.mainloop()

我能够使按钮适合整个列,但列不适合"1280x720"主容器。我错过了什么? 提前感谢您的时间。

你在MainPage构造函数中有正确的想法,但后来把它注释掉了,但你错过了在顶级对象Tk做:

import tkinter as tk
from tkinter import ttk
LARGE_FONT = ("ariel", 20) # dont know what you had here
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.grid_rowconfigure(0, weight=1) # this needed to be added
self.grid_columnconfigure(0, weight=1) # as did this
main_container = tk.Frame(self)
main_container.grid(column=0, row=0, sticky = "nsew")
main_container.grid_rowconfigure(0, weight = 1)
main_container.grid_columnconfigure(0, weight = 1)
menu_bar = tk.Menu(main_container)
file_menu = tk.Menu(menu_bar, tearoff = 0) 
file_menu.add_command(label = "Save settings", command = lambda: popupmsg("Not supported yet!"))
file_menu.add_separator()
file_menu.add_command(label = "Exit", command = quit)
menu_bar.add_cascade(label = "File", menu = file_menu)
tk.Tk.config(self, menu = menu_bar)
self.frames = {}
for fr in (MainPage,):
frame = fr(main_container, self)
self.frames[fr] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(MainPage)
def show_frame(self, pointer):
frame = self.frames[pointer]
frame.tkraise()
class MainPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
# uncommented these lines
self.columnconfigure(0, weight = 1)
self.rowconfigure(0, weight = 1)
self.rowconfigure(1, weight = 1)
self.rowconfigure(2, weight = 1)
self.rowconfigure(3, weight = 1)
label = tk.Label(self, text = "Main Page", font = LARGE_FONT)
label.grid(row = 0, padx = 10, pady = 10)
button1 = ttk.Button(self, text = "Graphs", command = lambda: controller.show_frame(GraphsPage))
button1.grid(row = 1, sticky = 'nswe')
button2 = ttk.Button(self, text = "Page 2", command = lambda: controller.show_frame(Page2))
button2.grid(row = 2, sticky = 'nswe')
button3 = ttk.Button(self, text = "Exit", command = quit)
button3.grid(row = 3, sticky = 'nswe')
app = Main()
app.geometry("1280x720")
app.mainloop()

澄清一下,GUI 没有填满整个窗口的原因是main_container(您的主 Tkinter 对象(没有被分配权重。在 Tkinter 中,权重描述了如果有额外空间,行或列将增长多少。默认情况下,Tkinter 中的所有内容的权重均为 0,因此除非您修改内容,否则不会调整任何内容的大小。

最新更新