tkinter 是Python的一个默认GUI库,本教程从基础开始一直到做出一个好看的gui界面。 我会根据教学内容把我所学到的一切整理在这里。
The ultimate introduction to modern GUIs in Python [ with tkinter ] - YouTube
Tkinter Hello, World! (pythontutorial.net)
入门例子
示例代码包含以下几个方面:
- 使用的自带组件tkinter
- 设置窗体属性如大小标题
- 增加控件如label frame button entry
- pack 布局方式
- textvariable tk可绑定变量
- ttkbootstrap 主题示例
程序的功能是:输入英里数,转换成公里数,显示在label上。
1import tkinter as tk
2# from tkinter import ttk
3import ttkbootstrap as ttk # 需要安装 pip install ttkbootstrap
4
5def convert():
6 mile_input = entry_int.get()
7 km_output = mile_input * 1.61
8 output_string.set(f'{km_output:.2f}') # f-string
9
10# 设置一些基础事项,实例、设置标题、设置大小
11window = ttk.Window (themename = 'darkly') # themes: darkly, flatly, journal, litera, lumen, lux, materia, minty, pulse, sandstone, simplex, sketchy, slate, solar, spacelab, superhero, united, yeti
12window.title('Demo')
13window.geometry('300x150') #width x height
14# 在Windows里面增加一个label
15# 设置label的母亲、文字内容和字体以及字体大小
16title_lable = ttk.Label(master=window,text='Mile to Kilometers',font='Calibri 26 bold')
17title_lable.pack() #pack 之后才能显示出来
18
19input_frame = ttk.Frame(master=window) # panel
20entry_int = tk.IntVar() # 变量绑定 int
21entry = ttk.Entry(master= input_frame, textvariable=entry_int) # textbox
22button = ttk.Button(master= input_frame , text='convert' , command=convert) # button , command: onclick
23entry.pack(side='left',padx=10) #side: left right top bottom , padx: padding x axis (left and right
24button.pack(side='left')
25input_frame.pack(pady=0) # pady: padding y axis
26
27# output
28output_string = tk.StringVar() # 变量绑定 string
29output_lable = ttk.Label(master=window,text='Output',font='Calibri 24',textvariable=output_string)
30output_lable.pack(pady=5)
31# run
32window.mainloop()
常用tk组件介绍
- Text 大文本框
- Label 标签
- Button 按钮
- Entry 小文本框
1import tkinter as tk
2from tkinter import ttk
3
4def button_function():
5 print('btn pressed')
6
7window = tk.Tk()
8window.title('Window and Widgets') # 设置标题
9window.geometry('800x580')
10
11tk.Text(master=window).pack() # 文本框
12# ttk lable
13lable = ttk.Label(master=window,text='Hello World' ) # 标签
14lable.pack()
15# ttk entry
16entry = ttk.Entry(master=window) # 输入框
17entry.pack()
18# ttk button
19button = ttk.Button(master=window,text='Click Me',command= button_function) # 按钮
20button.pack()
21
22window.mainloop()
设置组件的内容(手动)
getter and setter
- entry.get()
- entry[‘state’] = ‘disabled’
- lable.config(text=‘aaa’) 未来将会删除
- lable.configure(text=‘aaa’)
- lable[’text’] = ‘aaa’
查看所有可用的config项:
print(lable.configure())
程序的功能是:在entry中输入内容,点击Click Me按钮后,显示在label上,并禁止entry输入。 点击reset按钮后,清空textbox,重新输入。
1import tkinter as tk
2from tkinter import ttk
3
4def button_function():
5 lable.config(text=entry.get())
6 entry['state']='disabled'
7
8def reset_button_function():
9 entry['state']='enabled'
10 entry.delete(0,'end')
11
12window = tk.Tk()
13window.title('Getting and setting widgets') # 设置标题
14lable = ttk.Label(master=window,text='Hello World' ) # 标签
15lable.pack()
16entry = ttk.Entry(master=window) # 输入框
17entry.pack()
18button = ttk.Button(master=window,text='Click Me',command= button_function) # 按钮
19button.pack()
20
21reset_button = ttk.Button(master=window,text='Reset',command= reset_button_function ) # 按钮
22reset_button.pack()
23
24window.mainloop()
绑定变量 Tkiner Variable ⭐⭐⭐
绑定可以 : 设置组件的内容(自动)
绑定,是很重要的概念。
1string_var = tk.StringVar()
2string_var.set('type something')
3...
4
5lable = ttk.Label(master=window, textvariable=string_var) # textvariable / variable 取决于控件类型
下面的程序有两个entry一个label,输入框的值变化时,label的值也会变化,他们三个绑定了同一个变量。
1import tkinter as tk
2from tkinter import ttk
3
4window = tk.Tk()
5window.title('Tkiner Variable') # 设置标题
6window.geometry('400x300')
7
8# tkinter variable
9string_var = tk.StringVar()
10string_var.set('test') # 设置默认值
11# alse have these types
12Int_var = tk.IntVar()
13Double_var = tk.DoubleVar()
14Boolean_var = tk.BooleanVar()
15
16
17lable = ttk.Label(master=window, textvariable=string_var) # 标签
18entry = ttk.Entry(master=window,textvariable=string_var) # 输入框
19lable.pack()
20entry.pack()
21
22entry2 = ttk.Entry(master=window,textvariable=string_var) # 输入框
23entry2.pack()
24
25
26window.mainloop()
button类控件
- button
- command 在每次点击时运行
- checkbutton
- check box 通常用于多个选框都可以勾选 类似点菜
- command 在每次点击时运行
- 需要绑定 variable 到 tk.xxxVar() 上
- 可以设定的 onvalue 和 offvalue , 比如绑定tk.IntVar(),可以设定 onvalue=10, offvalue=0
- radiobutton
- radiobutton 通常用于单选,类似性别选择
- 必须设定 value 属性,以区分所有的 radiobutton
- 同一组的 radio 需要绑定同一个 variable 上
- 选中的variable会被赋值到 variable 上
示例程序:
radioA\radioB 为一组,绑定radio_var,点击时候 print check_var 的值,并且取消勾选 checkbtn; checkbtn 绑定check_var, 勾选时候,print radio_var 的值
1import tkinter as tk
2from tkinter import ttk
3
4window = tk.Tk()
5window.title('Tkiner Variable') # 设置标题
6window.geometry('400x300')
7
8
9# test
10def radio_func():
11 print(check_var.get())
12 check_var.set(False)
13# data
14radio_str = tk.StringVar()
15check_var = tk.BooleanVar()
16# widgets
17radiobuttonA = ttk.Radiobutton(master=window,text='radio A',value='A',command=radio_func,variable=radio_str)
18radiobuttonB = ttk.Radiobutton(master=window,text='radio B',value='B',command=radio_func,variable=radio_str)
19Checkbutton_A = ttk.Checkbutton(master=window,text='A',variable=check_var,command=lambda:print(radio_str.get() ))
20# layout
21radiobuttonA.pack()
22radiobuttonB.pack()
23Checkbutton_A.pack()
24
25window.mainloop()
button 执行 带参函数
- 无参数函数
- command=myfunc
- 有参数函数
- 传入 command=lambda: arg_func(your_arg)
- 不能传入 command= arg_func(your_arg) (会在开始时候执行一遍函数,然后点击按钮就无效了)
1import tkinter as tk
2from tkinter import ttk
3
4window = tk.Tk()
5window.title('Tkiner Variable') # 设置标题
6window.geometry('400x300')
7
8# test
9def arg_func(str):
10 print(str)
11# data
12entry_str = tk.StringVar(value='test')
13# widgets
14entry = ttk.Entry(master=window,textvariable=entry_str) # 输入框
15#button = ttk.Button(master=window,text='Click Me',command= arg_func(entry_str.get())) # 错误示例,会在开始时候执行一遍函数
16button = ttk.Button(master=window,text='Click Me',command= lambda: arg_func(entry_str.get())) # 正确示例1
17# layout
18entry.pack()
19button.pack()
20
21window.mainloop()