布局管理控件
tkinter提供三个常用方法,在tkinter控件布局grid中使用grid()排布了几个简单的控件。除此之外,tkinter 还提供了几个布局管理控件,比如 Frame 、LabelFrame 等,这些控件的主要作用是为其他控件提供载体,并将主窗口界面划分成多个区域,从而方便开发者对不同区域进行设计与管理。
Frame控件
Frame 本质上也是一个矩形窗体,同其他控件一样也需要位于主窗口内。我们可以在主窗口内放置多个 Frame 控件,并且每个 Frame 中还可以嵌套一个或者多个Frame,从而将主窗口界面划分成多个区域。
Frame 控件的常用属性如下表所示:
属性 | 说明 |
---|---|
bg | 设置 Frame 的背景颜色 |
bd | 指定 Frame 的边框宽度 |
colormap | 指定 Frame 组件及其子组件的颜色映射 |
container | 布尔值参数,若参数值为 True,则窗体将被用作容器使用,一些其他程序也可以被嵌入 |
cursor | 指定鼠标在 Frame 上飘过的鼠标样式,默认由系统指定 |
height/width | 设置 Frame 的高度和宽度 |
highlightbackground | 指定当 Frame 没有获得焦点的时候高亮边框的颜色,通常由系统指定为标准颜色 |
highlightcolor | 指定当 Frame 获得焦点的时候高亮边框的颜色 |
highlightthickness | 指定高亮边框的宽度,默认值是 0 |
padx/pady | 距离主窗口在水平/垂直方向上的外边距 |
relief | 指定边框的样式,参数值 “sunken”,“raised”,“groove” 或 “ridge”,“flat”,默认为 "falt’ |
takefocus | 布尔值参数,默认为 False,指定该组件是否接受输入焦点(即用户通过 Tab 键将焦点转移上来) |
示例
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.messagebox as mb
m = tk.Tk()
m.title("tkinter Listbox")
m.geometry('500x300')
m.resizable(0, 0)
lb = tk.Label(text='Programming Languages', font=('times', 12, 'bold'), fg='#CD7054')
lb.pack()
frame1 = tk.Frame(m)
frame1.pack()
varLb = tk.Label(frame1, text='Popular Languages', font=('times', 10, 'bold'), fg='orange')
plotLb = tk.Label(frame1, text='Your Languages', font=('times', 10, 'bold'), fg='orange')
varLb.grid(row=0, column=0, columnspan=3, padx=5)
plotLb.grid(row=0, column=6, columnspan=3, padx=5)
lbox = tk.Listbox(frame1, selectmode=tk.EXTENDED, height=8)
lbox.grid(row=1, column=0, columnspan=3, rowspan=5, sticky=tk.E, padx=10)
items = ["c", "c++", "c#", "go", "java", "javascript", "php", "python", "r", "swift"]
for i in items:
lbox.insert('end', i) #
list = []
langCnt = 0
def Add():
cursel = lbox.curselection()
curvar = lkLbox.get(0, tk.END)
isexist = False
if len(cursel) > 0:
for i in cursel:
lkLbox.insert('end', lbox.get(i))
if lbox.get(i) in curvar:
isexist = True
if isexist:
mb.showinfo('info', 'Add existing language(s)!')
def Del():
cursel = lkLbox.curselection()
if len(cursel) > 0:
for i in range(len(cursel) - 1, -1, -1):
lkLbox.delete(cursel[i])
def Clr():
lkLbox.delete(0, tk.END)
def Set():
global list
global curCnt
list.clear()
varturp = lkLbox.get(0, tk.END)
if len(varturp) > 0:
for var in varturp:
list.append(var)
else:
mb.showwarning('Warning', 'No language is Selected!')
langCnt = cntCbox.current()
print(list)
print(langCnt)
btnAdd = tk.Button(frame1, width=6, text='>>', font=('times', 12, 'bold'), fg='green', command=Add)
btnAdd.grid(row=2, column=4, padx=10)
btnDel = tk.Button(frame1, width=6, text='Del', font=('times', 12, 'bold'), fg='red', command=Del)
btnDel.grid(row=3, column=4, padx=10)
btnClr = tk.Button(frame1, width=6, text='Clr', font=('times', 12, 'bold'), fg='red', command=Clr)
btnClr.grid(row=4, column=4, padx=10)
lkLbox = tk.Listbox(frame1, selectmode=tk.EXTENDED, height=8)
lkLbox.grid(row=1, column=6, columnspan=3, rowspan=5, sticky=tk.W, padx=10)
frame2 = tk.Frame(m)
frame2.pack(pady='10px')
curCntLb = tk.Label(frame2, text='Languages number you master:', font=('times', 10, 'bold'), fg='purple')
curCntLb.grid(row=0, column=0, columnspan=3, padx=5)
cntCbox = ttk.Combobox(frame2)
cntCbox['value'] = ('0', '1', '2', '3', '4', '5', '5+')
cntCbox.current(1)
cntCbox.grid(row=0, column=5, columnspan=3, padx=5)
btnSet = tk.Button(m, text='Apply', font=('times', 12, 'bold'), fg='blue', command=Set)
btnSet.pack(side=tk.BOTTOM, pady=5)
m.mainloop()
每个子区域可独立使用pack(),grid(), place()等,互不影响。
运行结果:
引用
参考网站包含其他布局管理控件的详细使用说明。
Tkinter布局管理控件