Python 如何将包含两个小部件的水平框架放入默认的垂直框架中?

Python 如何将包含两个小部件的水平框架放入默认的垂直框架中?,python,python-3.x,Python,Python 3.x,我有一个垂直布局,一些水平行包含一些小部件。当我添加第一行时,它运行正常,但是第二行在第一行的末尾,而不是在垂直帧中 我已经尝试了我能找到的一切,但没有运气 import tkinter win = tkinter.Tk() frame2 = tkinter.Frame() frame3 = tkinter.Frame() frame2.pack() frame3.pack() lv1 = tkinter.Label(win, text = "Vertical lab 1") lv1.pa

我有一个垂直布局,一些水平行包含一些小部件。当我添加第一行时,它运行正常,但是第二行在第一行的末尾,而不是在垂直帧中

我已经尝试了我能找到的一切,但没有运气

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行有两个小部件,第4行有两个小部件,第5行有一个小部件

我找不到使用
.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()
,这里
frame1
None
类型的代码中的所有其他内容都是
None
,因此您需要在后面放置它。

如前所述,不要在同一主窗口中使用
.pack()
.grid()

答案非常简单

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

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

我测试了这个方法,效果非常好


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

要定位,请使用tkinter grid选项:

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()