Tkinter库的学习记录08- 容器控件

8、容器控件

Frame可翻译为框架,它在Widget中的类别名称就是Frame。LabelFrame可翻译为标签框架,它在Widget中的类别名称就是LabelFrame。这两个控件主要是当作容器使用,设计时LabelFrame可以在外观看到标签名称。本章要介绍的另一个Widget是Toplevel,它与Frame类似,但是将产生一个分离的窗口容器。

8-1 框架Frame

8-1-1 框架的基本概念

这是一个容器控件,当我们设计的GUI程序很复杂时,此时可以考虑一系列相关的Widget组织在一个框架内,这样可以方便管理。它的构造方法语法如下。

python 复制代码
Frame(父对象, option, ...)

参数一:同上

options参数:

(1) bg或background:背景颜色。

(2) borderwidth或bd:标签边界宽度,默认是两个像素。

(3) cursor:当鼠标光标在框架上时的光标形状。

(4) height:框架的高度,单位是像素。

(5) highlightbackground:当框架没有取得焦点时的背景颜色。

(6) highlightcolor:当框架取得焦点时的颜色。

(7) highlighthickness:当框架取得焦点时的厚度。

(8) relief:默认是relief=FLAT,可由此控制框架外框,可参考ch8_4。

(9) width:框架宽度,单位是像素,省略时会自行调整为实际宽度。

程序实例ch8_1:建立三个不同底色的框架。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_1")

for fm in ["red", "green", "blue"]:
    Frame(root, bg=fm, height=50, width=250).pack()

root.mainloop()

运行结果

运行结果从上述实例应该了解,框架也是一个Widget控件,所以最后也需要使用控件配置管理员包装与定位,此例中是使用pack()。

下面程序在调用Frame构造方法时,省略父对象。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_1")

for fm in ["red", "green", "blue"]:
    Frame(bg=fm, height=50, width=250).pack()

root.mainloop()

执行结果与ch8_1一致。

程序实例ch8_2,使用横向配置方式(side=LEFT)重新设计ch8_1,同时让鼠标光标在不同的框架上有不同的形状。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_2")

fms = {"red": "cross", "green": "boat", "blue": "clock"}
for fmColor in fms:
    Frame(root, bg=fmColor, cursor=fms[fmColor], height=50, width=200).pack(side=LEFT)

root.mainloop()

运行结果

8-1-2 在框架内创建Widget控件

创建框架时会传回框架对象,假设此对象是A,此后在此框架内建立Widget控件时,此对象A就是框架内Widget控件的父容器。下面是在框架内创建功能按钮对象的讲解。

python 复制代码
A = Frame(root, ...)        # 传回框架对象A
btn = Button(A, ...)        # 框架对象A是btn功能按钮的父容器

程序实例ch8_3:建立两个框架,同时在上层框架frameUpper内建三个功能按钮,下层框架frameLower,同时在此建立一个功能按钮。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_3")

frameUpper = Frame(root, bg="lightyellow")
frameUpper.pack()
btnRed = Button(frameUpper, text='red', fg='red')
btnRed.pack(side=LEFT, padx=5, pady=5)
btnGreen = Button(frameUpper, text='green', fg='green')
btnGreen.pack(side=LEFT, padx=5, pady=5)
btnBlue = Button(frameUpper, text='blue', fg='blue')
btnBlue.pack(side=LEFT, padx=5, pady=5)

frameLower = Frame(root, bg="lightblue")
frameLower.pack()
btnPurple = Button(frameLower, text='purple', fg='purple')
btnPurple.pack(side=LEFT, padx=5, pady=5)

root.mainloop()

运行结果

8-1-3 活用relief属性

可以利用relief属性的特性,将Widget控件建立在框架内。

下面程序实例:建立三个框架,分别使用不同的relief属性。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_4")

fm1 = Frame(width=150, height=80, relief=GROOVE, borderwidth=5)
fm1.pack(side=LEFT, padx=5, pady=10)
fm2 = Frame(width=150, height=80, relief=RAISED, borderwidth=5)
fm2.pack(side=LEFT, padx=5, pady=10)
fm3 = Frame(width=150, height=80, relief=RIDGE, borderwidth=5)
fm3.pack(side=LEFT, padx=5, pady=10)

root.mainloop()

运行结果

8-1-4 在含raised属性的框架内创建复选框

下面程序实例:创建一个含raised属性的框架,同时在此框架内创建标签和复选框。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_5")

fm = Frame(width=150, height=80, relief=RAISED, borderwidth=5)
lab = Label(fm, text="请复选常用的程序语言")
lab.pack()
python = Checkbutton(fm, text='Python')
python.pack(anchor=W)
java = Checkbutton(fm, text='Java')
java.pack(anchor=W)
ruby = Checkbutton(fm, text='Ruby')
ruby.pack(anchor=W)
fm.pack()

root.mainloop()

运行结果

8-1-5额外对relief属性的支持

在标准的Frame框架中,对于relief属性并没有完全支持,例如,solid和sunken属性,此时可以使用tkinter.ttk的Frame和Style模块。下面将直接以实例展现。

下面程序实例:建立6个框架,每个框架有不同的relief。

python 复制代码
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("ch8_6")
style = Style()
style.theme_use("alt")

fm1 = Frame(width=150, height=80, relief="flat")
fm1.grid(row=0, column=0, padx=5, pady=5)
fm2 = Frame(width=150, height=80, relief="groove")
fm2.grid(row=0, column=1, padx=5, pady=5)
fm3 = Frame(width=150, height=80, relief="raised")
fm3.grid(row=0, column=2, padx=5, pady=5)
fm4 = Frame(width=150, height=80, relief="ridge")
fm4.grid(row=1, column=0, padx=5, pady=5)
fm5 = Frame(width=150, height=80, relief="solid")
fm5.grid(row=1, column=1, padx=5, pady=5)
fm6 = Frame(width=150, height=80, relief="sunken")
fm6.grid(row=1, column=2, padx=5, pady=5)

root.mainloop()

运行结果

上述程序中需使用tkinter.ttk模块内的Frame作为支持才可正常显示relief外框,同时留意第7行中的alt参数,主要是此机制内对于relief支持的参数。

8-2 标签框架LabelFrame

8-2-1 标签框架的基本概念

这也是一个容器控件,主要是将一系列相关的Widget组织在一个标签框架内,然后给它一个名称。它的构造语法如下:

python 复制代码
LabelFrame(父对象, option, ...)

参数一:同上

option参数:

(1) bg或background:背景颜色。

(2) borderwidth或bd:标签边界宽度,默认是2个像素。

(3) cursor:当鼠标光标在框架上时的光标形状。

(4) font:标签框架中文字的字形

(5) height:框架的高度,单位是像素。

(6) highlightbackground:当框架没有取得焦点时的背景颜色。

(7) highlightcolor:当框架取得焦点时的颜色。

(8) highlighthickness:当框架取得焦点时的厚度。

(9) labelAnchor:设置放置标签的位置。

(10) relief:默认是relief=FLAT,可由此控制框架外框。

(11) text:标签内容。

(12) width:框架宽度,单位是像素,省略时会自行调整为实际宽度。

下面程序实例:重新设计ch5_3,将账号和密码字段使用标签框架起来,此框架标签的文字是"数据验证"。

python 复制代码
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("ch8_7")

msg = "欢迎进入Silicon Stone Education系统"
tPng = PhotoImage(file="tubiao.png")
logo = Label(root, image=tPng, text=msg, compound=BOTTOM)
logo.pack()

labFrame = LabelFrame(root, text="数据验证")
accontL = Label(labFrame, text="账号:")
accontL.grid(row=0, column=0)
pwdL = Label(labFrame, text="密码:")
pwdL.grid(row=1, column=0)

accountE = Entry(labFrame)
accountE.grid(row=0, column=1)
pwdE = Entry(labFrame, show="*")
pwdE.grid(row=1, column=1, padx=10)
labFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)

root.mainloop()

运行结果

8-2-2 将标签框架应用于复选框

标签框架的应用范围很广泛,也常应用将选项按钮或是复选框组织起来。下面将直接以实例讲解。

下面实例重新设计ch7_8.py,将复选框用标签框架框起来,同时设置了root窗口的宽度和高度。

python 复制代码
from tkinter import *
from tkinter.ttk import *

def printInfo():
    selection = ''
    for i in checkboxes:
        if checkboxes[i].get() == True:
            selection = selection + sport[i] + "\t"
    print(selection)

root = Tk()
root.title("ch8_8")
root.geometry("400x220")

labFrame = LabelFrame(root, text="选择最喜欢的运动")
sports = {0: '篮球', 1: '足球', 2: '羽毛球', 3: '网球'}
checkboxes = {}
for i in range(len(sports)):
    checkboxes[i] = BooleanVar()
    Checkbutton(labFrame, text=sports[i], variable=checkboxes[i]).grid(row=i+1, sticky=W)
labFrame.pack(ipadx=5, ipady=5, pady=10)

btn = Button(root, text='确定', width = 10, command=printInfo)
btn.pack()

root.mainloop()

运行结果

8-3 顶层窗口Toplevel

8-3-1 Toplevel窗口的基本概念

这个控件的功能类似于Frame,但是这个控件所产生的容器时一个独立的窗口,有自己的标题栏和边框,它的构造方法如下:

python 复制代码
Toplevel(option, ...)

下列是Toplevel()方法内其它常用的option参数。

(1) bg或background:背景颜色。

(2) borderwidth或bd:标签边界宽度,默认是2个像素。

(3) cursor:当鼠标光标在框架上时的光标形状。

(4) fg:文字前景。

(5) font:标签框架中文字的字形

(6) height:窗口的高度。

(7) width:框架宽度。

下面程序实例:建立一个Toplevel窗口,为了区分在Toplevel窗口,为了区分在Toplevel窗口中增加字符串"I am a toplevel"。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_9")

tl = Toplevel()
Label(tl, text="I am a Toplevel").pack()

root.mainloop()

运行结果,上面这个是顶层窗口,下面这个是主窗口。

Toplevel窗口建立完成后,如果关闭Toplevel窗口,原主窗口仍可以继续使用,但是如果关闭了主窗口,Toplevel窗口将自动关闭,在第一章介绍建立主窗口时有介绍过窗口属性设置的方法,这些方法中有些可以供Toplevel窗口使用。

下面程序实例:设置Toplevel窗口的标题和大小。

python 复制代码
from tkinter import *

root = Tk()
root.title("ch8_10")

tl = Toplevel()
tl.title("Toplevel")
tl.geometry("200x200")
Label(tl, text="This is a toplevel window.").pack()

root.mainloop()

运行结果

8-3-2 使用Toplevel窗口仿真对话框

下面程序实例:这个程序实例执行时会有一个Click Me按钮,当单击此按钮时会由一个随机数产生Yes、No、Exit字符串,这些字符串会出现在Toplevel窗口内。

python 复制代码
from tkinter import *
import random

root = Tk()
root.title("ch8_11")

msgYes, msgNo, msgExit = 1, 2, 3
def Message():
    msgType = random.randint(1, 3)
    if msgType == msgYes:
        labTxt = "Yes"
    elif msgType == msgNo:
        labTxt = "No"
    else:
        labTxt = "Exit"
    t1 = Toplevel()
    t1.geometry("300x180")
    Label(t1, text=labTxt).pack(fill=BOTH, expand=True)

btn = Button(root, text='Click Me', command=Message)
btn.pack()

root.mainloop()

运行结果

相关推荐
c_lb72881 小时前
近期AI量化工具选择,学习开发执行要分开
人工智能·python
天天进步20151 小时前
Python全栈项目--校园食堂点餐与推荐系统
开发语言·python
Ulyanov1 小时前
雷达导引头体制演进、技术特点与数学模型
python·雷达电子对抗·导引头
eybk2 小时前
写一个可以编制pdf文件的python程序
开发语言·python·pdf
卷无止境2 小时前
从Python的cryptography库出发,从零开始理解密码学,到构建零信任网络
后端·python
YFJ_mily2 小时前
**Python 实战:写一个论文 PDF 投稿自检工具|附 IPAT 2026 智能光子学会议征稿信息
人工智能·python·pdf·量子计算·论文投稿·智能光子学
三川6982 小时前
Tkinter库的学习记录05-文本框Entry
python
cui_ruicheng2 小时前
Python从入门到实战(八):封装、多态与抽象类
开发语言·python
nanawinona2 小时前
2026年AI量化工具怎么选,先定位学习开发还是执行
人工智能·python