2022年6月22日python课堂:Tkinter库
在Python 3中,Tkinter库在Python中的模块名称被重命名为tkinter,在程序中使用时,需要先导入该模块。
Options选项
Tkinter提供了一组通用的属性来控制控件的外观和行为,可在创建控件时通过参数设置属性,也可以调用控件的config()方法来设置属性。
- 尺寸设置:在设置控件与尺寸有关的属性(如边框宽度
bd、容器的宽度width或高度height等)且直接使用整数时,其的默认单位为像素。label1.config(bd=2) - 颜色设置:颜色属性(如背景色、前景色等)可设置为颜色字符串,字符串中可使用标准颜色名称或以
#开头的RGB颜色值。label1.config(bg='#00ff00')
Python常用填充颜色:
Gray(灰色) light gray(浅灰色) brown(棕色) orange(橙色) olive(橄榄绿) green(绿色) cyan(青色)blue(蓝色) purple(紫色)pink(粉色) red(红色)
- 字体设置:控件的
font属性用于设置字体名称、字体大小和字体特征,justify属性设置文本对齐方式。label1.config(font=('隶书',20,'bold'),justify = "left") - 显示图片:在
Windows系统中,可调用tkinter.PhotoImage类来引用文件中的图片,然后通过控件的image属性使用图片,支持gif、png等格式的图片文件 - 使用绑定变量:文本控件使用
textvariable属性绑定StringVar变量,数值控件,使用variable属性绑定BooleanVar、DoubleVar或IntVar变量。调用变量的set()方法设置变量的值,变量值同步反映到控件,调用get()方法可通过绑定变量返回控件的值
控件简介
| Tkinter类 | 名称 | 简介 |
|
| 标签 | 用于显示不可编辑的文本或图标。 |
|
| 按钮 | 代表按钮组件,用来指定用户的单机操作,可以包含文本和图形 |
|
| 单行输入框 | 用户可输入内容,添加 |
|
| 复选框 | 可供用户勾选的复选框 |
|
| 列表框 | 列出多个选项,供用户选择 |
|
| 菜单 | 菜单组件 |
|
| 菜单按钮 | 用来包含菜单的按钮(包括下拉式、层叠式等),可以替代 |
|
| 菜单按钮 | Menubutton的子类,也代表菜单按钮,可通过按钮打开一个菜单 |
|
| 消息框 | 类似于标签,但可以显示多行文本;后来当Label也能显示 |
|
| 滚动条 | 配合 |
|
| 画布 | 提供绘图功能,包括直线、矩形、椭圆、多边形、位图等 |
|
| 容器 | 用于装载其它GUI组件,作为控件容器使用,实现控件分组 |
|
| 顶层 | 容器类,用来创建主窗口的子窗口,可用于为其他组件提供单独的容器;Toplevel有点类似于窗口 |
|
| 容器 | 也是容器组件,类似于Frame,但它支持添加标题 |
|
| 滑块 | 允许通过滑块来设置数字值 |
入门案例
案例一:
from tkinter import *
from tkinter import messagebox # 弹出框
root = Tk() # 窗口对象
root.title('入门案例') # 窗口标题
root.geometry('400x200+20+20') # 窗口大小 width x height + x + y(x,y为在当前界面的坐标)
test_btn = Button(text='测试按钮', command=lambda: messagebox.showinfo('提示信息', '您点击了我~')) # 按钮控件和事件
test_btn.place(x=50, y=50) # 按钮place布局
Button(text='退出', command=lambda: root.destroy()).pack(anchor='ne') # 按钮pack布局
root.mainloop() # 显示窗口
实践:


增加背景色(background)和前景色(foreground):

对字体进行设置:

Tkinter窗口
tkinter.Tk()函数创建一个主窗口,也称根窗口。主窗口只有一个,它是一个容器,用于包含标签、按钮、列表框等控件或其他容器,构成应用程序的主界面。
Tkinter程序基本结构:
from tkinter import *
root = Tk() # 创建主窗口
root.title('主窗口') # 设置窗口标题
root.geometry('1366x768+300+200') # 设置窗口大小 宽度x高度+左边距离+上面距离 宽度x高度-右边的距离-下面的距离
# 设置窗口的大小
root.minsize(300,300) # 最小窗口大小
root.maxsize(600,600) # 最大窗口大小
# root.resizable(False,False) # 将窗口大小固定
root.mainloop() # 开启主循环,让窗口处于显示状态
窗口主要方法:
• title(“标题名”):修改窗口标题
• geometry(‘400x300’):设置窗口标题
• quit():退出窗口
• update():刷新窗口
示例代码:
from tkinter import *
root=Tk()
root.title('主窗口') #设置主窗口
root.geometry('400x300') #设置窗口大小
root.mainloop() #开启主循环,让窗口属于显示状态
添加程序:


拓展程序(黄色是警告,蓝色是提示,红色是错误):

可以将其放进小组件中:

课堂材料(以上课程的最终程序):
from tkinter import *
from tkinter import messagebox # 弹出框
# 获取积木对象
root = Tk()
# 设置主界面的容器大小和位置root
root.geometry("800x400+100+150") # width x height + x + y
# 定义按钮的文字变量
# btn_text = StringVar()
# btn_text.set('开始')
count = 1
def btn_click():
# print('你点击了我!')
# messagebox.showinfo('提示信息','你点击了我!')
# messagebox.showerror('错误信息','你点错了!')
global count
if count%2==0:
btn.config(text='开始')
else:
btn.config(text='停止')
#messagebox.showwarning('警告信息','你再点一次试试!')
count = count + 1
print(count)
# 生成一个小积木(组件)
btn = Button(master=root, text='开始', width=7, height=1, # 文本,宽度,高度
background='yellow', # 背景色
foreground='red', # 前景色
font=('黑体', 22, 'bold'), # 字体 大小 样式
command=btn_click # 函数,匿名的lambda 有名称的常规函数
# command= lambda : messagebox.showinfo('提示信息','你点击了我!')
)
# 积木放置位置
btn.place(x=100, y=300)
# 显示图形界面
root.mainloop()
对于控件简介的实践应用:
from tkinter import *
root = Tk()
root.title('入门案例')
root.geometry("800x400")
Button(text='按钮').place(x=100, y=0)
Label(text='文本内容').place(x=100, y=25)
#单行输入框
Entry(width=50).place(x=100, y=50)
#密码框
Entry(width=50,show='*').place(x=100,y=75)
#多选栏
Checkbutton(text='篮球').place(x=100, y=100)
Checkbutton(text='足球').place(x=180, y=100)
Checkbutton(text='乒乓球').place(x=260, y=100)
#单选栏
Radiobutton(text='男',value='male').place(x=100,y=125)
Radiobutton(text='女',value='female').place(x=150,y=125)
root.mainloop()
结果输出:

自我娱乐的程序(嘻嘻嘻):
from tkinter import *
from tkinter import messagebox # 弹出框
root = Tk() # 窗口对象
root.geometry('800x500+20+20')
btn = Button(text='开始',width=10,height=2,
background='yellow',
foreground='red',
font=('黑体',18,'bold'),
command=lambda : messagebox.showinfo('提示信息','你点击了我,我会害羞的!'))
btn.place(x=200, y=300) # 按钮place布局
bt=Button(text='退出',width=10,height=2,
background='blue',
foreground='purple',
font=('黑体',18,'bold'),
command= lambda : messagebox.showinfo('警告信息','不允许点击,再点打你!')) # 按钮pack布局
bt.place(x=500,y=300)
root.mainloop() # 显示窗口
如何设计一个登录界面:
from tkinter import *
from tkinter.messagebox import *
root = Tk() #获得积木对象
root.title('登录页面')
root.geometry('800x350+100+150') #设置容量大小和位置root
#声明组件变量
log_name = StringVar()
log_pwd = StringVar()
#组件的使用
def btn_login():
if log_name.get == 'admin' and log_pwd.get() == '123':
showinfo('提示信息','登录成功~')
else:
showwarning('提示信息','用户名或密码输入有误')
#组件变量
Label(root,text='账号: ',font=('幼圆',20)).place(x=150,y=80)
Entry(width=27,font=('幼圆',20),textvariable=log_name).place(x=250,y=83)
Label(root,text='密码: ',font=('幼圆',20)).place(x=150,y=150)
Entry(width=27,font=('幼圆',20),show='*',textvariable=log_pwd).place(x=250,y=150)
Button(text='登录 ',
foreground='green',
width=15,
font=('幼圆',20,'bold') #字体 大小 样式
).place(x=150,y=220)
Button(text='退出 ',
foreground='#eda200',
width=15,
font=('幼圆',20,'bold'),
command=lambda : root.quit()
).place(x=400,y=220)
root.mainloop() #显示图形界面
程序运行结果:

菜单的制作:
from tkinter import *
from tkinter.messagebox import *
root = Tk()
root.geometry('800x350+100+150')
list_box = Listbox(width=10,height=5)
list_box.place(x=100,y=100)
list_box.insert(END,'AAAAA')
list_box.insert(END,'BBBBB')
list_box.insert("end",'CCCCC')
list_box.insert("end",'CCCCC')
list_box.insert("end",'CCCCC')
list_box.insert("end",'CCCCC')
menu = Menu()
root.configure(menu=menu)
file_menu = Menu(menu,tearoff=False) #file_menu为文件菜单
menu.add_cascade(label='文件',menu=file_menu) #file_menu.add_cascade是创建一个副菜单
menu.add_cascade(label='编辑',menu=file_menu)
menu.add_cascade(label='视图',menu=file_menu)
file_menu.add_command(label='新建')
file_menu.add_command(label='打开')
root.mainloop()
程序运行的结果:

有滚动条的(前面都一样,主要是加上最后三条):


怎样可以从登录页面转换到主页面:
from tkinter import *
root = Tk()
root.geometry('800x350+100+150')
login_frame = Frame(root,width=800,height=350,background='gray')
login_frame.place(x=0,y=0)
def login_btn():
login_frame.destroy()
index_frame = Frame(root, width=800, height=350, background='gray')
index_frame.place(x=0, y=0)
Label(index_frame,text='我是主页面的',fg='green',font=('','20')).place(x=100,y=100)
Label(login_frame,text='我是登录页面的',fg='green',font=('','20')).place(x=100,y=100)
Button(login_frame,text='登录',command=login_btn).place(x=100,y=150)
root.mainloop()
程序运行结果(点击登录就可以进入主页面)
时间:
间隔一秒进行打印:

from threading import Timer
# 1S后执行
nTimer = Timer(5, lambda: print('+++++++++++++'))
nTimer.start() # 使用线程方式执行
count = 1
def fn_print():
global count
print(f'------------------{count}')
sTimer = Timer(1, fn_print) # 每隔1秒创建一个定时器
sTimer.start() # 启动定时器
if count == 7:
print('******************')
sTimer.cancel() # 取消最后一个定时器
count = count + 1
fn_print()
