使用Tk库的引用:
import tkinter as tk
创建窗口
a1 = tk.TK()
tk.Tk就是创建窗口的函数
打开窗口
也可以理解为主循环,创建窗口后需要打开窗口,mainloop函数就是用于这个作用的
1
| a1.mainloop() #mainloop()
|
是启动这个窗口
设置窗口标题
title设置窗口的左上角文字
设置窗口大小
前面的300设置窗口的宽,后面300设置窗口的高
窗口打开位置
使用的函数还是geometry函数,只是在定义窗口大小后,在后面用加号连接两个数字表示窗口打开时
距离屏幕左边多少像素、距离屏幕顶部多少像素1 a1.geometry(“300x300+200+100”)
a1.geometry(“宽x高+距离屏幕左侧什么位置打开+距离屏幕右侧什么位置打开”)
获取用户分辨率
由于每个用户的屏幕分辨率都不一定一样,如果设置窗口大小时给的大小是固定的值,那么会导致窗
口显示比例不一样等问题,所以可以先获取到用户的屏幕分辨率,再根据这个分辨率来设置窗口大小
#注意:获取到的分辨率是一个浮点类型的数,如果后续想要用这个数,要注意是否要类型转换
根据用户屏幕分辨率来创建窗口,可以让窗口无论在哪个分辨率下都是如占屏幕的一半后者全屏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
``` a2 = a1.maxsize() ```
k, g = a2 #提取获取到的分辨率,第一个值为长度,第二个值为宽度
#显示的窗口为全屏
a1.geometry(f'{k}x{g}')
#显示的窗口为分辨率长、宽的一半,一半就直接乘上0.5就可以
#由于获取到的分辨率是浮点类型,但是这里需要整形,所以要有一个强制类型转换
a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}')
|
锁定窗口缩放
没有设置窗口缩放的话,创建的窗口用户可以自己去改变窗口大小,但是窗口内的控件容易因为窗口
的大小改变受影响,所以一般都是让窗口进行一个大小锁定
1 2 3 4 5 6 7 8 9 10 11 12 13
| a1.resizable(False, False) #resizable函数里面可以传入两个参数,并且都是布尔类型
第一个布尔类型表示是否锁定宽,第二个布尔类型表示是否锁定高,两者默认值都为True,即不锁定
宽和高**设置窗口左上角图标**
a1.iconbitmap('logo.ico') #icobitmap参数为字符串,用于传入图片途径,同时只支持ICO格
式的图片
#参数传入可以传绝对路径,如下(前面要加上r转义一下)
a1.iconbitmap(r'C:\Users\admin\Desktop\新建文件夹\新建文件夹\pythonProject1\ico')
|
设置窗口背景颜色
传入的参数可以是颜色的英文,也可以是颜色的编码
1
| a1.configure(bg='red') #可以放颜色的英文,也可以放颜色的编码(#000000)
|
设置窗口透明度
1 2 3
| a1.attributes('-alpha', 0) #attributes第一个参数为设置透明度固定传参-alpha,第二个参数
穿透明值(值的范围在0-1之间的浮点数,如:0.2、0.4等)
|
设置窗口置顶
窗口置顶就是让该窗口一直显示在屏幕图层的最上方,不会被其他窗口遮挡
该设置调用的函数和设置窗口透明度一样,都是attributes,但是两者传入的参数不同
1 2 3
| a1.attributes('-topmost', True) #第一个为窗口置顶的固定传入参数-topmost,第二个值给True
表示打开窗口置顶,默认值为False
|
标签组件
类似于Android中的text组件,用于在窗口中显示文字的,标签组件一般都和填充组合使用,因为只设
置了标签,没有让这个标签填充到窗口中,那么就不会显示标签中的文字了1 a3 = tk.Label(a1, text=’GUI学习’,font=(‘黑体’, 26), fg=’blue’, bg=’yellow’)
参数1:标签创建在哪个窗口中
参数2:标签显示什么文本,关键字:text
参数3:设置字体,这个参数还有个嵌套参数,第一个参数为想要显示什么样的字体,第二个参数为字体
大小,关键字:font
参数4:设置显示文字的颜色,关键字:fg
参数5:标签的背景颜色,关键字:bg
设置好标签组件之后,还需要使用填充将这个组件填充到窗口中
1
| a3.pack() #填充布局pack,作用就是让前面的标签组件显示出来,要是不写那标签组件就不会显示
|
Tk****库中的三种填充方式
1.填充布局(pack),也是默认填充,如果不设置创建的窗口大小,那么填充布局就会将填充的东西充满整
个窗口,若窗口设置了大小,那么填充在窗口置顶的中间
2.自定义布局(place),参数1:设置填充距离窗口左侧的距离,参数2:设置填充距离窗口顶部的距离,但是
设置填充的距离不能超过窗口的大小
3.网格布局(grid),可以理解为excel表格,参数一表示行,参数二表示列
1 2 3 4 5 6 7 8 9
| #自定义布局
a3.place(x=100, y=100) #参数一表示距离窗口左侧多少个像素,参数二表示距离窗口顶部多少个像
素
#网格布局
a3.grid(row=1, column=1) #参数一表示行,参数二表示列,这里就是第一行第一列
|
输入框组件
关键字:Entry
1 2 3
| tk.Entry(a1, width=15, font=('黑体', 26)).place(x=550, y=250) #输入组件配置完成后可
以直接在代码后面设置填充(显示)的位置,不需要像之前一样赋值给变量之后再填充参数1:需要布局在哪个窗口上(窗口对象)
|
参数2:输入框宽度,不设置的话宽度默认一直到窗口最边缘,关键字:width
参数3:设置字体,这里嵌套传入两个参数,和前面创建标签组件一样,第一个参数为像黑体这样的字
体,第二个参数为字体大小
字符串变量
可以用于获取用户在输入框中输入的内容,如使用get就是获取输入框的内容
1 2 3 4 5 6 7 8 9 10 11 12 13
| s1 = tk.StringVar() #使用
StringVar前提是输入框组件中添加了关键词传参(textvariable),同时导入了字符串变量s1,才能获取到输
入框的东西
s1.set('这是一个提示文本') #set就像
提示文本,在输入框中显示一串字符串
tk.Entry(a1, textvariable=s1,width=15, font=('黑体', 26)).place(x=550, y=250) #使用字
符串变量前提一定是Entry里面添加了textvariable参数并且将对应的字符串变量赋值给它
|
按钮组件
关键字:Button
1 2 3 4 5 6 7 8 9 10 11 12 13
| def dl():
print("Gui")
print(s1.get()) #s1.get是前面字符串变量中的内容,get就是获取用户在输入框
内输入的内容
print(s2.get())
tk.Button(a1, text='登录', font=('黑体', 25), width=15, command=dl).place(x=400, y=350)
|
参数1:该按钮在哪一个窗口中
参数2:按钮显示的文字是什么
参数3:按钮字体,设置字体时和前面一样用一个括号传入两个参数
参数4:这个按键的宽度
参数5:传入执行函数,用于点击按钮后需要触发的事件,关键字:command
弹窗组件
注意:使用弹窗组件需要导包:from tkinter import messagebox弹窗组件一共有四种:
1.错误弹窗(showerror)
2.提示弹窗(showinfo)
3.警告弹窗(showwarning)
4.带确定和取消按钮的弹窗(askokcancel)
这四种弹窗函数传入的参数一都是窗口名称,参数二都是窗口显示的内容
弹窗组件顾名思义,就是如点击登入之后弹出的一个小窗口作为提示登录结果,所以下面将会结合按
钮组件来演示弹窗组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| def dl():
print("Gui")
print(s1.get())
print(s2.get())
"""
我们将在这个按钮的点击函数中写出弹窗组件的示例
"""
if s1.get() != '123' or s2.get() != 123: #判断账号和密码是不是正确的
print('账号或密码错误')
#显示错误弹窗
messagebox.showerror('错误', '账号或密码错误') #messagebox.showerror是弹出一
个窗口,参数一为弹窗名称,参数二为弹窗中显示的内容
#显示提示弹窗
messagebox.showinfo('错误', '账号或密码错误')
#显示警告弹窗
messagebox.showwarning('错误', '账号或密码错误')
#带确定和取消类型弹窗(前三种都是只带确定一个按键的弹窗),这种一般在关闭窗口时弹出等功能
上运用,即二次确定功能
#弹窗的确定或取消都可以在函数中定义它的点击事件函数,前提是将这个窗口赋值给一个变量(如
下)
d1 = messageboc.askokcancel('错误', '账号或密码错误')
if d1: #当点击确定的时候askokcancel返回True
print('确定成功')
else: #当点击取消的时候askokcancel返回False
print('取消成功')
tk.Button(a1, text='登录', font=('黑体', 25), width=15, command=dl).place(x=400, y=350)**顶层窗口**
即内层窗口,除了创建的主窗体以外,其他在主窗口里继续再额外打开的窗口
在这个窗口中再打开一个新的窗口,这个窗口在标签等方面的设置和前面的窗口设置步骤是一样的,只
是一开始的引用不一样
示例使用点击注册按钮时弹出一个注册的窗口
#注册按键点击函数
def zc():
#注册界面设置
a2 = tk.Toplevel()
a2.title('用户注册')
a2.geometry('300x200+400+400')
a2.resizable(False, False)
tk.Label(a2, text='注册账号: ', font=('楷体', 15)).grid(row=1, column=1)
tk.Entry(a2, width=15, font=('楷体', 15)).grid(row=1, column=2)
tk.Label(a2, text='注册密码: ', font=('楷体', 15)).grid(row=2, column=1)
tk.Entry(a2, width=15, font=('楷体', 15)).grid(row=2, column=2)
#注册按键
tk.Button(a2, text='注册',font=('楷体', 15)).place(x=130, y=75)
#注册按键
tk.Button(a1, text='注册', font=('黑体', 25), width=10, command=zc).place(x=700, y=350)
|
菜单设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #创建主菜单
cai = tk.Menu(a1) #函数传入参数为该擦弹要在哪个窗口上
#设置菜单名
cai.add_cascade(label='图书管理')
cai.add_cascade(label='账号管理')
#开启菜单栏(菜单和前面的标签组件一样,如果没有开启或填充就不会显示到窗口中)
a1.config(menu=cai) #使用config开启菜单,函数中传入的参数是需要开启对应菜单的名称,如果这
个菜单名下设置有多个菜单,那么有几个菜单就显示几个菜单
#下级菜单创建(菜单下拉之后所显示出来的那一部分),调用的函数还是Menu,但是传入的是菜单名称,不是窗
口名称,因为创建的是下级菜单,如下
xia = tk.Menu(cai, tearoff=0) #创建下级菜单同时用一个变量接收它,参数2设置的是下拉菜单是
否有撕开按钮
#设置下级菜单(实际上创建出来的下级菜单可以理解成为是一个按钮)
xia.add_command(label='图书入库', command='') #参数1为下级菜单名称参数,参数2为点击这
个下级菜单后的点击事件函数
#绑定到主菜单
cai.add_cascade(menu=xia) #但是我们发现前面设置主菜单的时候已经使用到了这个语句,所以我们可
以将两者合起来
#cai.add_cascade(label='账号管理', menu=xia) #合并之后的代码
|
创建下拉列表(组合框)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| 使用组合框需要导包:from tkinter.ttk import Combobox
创建的是一个输入框最右边有一个三角形点一下有下拉选项
t1 = tk.Toplevel()
t1.title('图书入库')
t1.geometry('300x300+200+200')
t1.resizable(False, False)
tk.Label(t1, text='书籍类型: ', font=('楷体', 10)).grid(row=1, column=1)
#创建下拉列表
t2 = tk.StringVar() #StringVar为使用字符串变
量时需要引用
t3 = ['北京', '深圳', '上海'] #
t4 = Combobox(t1, textvariable=t2, value=t3, font=('楷体', 10), width=10) #参数1表
示改下拉菜单创建在哪个窗口下,参数2表示让字符串变量显示出来(前面输入框显示提示文本使用过),参数3
表示下拉菜单下拉后的选项(必须是字符串)
#或者说参
数2的textvariable表示绑定了一个字符串变量,参数3的t3表示绑定的字符串变量里面有什么变量
t4.current(0) #设置下拉列表组件默认显示列表中的哪个,传入参数为列表中的下标
索引
t4.grid(row=1, column=2)
#发现这个下拉列表可以输入东西进去,但实际情况是只让用户通过下拉列表选择,用户不能自己输入任何东
西,此时可以使用state='readonly'来让这个下拉列表只读,如下
t4 = Combobox(t1, textvariable=t2, value=t3, font=('楷体', 10), width=10,
state='readonly') #state方法前面输入框使用过
|
窗口焦点设置
当我们从一个窗口中打开一个新的窗口后,会发现此时焦点还在旧窗口上,若想让焦点在新打开的窗
口上可以使用focus_set函数
t1.focus_set() #设置t1顶层窗口的焦点
设置单选框**(如选择男或女的一种单选框)**1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| s2 = tk.StringVar(value='男') #函数中传入参数表示让这个单选框默认选择男
tk.Radiobutton(t1, text='男', variable=s2, value='男').place(x=100, y=100) #用户点了这个单选框那么s2值为男
tk.Radiobutton(t1, text='女', variable=s2, value='女').place(x=100, y=150) #用户点了这个单选框那么s2值为女
#假设点击了上传按钮之后就输出用户选择了哪个单选框
def sc():
print(s2, get()) #打印出用户在单选框中选的内容
是什么
tk.Button(t1, text='上传', command=sc).place(x=300, y=200)
|
Radiobutton函数参数:
\1. 参数1表示单选框要创建到哪个窗口中
\2. 参数2表示该单选框要显示的文本
\3. 参数3为绑定一个字符串变量
\4. 参数4为绑定的字符串变量里面有什么值(复制给该字符串变量),作用为用户点击了这个
单选框那么s2的值就是男或者女
创建整数变量
在前面我们已经创建了字符串变量,我们可以根据这个来推出如何创建整数变量
1 2 3
| s3 = tk.IntVar() #创建整数变量
s4 = tk.StringVar() #创建字符串变量
|
创建多选框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| s3 = tk.IntVar()
s4 = tk.IntVar()
tk.Checkbutton(t1, text='跑步', variable=s3, onvalue=1, offvalue=0).place(x=80, y=100)
tk.Checkbutton(t1, text='游泳', variable=s4, onvalue=1, offvalue=0).place(x=100, y=100)
#同样这里使用一个上传按钮来显示用户选择了哪个多选框
def sc():
print(s3.get()) #获取多选框第一个返回的值
print(s4.get()) #获取多选框第二个返回的值
if s3.get() == 1: #当用户选择第一个多选框返回1,没有则返回零;第二个多选框也是如此
print('选择了跑步')
else:
print('未选择跑步')
if s4.get():
print('选择了游泳')
else:
print('未选择游泳')
tk.Button(t1, text='上传', command=sc).place(x=300, y=400)
|
Checkbutton函数参数:
\1. 参数1:改多选框创建在哪个窗口下
\2. 参数2:该多选框所显示的文本
\3. 参数3:绑定一个变量
\4. 参数4:当用户选择了这个多选框,该多选框返回的值或者返回的内容
\5. 参数5:当用户没有选择这个多选框,该多选框返回的值或者返回的内容
列表框(Listbox)
使用列表框需要导包:
1 2 3 4 5 6 7 8 9
| from tkinter import END1 lb = tk.Listbox(a1, width=40, height=20).place(x=100, y=200)
#列表框还有一个功能为在列表内追加内容,关键字:insert,参数1表示在列表框末尾追加,参数2表示追加内
容是什么
nei = f'城市:{t2.get()},性别:{s2,get()},爱好1:{s3.get()},爱好2:{s4.get()}'
lb.insert(END, nei)
|
Listbox函数参数:
\1. 参数1:该列表框需要放在哪个窗口下
\2. 参数2:列表框的宽度
\3. 参数3:列表框的高度
注意:如果在Listbox设置了字体的大小,那么列表框的大小将会根据字体大小而变化