使用Tk库的引用:

import tkinter as tk

创建窗口

a1 = tk.TK()

tk.Tk就是创建窗口的函数

打开窗口

也可以理解为主循环,创建窗口后需要打开窗口,mainloop函数就是用于这个作用的

1
a1.mainloop() #mainloop()

是启动这个窗口

设置窗口标题

1
a1.title('程序设计')

title设置窗口的左上角文字

设置窗口大小

1
a1.geometry("300x300")

前面的300设置窗口的宽,后面300设置窗口的高

窗口打开位置

使用的函数还是geometry函数,只是在定义窗口大小后,在后面用加号连接两个数字表示窗口打开时

距离屏幕左边多少像素、距离屏幕顶部多少像素1 a1.geometry(“300x300+200+100”)

a1.geometry(“宽x高+距离屏幕左侧什么位置打开+距离屏幕右侧什么位置打开”)

获取用户分辨率

由于每个用户的屏幕分辨率都不一定一样,如果设置窗口大小时给的大小是固定的值,那么会导致窗

口显示比例不一样等问题,所以可以先获取到用户的屏幕分辨率,再根据这个分辨率来设置窗口大小

1
a2 = a1.maxsize()

#注意:获取到的分辨率是一个浮点类型的数,如果后续想要用这个数,要注意是否要类型转换

根据用户屏幕分辨率来创建窗口,可以让窗口无论在哪个分辨率下都是如占屏幕的一半后者全屏

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设置了字体的大小,那么列表框的大小将会根据字体大小而变化