Python-使用网格管理器的多帧

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) 然而,当我运行

我试图使用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)
  • 然而,当我运行代码时,按钮和Frame3呈现良好,但Frame1垂直“挤压”Frame2。如有任何建议,将不胜感激。(我已经阅读了建议的StackOverflow答案,但似乎没有一个提供可以用来解决我问题的信息。此外,我在网上进行了大量搜索,但没有任何结果。)

    更新:现在我在我的个人电脑前,这里分别是我想要的结果和我得到的结果的图像:


    由于第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()