如何在 Tkinter 中相对于其他框架扩展框架中的小部件大小(帮助 on:Tkinter 网格管理)
How to expand widgets size in a frame with respect to other frames in Tkinter (Help on:Tkinter grid management)
我使用 Tkinter 创建了 5 个框架,每个框架包含
- frame0 -
label
,Entry box
和 button(Enter)
- 第 1 帧 -
label
和 list box
在左侧
- frame2 -
2 buttons(select & unselect)
在中心
- frame3 -
label
和 listbox
在右侧
frame4 - 2 buttons(done & clear)
----------------------------------------
| frame0 |
----------------------------------------
| | | |
| frame1 | frame2 | frame3 |
| | | |
----------------------------------------
| frame4 |
----------------------------------------
这是我的代码:
from Tkinter import *
def toplevelwin():
def clear():
return
def select():
return
def unselect():
return
def done():
return
def enter():
return
window = Toplevel()
frame0 = Frame(window)
frame0.grid(row=0, column=0, sticky=W, padx=5, pady=5, columnspan=2)
frame0.grid_columnconfigure(1,weight=2)
lblentry = Label(frame0, text="Entery Box:")
lblentry.grid(row=0, column=0, sticky=W)
entrybx = Entry(frame0)
entrybx.grid(row=1,column=0,sticky=N+S+E+W, columnspan=2)
entrybt = Button(frame0, text=' Enter ', command=enter)
entrybt.grid(row=1,column=2,sticky=N+W, padx=3)
frame1 = Frame(window)
frame1.grid(row=1, column=0, sticky=E+W, padx=5, pady=5)
lblshow_lst = Label(frame1, text="List Box 1:")
lblshow_lst.grid(row=0,sticky=W)
show_lst = Listbox(frame1)
show_lst.grid(row=1,sticky=W)
frame2 = Frame(window)
frame2.grid(row=1, column=1, sticky=W)
frame2.grid_columnconfigure(1,weight=1)
selbtn = Button(frame2, text='Select', command=select)
selbtn.grid(row=0, padx=5, sticky=E+W)
selbtn.grid_columnconfigure(1,weight=1)
uselbtn = Button(frame2, text='Unselect', command=unselect)
uselbtn.grid(row=1, padx=5, sticky=E+W)
uselbtn.grid_columnconfigure(1,weight=1)
frame3 = Frame(window)
frame3.grid(row=1, column=2, sticky=W, padx=5, pady=5)
lblsel_lst = Label(frame3, text="List Box 2:")
lblsel_lst.grid(row=0,sticky=W)
sel_lst = Listbox(frame3)
sel_lst.grid(row=1, column=0, sticky=W)
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky=E, padx=5, pady=5)
Button(frame4, text=' Done ', command=done).grid(row=0, column=0, padx=7 ,pady=2)
Button(frame4, text='Clear', command=clear).grid(row=0,column=1, padx=7,pady=2)
window.wait_window(window)
root = Tk()
toplevelwin()
root.mainloop()
这就是我的 window 现在的样子:
我的问题是:
- 如何将
frame0
扩展到 frame3
。即,我希望 entry box
延伸到 frame3 的末端,button(enter)
保持在其右侧。
- 我希望
bottom frame's
按钮(完成并清除)放置在 window 的右侧
尝试次数:
我试图增加条目小部件的大小,这反过来将 frame2 和 frame3 推到右侧。
使用了sticky=N+S+W+E
,将其推到window
的中心
也尝试了 sticky=W
包含 2 个按钮的底部框架。他们移动到中心但不正确
您不需要框架(底部的按钮除外)。
只需像这样制作您的小部件:
entrybx = Entry(window)
entrybx.grid(row=0,column=0,sticky=N+S+E+W, columnspan=2) # columnspan= 3 better?
当您想要列左侧的小部件时,请使用 sticky=W
sticky=W +E
居中,sticky=E
居右。
底部的按钮不要忘记columnspan
:
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky=E, padx=5, pady=5, columnspan=3)
Button(frame4, text=' Done ', command=done).grid(row=0, column=0, padx=7 ,pady=2, sticky=E)
Button(frame4, text='Clear', command=clear).grid(row=0,column=1, padx=7,pady=2, sticky=E)
使用网格时,要使小部件能够扩展或缩小,您需要
设置其 sticky
参数并设置其网格单元格的 weight
。 每一列每一行
网格的权重 .
默认情况下,所有列和行的权重都是 0,这意味着它们
将缩小到最小的有效尺寸。
要使其在东西方向扩展,请增加其列权重
grid_columnconfigure
.
要使其在南北方向扩展,请增加其行宽
grid_rowconfigure
.
因此,对于 frame0
,
- 使用
columnspan=3
使frame0
跨越3列。
- 使用
sticky='WE'
使frame0
粘在东西两边
它的细胞。
- 使用
frame0.grid_columnconfigure(0, weight=1)
将网格单元格的权重增加到 1。
对于frame4
,
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky='E', padx=5, pady=5, columnspan=3)
可以通过让 frame4
粘在东侧(如果它的单元格)来工作。请注意,如果没有权重,frame4
也会缩小;它只是在粘在东侧时缩小,所以它包含的按钮最终在右边。
如果你想让frame4
从西到东横跨整个space,如图所示,那么使用
frame4.grid(row=2, column=0, sticky='WE', padx=5, pady=5, columnspan=3)
frame4.grid_columnconfigure(0, weight=1)
Button(frame4, text=' Done ', command=done).grid(
row=0, column=0, padx=7, pady=2, sticky='E')
Button(frame4, text='Clear', command=clear).grid(
row=0, column=1, padx=7, pady=2, sticky='E')
from Tkinter import *
def toplevelwin():
def clear(): return
select = unselect = done = enter = clear
window = Toplevel()
frame0 = Frame(window)
frame0.grid(row=0, column=0, sticky='WE', padx=5, pady=5, columnspan=3)
frame0.grid_columnconfigure(0, weight=1)
lblentry = Label(frame0, text="Entry Box:")
lblentry.grid(row=0, column=0, sticky='W')
entrybx = Entry(frame0)
entrybx.grid(row=1, column=0, sticky='NSEW', columnspan=2)
entrybt = Button(frame0, text=' Enter ', command=enter)
entrybt.grid(row=1, column=2, sticky='NW', padx=3)
frame1 = Frame(window)
frame1.grid(row=1, column=0, sticky='EW', padx=5, pady=5)
lblshow_lst = Label(frame1, text="List Box 1:")
lblshow_lst.grid(row=0, sticky='W')
show_lst = Listbox(frame1)
show_lst.grid(row=1, sticky='W')
frame2 = Frame(window)
frame2.grid(row=1, column=1, sticky='W')
selbtn = Button(frame2, text='Select', command=select)
selbtn.grid(row=0, padx=5, sticky='EW')
uselbtn = Button(frame2, text='Unselect', command=unselect)
uselbtn.grid(row=1, padx=5, sticky='EW')
frame3 = Frame(window)
frame3.grid(row=1, column=2, sticky='W', padx=5, pady=5)
lblsel_lst = Label(frame3, text="List Box 2:")
lblsel_lst.grid(row=0, sticky='W')
sel_lst = Listbox(frame3)
sel_lst.grid(row=1, column=0, sticky='W')
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky='WE', padx=5, pady=5, columnspan=3)
frame4.grid_columnconfigure(0, weight=1)
Button(frame4, text=' Done ', command=done).grid(
row=0, column=0, padx=7, pady=2, sticky='E')
Button(frame4, text='Clear', command=clear).grid(
row=0, column=1, padx=7, pady=2, sticky='E')
window.wait_window(window)
root = Tk()
toplevelwin()
root.mainloop()
我使用 Tkinter 创建了 5 个框架,每个框架包含
- frame0 -
label
,Entry box
和button(Enter)
- 第 1 帧 -
label
和list box
在左侧 - frame2 -
2 buttons(select & unselect)
在中心 - frame3 -
label
和listbox
在右侧 frame4 -
2 buttons(done & clear)
---------------------------------------- | frame0 | ---------------------------------------- | | | | | frame1 | frame2 | frame3 | | | | | ---------------------------------------- | frame4 | ----------------------------------------
这是我的代码:
from Tkinter import *
def toplevelwin():
def clear():
return
def select():
return
def unselect():
return
def done():
return
def enter():
return
window = Toplevel()
frame0 = Frame(window)
frame0.grid(row=0, column=0, sticky=W, padx=5, pady=5, columnspan=2)
frame0.grid_columnconfigure(1,weight=2)
lblentry = Label(frame0, text="Entery Box:")
lblentry.grid(row=0, column=0, sticky=W)
entrybx = Entry(frame0)
entrybx.grid(row=1,column=0,sticky=N+S+E+W, columnspan=2)
entrybt = Button(frame0, text=' Enter ', command=enter)
entrybt.grid(row=1,column=2,sticky=N+W, padx=3)
frame1 = Frame(window)
frame1.grid(row=1, column=0, sticky=E+W, padx=5, pady=5)
lblshow_lst = Label(frame1, text="List Box 1:")
lblshow_lst.grid(row=0,sticky=W)
show_lst = Listbox(frame1)
show_lst.grid(row=1,sticky=W)
frame2 = Frame(window)
frame2.grid(row=1, column=1, sticky=W)
frame2.grid_columnconfigure(1,weight=1)
selbtn = Button(frame2, text='Select', command=select)
selbtn.grid(row=0, padx=5, sticky=E+W)
selbtn.grid_columnconfigure(1,weight=1)
uselbtn = Button(frame2, text='Unselect', command=unselect)
uselbtn.grid(row=1, padx=5, sticky=E+W)
uselbtn.grid_columnconfigure(1,weight=1)
frame3 = Frame(window)
frame3.grid(row=1, column=2, sticky=W, padx=5, pady=5)
lblsel_lst = Label(frame3, text="List Box 2:")
lblsel_lst.grid(row=0,sticky=W)
sel_lst = Listbox(frame3)
sel_lst.grid(row=1, column=0, sticky=W)
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky=E, padx=5, pady=5)
Button(frame4, text=' Done ', command=done).grid(row=0, column=0, padx=7 ,pady=2)
Button(frame4, text='Clear', command=clear).grid(row=0,column=1, padx=7,pady=2)
window.wait_window(window)
root = Tk()
toplevelwin()
root.mainloop()
这就是我的 window 现在的样子:
我的问题是:
- 如何将
frame0
扩展到frame3
。即,我希望entry box
延伸到 frame3 的末端,button(enter)
保持在其右侧。 - 我希望
bottom frame's
按钮(完成并清除)放置在 window 的右侧
尝试次数:
我试图增加条目小部件的大小,这反过来将 frame2 和 frame3 推到右侧。
使用了
sticky=N+S+W+E
,将其推到window 的中心
也尝试了
sticky=W
包含 2 个按钮的底部框架。他们移动到中心但不正确
您不需要框架(底部的按钮除外)。 只需像这样制作您的小部件:
entrybx = Entry(window)
entrybx.grid(row=0,column=0,sticky=N+S+E+W, columnspan=2) # columnspan= 3 better?
当您想要列左侧的小部件时,请使用 sticky=W
sticky=W +E
居中,sticky=E
居右。
底部的按钮不要忘记columnspan
:
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky=E, padx=5, pady=5, columnspan=3)
Button(frame4, text=' Done ', command=done).grid(row=0, column=0, padx=7 ,pady=2, sticky=E)
Button(frame4, text='Clear', command=clear).grid(row=0,column=1, padx=7,pady=2, sticky=E)
使用网格时,要使小部件能够扩展或缩小,您需要
设置其 sticky
参数并设置其网格单元格的 weight
。 每一列每一行
网格的权重 .
默认情况下,所有列和行的权重都是 0,这意味着它们 将缩小到最小的有效尺寸。
要使其在东西方向扩展,请增加其列权重
grid_columnconfigure
.
要使其在南北方向扩展,请增加其行宽
grid_rowconfigure
.
因此,对于 frame0
,
- 使用
columnspan=3
使frame0
跨越3列。 - 使用
sticky='WE'
使frame0
粘在东西两边 它的细胞。 - 使用
frame0.grid_columnconfigure(0, weight=1)
将网格单元格的权重增加到 1。
对于frame4
,
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky='E', padx=5, pady=5, columnspan=3)
可以通过让 frame4
粘在东侧(如果它的单元格)来工作。请注意,如果没有权重,frame4
也会缩小;它只是在粘在东侧时缩小,所以它包含的按钮最终在右边。
如果你想让frame4
从西到东横跨整个space,如图所示,那么使用
frame4.grid(row=2, column=0, sticky='WE', padx=5, pady=5, columnspan=3)
frame4.grid_columnconfigure(0, weight=1)
Button(frame4, text=' Done ', command=done).grid(
row=0, column=0, padx=7, pady=2, sticky='E')
Button(frame4, text='Clear', command=clear).grid(
row=0, column=1, padx=7, pady=2, sticky='E')
from Tkinter import *
def toplevelwin():
def clear(): return
select = unselect = done = enter = clear
window = Toplevel()
frame0 = Frame(window)
frame0.grid(row=0, column=0, sticky='WE', padx=5, pady=5, columnspan=3)
frame0.grid_columnconfigure(0, weight=1)
lblentry = Label(frame0, text="Entry Box:")
lblentry.grid(row=0, column=0, sticky='W')
entrybx = Entry(frame0)
entrybx.grid(row=1, column=0, sticky='NSEW', columnspan=2)
entrybt = Button(frame0, text=' Enter ', command=enter)
entrybt.grid(row=1, column=2, sticky='NW', padx=3)
frame1 = Frame(window)
frame1.grid(row=1, column=0, sticky='EW', padx=5, pady=5)
lblshow_lst = Label(frame1, text="List Box 1:")
lblshow_lst.grid(row=0, sticky='W')
show_lst = Listbox(frame1)
show_lst.grid(row=1, sticky='W')
frame2 = Frame(window)
frame2.grid(row=1, column=1, sticky='W')
selbtn = Button(frame2, text='Select', command=select)
selbtn.grid(row=0, padx=5, sticky='EW')
uselbtn = Button(frame2, text='Unselect', command=unselect)
uselbtn.grid(row=1, padx=5, sticky='EW')
frame3 = Frame(window)
frame3.grid(row=1, column=2, sticky='W', padx=5, pady=5)
lblsel_lst = Label(frame3, text="List Box 2:")
lblsel_lst.grid(row=0, sticky='W')
sel_lst = Listbox(frame3)
sel_lst.grid(row=1, column=0, sticky='W')
frame4 = Frame(window)
frame4.grid(row=2, column=0, sticky='WE', padx=5, pady=5, columnspan=3)
frame4.grid_columnconfigure(0, weight=1)
Button(frame4, text=' Done ', command=done).grid(
row=0, column=0, padx=7, pady=2, sticky='E')
Button(frame4, text='Clear', command=clear).grid(
row=0, column=1, padx=7, pady=2, sticky='E')
window.wait_window(window)
root = Tk()
toplevelwin()
root.mainloop()