Tkinter

tkinter 是Python的一个默认GUI库,本教程从基础开始一直到做出一个好看的gui界面。 我会根据教学内容把我所学到的一切整理在这里。

The ultimate introduction to modern GUIs in Python [ with tkinter ] - YouTube

Tkinter Hello, World! (pythontutorial.net)


入门例子

示例代码包含以下几个方面:

  1. 使用的自带组件tkinter
  2. 设置窗体属性如大小标题
  3. 增加控件如label frame button entry
  4. pack 布局方式
  5. textvariable tk可绑定变量
  6. ttkbootstrap 主题示例

程序的功能是:输入英里数,转换成公里数,显示在label上。

Imgur

 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 小文本框

Imgur

 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,重新输入。

Imgur

 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的值也会变化,他们三个绑定了同一个变量。

Imgur

 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 的值

Imgur

 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()

Jupyter Notebook
中国移动宽带-解限速脚本