【问题标题】:How to put a horizontal frame containing a couple of widgets into a default vertical frame?如何将包含几个小部件的水平框架放入默认的垂直框架中?
【发布时间】:2019-05-26 23:13:32
【问题描述】:

我有一个垂直布局,其中一些水平行包含一些小部件。当我添加第一行时它很好,但是第二行在第一行的末尾而不是回到垂直框架中

我已经尝试了所有我能找到的东西,但没有运气。

import tkinter
win = tkinter.Tk()

frame2 = tkinter.Frame()
frame3 = tkinter.Frame()

frame2.pack()
frame3.pack()

lv1 = tkinter.Label(win, text = "Vertical lab 1")
lv1.pack()
lv2 = tkinter.Label(win, text = "Vertical lab 2")
lv2.pack()

v = tkinter.IntVar()

rb1 = tkinter.Radiobutton(frame2, padx = 10, variable=v,value=1)
rb1.pack()
lh1 = tkinter.Label(frame2, text = "Horizontal lab1")
lh1.pack()
frame2 = tkinter.Frame(win).pack()

rb2 = tkinter.Radiobutton(frame3, padx = 10, variable=v, value=2)
rb2.pack()
lh2 = tkinter.Label(frame3, text = "Horizontal lab2")
lh2.pack()
frame3 = tkinter.Frame(win).pack()

lv3 = tkinter.Label(win, text = "Vertical lab 3")
lv3.pack(anchor="w")

win.mainloop()

我想要的是这样的东西:第 1 行的一个小部件,第 2 行的一个小部件,第 3 行的 2 个小部件,第 4 行的 2 个小部件,第 5 行的 1 个小部件

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    我找不到使用.pack() 的解决方案,所以我决定使用.grid() 作为标签、框架内的单选按钮。

    from tkinter import *
    
    window = Tk()
    
    frame1 = Frame(window)
    Label(frame1, text = "Vertical lab 1").grid(row = 0, column = 0)
    Label(frame1, text = "Vertical lab 2").grid(row = 1, column = 0)
    frame1.pack()
    
    v = IntVar()
    frame2 = Frame(window)
    rb1 = Radiobutton(frame2, padx = 10, variable=v,value=1)
    rb1.grid(row = 0, column = 0)
    Label(frame2, text = "Horizontal lab1").grid(row = 0, column = 1)
    rb2 = Radiobutton(frame2, padx = 10, variable=v,value=1)
    rb2.grid(row = 1, column = 0)
    Label(frame2, text = "Horizontal lab1").grid(row = 1, column = 1)
    frame2.pack()
    
    frame3 = Frame(window)
    Label(frame3, text = "Vertical lab 3").grid(row = 0, column = 0)
    frame3.pack()
    
    window.mainloop()
    

    输出看起来像这样

    我想这就是你要找的。
    另外我想提一下,当您在声明它的同一行中使用几何管理器时,例如frame1 = tkinter.Frame().pack(),这里frame1None,因此None 类型代码中的其他所有内容也是如此您需要在之后放置它。
    正如这里提到的https://effbot.org/tkinterbook/pack.htm 不要在同一个主窗口中使用.pack().grid()

    【讨论】:

      【解决方案2】:

      答案很简单。

      小部件和包含小部件的框架在放入父窗口框架时具有不同的权重/优先级。

      只需将所有小部件放入框架中,然后当它们添加到父窗口框架时,它们都将具有相同的权重/优先级,并将按照它们添加的顺序出现。

      我测试了这个方法,效果很好。

      (但肯定没有必要这样做。我还遗漏了什么吗?相应的 Java 布局管理器没有这个问题!小部件和包含小部件的框架被视为相同。)

      【讨论】:

        【解决方案3】:

        对于定位使用 tkinter 网格选项:

        from tkinter import *
        
        window = Tk()
        window.geometry('600x400')
        
        # set widget object
        label = Label(window, text="Vertical lab 1")
        # set position of widget into grid
        label.grid(column=0, row=0)
        
        label = Label(window, text="Vertical lab 2")
        label.grid(column=0, row=1)
        label = Radiobutton(window, text="Horizontal lab 1", value=0)
        label.grid(column=0, row=2)
        label = Radiobutton(window, text="Horizontal lab 2", value=1)
        label.grid(column=1, row=2)
        label = Radiobutton(window, text="Horizontal lab 3", value=0)
        label.grid(column=0, row=3)
        label = Radiobutton(window, text="Horizontal lab 4", value=1)
        label.grid(column=1, row=3)
        label = Label(window, text="Vertical lab 3")
        label.grid(column=0, row=4)
        
        window.mainloop()
        

        【讨论】:

          猜你喜欢
          • 2015-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多