Python-使用网格管理器的多帧
我试图使用Tkinter模块(Python2.7)中的功能创建一个GUI,该GUI将八个小部件放置在一个7行5列的网格上(很抱歉,我没有包含图像;对话框不允许我浏览和上载保存的图像) (小部件,开始行,开始列,行跨度,列跨度):Python-使用网格管理器的多帧,python,tkinter,Python,Tkinter,我试图使用Tkinter模块(Python2.7)中的功能创建一个GUI,该GUI将八个小部件放置在一个7行5列的网格上(很抱歉,我没有包含图像;对话框不允许我浏览和上载保存的图像) (小部件,开始行,开始列,行跨度,列跨度): (“按钮0”,6,0,1,1) (“按钮1”,6,1,1,1) (“按钮2”,6,2,1,1) (“按钮3”,6,3,1,1) (“按钮4”,6,4,1,1) (“框架1”,0,0,3,2) (“框架2”,2,0,3,2) (“框架3”,0,3,6,3) 然而,当我运行
由于第1帧、第2帧和第3帧内部没有任何小部件,并且您没有给它们任何高度,因此它们的自然大小将为一个像素高。如果你在frame2中放置了一些东西,或者给frame2一个高度,它就会显示出来。在花了几个小时修改我的代码之后,我终于能够创建我想要的GUI了。关键是在行和列之间循环,并分别使用rowconfigure和columnconfigure设置它们的权重。代码如下:
from tkinter import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid()
self.master.title("Grid Manager")
for r in range(6):
self.master.rowconfigure(r, weight=1)
for c in range(5):
self.master.columnconfigure(c, weight=1)
Button(master, text="Button {0}".format(c)).grid(row=6,column=c,sticky=E+W)
Frame1 = Frame(master, bg="red")
Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
Frame2 = Frame(master, bg="blue")
Frame2.grid(row = 3, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
Frame3 = Frame(master, bg="green")
Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S)
root = Tk()
root.geometry("400x200+200+200")
app = Application(master=root)
app.mainloop()
如果你愿意,试试pytkgen(https://github.com/tmetsch/pytkgen 或者)-它从JSON文件生成Tkinter GUI,并负责重量、高度和行/列配置。请参见此处的示例:框架不是小部件吗?即使它们的高度默认为一个像素高,我也指定了一个rowspan,columnspan,并使它们在各个方向上都具有粘性,所以当我调整窗口大小时,它们为什么不展开?@Jubbles:因为只有一行的权重>0。当您调整大小时,您会创建额外的空间,这些额外的空间由小部件相对于其重量填充。因为只有一行的权重为1,所以你说的是“我想要100%的额外空间用于这一行”,我现在明白了。您的评论非常有用。非常感谢您提供的链接。对于运行此示例的任何人来说,窗口最初的高度和宽度都是有限的,您必须调整其大小以确认代码正常工作。或者,给它一个默认的几何体,
root.geometry(“400x200+200+200”)
(就在root=Tk()之后)。
from tkinter import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid()
self.master.title("Grid Manager")
for r in range(6):
self.master.rowconfigure(r, weight=1)
for c in range(5):
self.master.columnconfigure(c, weight=1)
Button(master, text="Button {0}".format(c)).grid(row=6,column=c,sticky=E+W)
Frame1 = Frame(master, bg="red")
Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
Frame2 = Frame(master, bg="blue")
Frame2.grid(row = 3, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
Frame3 = Frame(master, bg="green")
Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S)
root = Tk()
root.geometry("400x200+200+200")
app = Application(master=root)
app.mainloop()