文章目录
框架Frame
这是一个容器
控件,当我们设计的GUI程序很复杂时,此时可以考虑将一系列相关的Widget
控件组织在一个框架内,这样比较方便管理。构造方法语法如下:
# 父对象可以省略
Frame(父对象, options, ...)
参数:
- 第一个参数:
父对象
,表示这个框架将建立在哪一个窗口内 - 第二个参数:
options
,参数如下
参数 | 含义 |
---|---|
borderwidth | 边界宽度 默认是两个像素 |
bd | 边界宽度 默认是两个像素 |
bg | 背景颜色 |
background | 背景颜色 |
cursor | 当鼠标光标移至框架上时的形状 |
height | 高,单位是字符高 |
highlightbackground | 当框架没有获取焦点时的颜色 |
highlightcolor | 当框架取得焦点时的颜色 |
highlighthickness | 当框架取得焦点时的厚度 |
relief | 可由此控制框架外框 默认是relief=FLAT |
width | 框架的宽度,单位是像素 省略时会自动调整为实际宽度 |
框架Frame的初步运用
例子
:建立三个不同底色的框架
import tkinter
# 创建主窗口
root = tkinter.Tk()
for i in ["red", "orange", "lightgreen"]:
# 这里省略了root
tkinter.Frame(bg=i, height=50, width=150).pack()
root.mainloop()
运行结果:
框架也是一个Widget控件,所以最后也需要使用控件配置管理器包装与定位,也就是pack、grid等
例子
:同时让鼠标光标在不同的框架上有不同的形状
import tkinter
# 创建主窗口
root = tkinter.Tk()
# 用字典存储框架颜色与光标形状
x = {"red": "cross", "orange": "boat", "lightgreen": "clock", "lightblue": "star"}
for i in x:
# 建立四个不同底色的框架与光标形状
tkinter.Frame(bg=i, cursor=x[i], height=50, width=150).pack(side=tkinter.LEFT)
root.mainloop()
运行结果:
在框架内创建Widget控件
创建框架时会传回框架对象,假设此对象是A,以后在此框架内建立Widget控件时,此对象A就是框架内Widget控件的父容器,
A = Frame(root, ...) # 传回框架对象A
button = Button(A, ...) # 框架对象A是button功能按钮的父容器
例子
:
import tkinter
# 创建主窗口
root = tkinter.Tk()
# 建立上层框架
frameUp = tkinter.Frame(root, bg="lightyellow")
frameUp.pack()
# 上层框架第一个按钮
butOne = tkinter.Button(frameUp, text="One", fg="red")
butOne.pack(side=tkinter.LEFT, padx=5, pady=5)
# 上层框架第二个按钮
butTwo = tkinter.Button(frameUp, text="Two", fg="orange")
butTwo.pack(side=tkinter.LEFT, padx=5, pady=5)
# 上层框架第三个按钮
butThree = tkinter.Button(frameUp, text="Three", fg="lightgreen")
butThree.pack(side=tkinter.LEFT, padx=5, pady=5)
# 建立下层框架
frameLow = tkinter.Frame(root, bg="lightblue")
frameLow.pack()
# 建立下层框架的按钮
butLast = tkinter.Button(frameLow, text="Last")
butLast.pack(side=tkinter.LEFT, padx=5, pady=5)
root.mainloop()
运行结果:
活用relief 属性
可以利用 relie 属性的特性,将Widget 控件建立在框架内
例子
:
import tkinter
# 创建主窗口
root = tkinter.Tk()
frameOne = tkinter.Frame(width=150, height=80, relief=tkinter.GROOVE, borderwidth=5)
frameOne.pack(side=tkinter.LEFT, padx=5, pady=5)
frameTwo = tkinter.Frame(width=150, height=80, relief=tkinter.RAISED, borderwidth=5)
frameTwo.pack(side=tkinter.LEFT, padx=5, pady=5)
frameThree = tkinter.Frame(width=150, height=80, relief=tkinter.RIDGE, borderwidth=5)
frameThree.pack(side=tkinter.LEFT, padx=5, pady=5)
root.mainloop()
运行结果:
在含有raised属性的框架内创建复选框
例子
:
import tkinter
# 创建主窗口
root = tkinter.Tk()
frame = tkinter.Frame(width=150, height=80, relief=tkinter.RAISED, borderwidth=5)
frame.pack(padx=10, pady=10)
label = tkinter.Label(frame, text="选择你最喜欢的食物")
label.pack()
foodOne = tkinter.Checkbutton(frame, text="热干面")
foodOne.pack(anchor=tkinter.W)
foodTwo = tkinter.Checkbutton(frame, text="油条")
foodTwo.pack(anchor=tkinter.W)
foodThree = tkinter.Checkbutton(frame, text="面窝")
foodThree.pack(anchor=tkinter.W)
root.mainloop()
运行结果:
额外对relief属性的支持
在标准的Frame框架中,对于relief属性并没有完全支持。
例如,solid
和sunken
属性,此时可以使用tkinter.ttk
的Frame
和Style
模块
例子
:
import tkinter
from tkinter.ttk import Frame, Style
# 创建主窗口
root = tkinter.Tk()
# 改用Style
style = Style()
# 改用alt支持Style
style.theme_use("alt")
fm1 = Frame(root, width=150, height=80, relief="flat")
fm1.grid(row=0, column=0, padx=5, pady=5)
fm2 = Frame(root, width=150, height=80, relief="groove")
fm2.grid(row=0, column=1, padx=5, pady=5)
fm3 = Frame(root, width=150, height=80, relief="raised")
fm3.grid(row=0, column=2, padx=5, pady=5)
fm4 = Frame(root, width=150, height=80, relief="ridge")
fm4.grid(row=1, column=0, padx=5, pady=5)
fm5 = Frame(root, width=150, height=80, relief="solid")
fm5.grid(row=1, column=1, padx=5, pady=5)
fm6 = Frame(root, width=150, height=80, relief="sunken")
fm6.grid(row=1, column=2, padx=5, pady=5)
root.mainloop()
运行结果:
上述程序中需使用tkinter.ttk
模块内Frame
的作为支持,才可正常显示relief
外框。
alt
参数主要是此机制内对于relief
支持的参数
标签框架LabelFrame
标签框架的基本概念
这也是一个容器控件,主要是将一系列相关Widget组织在一个标签框架内,然后给他一个名称,他的构造方法语法如下:
LabelFrame(父对象, options, ...)
参数:
- 第一个参数:
父对象
,表示这个标签框架将建立在哪一个窗口内 - 第二个参数:
options
,参数如下
参数 | 含义 |
---|---|
borderwidth | 边界宽度 默认是两个像素 |
bd | 边界宽度 默认是两个像素 |
bg | 背景颜色 |
background | 背景颜色 |
cursor | 当鼠标光标移至按钮上时的形状 |
font | 标签框架中文字的字形 |
height | 高,单位是字符高 |
highlightbackground | 当框架没有获取焦点时的颜色 |
highlightcolor | 当框架取得焦点时的颜色 |
highlighthickness | 当框架取得焦点时的厚度 |
labelAnchor | 设置放置标签的位置 |
relief | 可由此控制框架外框 默认是relief=FLAT |
text | 标签内容 |
width | 框架的宽度,单位是像素 省略时会自动调整为实际宽度 |
例子
:
import tkinter
# 创建主窗口
root = tkinter.Tk()
textFirst = "欢迎登录"
photo = tkinter.PhotoImage(file="1.png")
Logo = tkinter.Label(root, image=photo, text=textFirst, compound=tkinter.BOTTOM)
Logo.pack()
# LabelFrame标签框架
labelFrame = tkinter.LabelFrame(root, text="登录框")
accountLabel = tkinter.Label(labelFrame, text="账号")
accountLabel.grid(row=0, column=0)
accountEntry = tkinter.Entry(labelFrame)
accountEntry.grid(row=0, column=1)
passWd = tkinter.Label(labelFrame, text="密码")
passWd.grid(row=1, column=0)
passWdEntry = tkinter.Entry(labelFrame, show="*")
passWdEntry.grid(row=1, column=1)
labelFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)
root.mainloop()
运行结果:
将标签框架用于复选框
标签框架的应用范围很广泛,也常应用于将选项按钮或是复选框组织起来
例子
:
import tkinter
def send():
x = ""
for j in cheakboxs:
# 这里实际上是cheakboxs[j].get() == True
# 如果被勾选的话传回来的值为True
# 如果没有被勾选的话传回来的值为False
if cheakboxs[j].get():
x = x +foods[j] + "\n"
print(x)
# 创建主窗口
root = tkinter.Tk()
# LabelFrame标签框架
labelFrame = tkinter.LabelFrame(root, text="选择最喜欢的食物")
foods = {0: "饺子", 1: "春卷", 2: "汤圆", 3: "混沌", 4: "热干面"}
# 这里负责给予字典的键一个False或者True的值,用于检测是否被勾选
cheakboxs = {}
for i in range(len(foods)):
# 这里相当于是{0: False, 1: False, 2: False, 3: False, 4: False}
cheakboxs[i] = tkinter.BooleanVar()
# 只有被勾选才变为True
tkinter.Checkbutton(labelFrame, text=foods[i], variable=cheakboxs[i]).grid(row=i + 1, sticky=tkinter.W)
labelFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)
button = tkinter.Button(root, text="提交", width=10, command=send)
button.pack()
root.mainloop()
运行结果:
顶层窗口 Toplevel
Toplevel 窗口的基本概念
这个控件的功能类似于Frame,但是这个控件所产生的容器是一个独立的窗口,有自己的标题栏和边框。他的构造方法语法如下:
Toplevel(options, ...)
参数:
- 第一个参数:
options
,参数如下
参数 | 含义 |
---|---|
borderwidth | 边界宽度 默认是两个像素 |
bd | 边界宽度 默认是两个像素 |
bg | 背景颜色 |
background | 背景颜色 |
cursor | 当鼠标光标在Toplevel 窗口上时的形状 |
font | 字形 |
fg | 文字前景颜色 |
height | 窗口高度 |
width | 窗口宽度 |
Toplevel 窗口的基础运行
例子
:
import tkinter
root = tkinter.Tk()
rootTwo = tkinter.Toplevel()
tkinter.Label(rootTwo, text="Python!!!").pack()
root.mainloop()
运行结果:
两个窗口出现后,Toplevel 窗口关闭后,原主窗口仍可以继续使用。但是如果关闭了主窗口,Toplevel 窗口将自动关闭
例子
:设置Toplevel 窗口的标题和大小
import tkinter
root = tkinter.Tk()
rootTwo = tkinter.Toplevel()
rootTwo.title("Toplevel")
rootTwo.geometry("200x150")
tkinter.Label(rootTwo, text="Python!!!").pack()
root.mainloop()
运行结果:
使用按钮弹出Toplevel窗口
例子
:
import tkinter
import random
def show():
num = random.randrange(1, 10)
t1 = tkinter.Toplevel()
t1.geometry("100x80")
t1.title("Toplevel")
# BOTH 上下左右居中
# expand是否填充额外的父容器空间
tkinter.Label(t1, text=num).pack(fill=tkinter.BOTH, expand=True)
root = tkinter.Tk()
button = tkinter.Button(root, text="请点击", command=show)
button.pack()
root.mainloop()
运行结果:
谢谢观看,笔者会持续更新,如有错误或者建议,请私信我