本文将从最基础的 GUI 设计开始,逐步深入 tkinter 的学习。(参考资料: Python GUI Programming Cookbook - Second Edition)
tkinter 基础示例#
接下来我们将逐步揭开 tkinter 的面纱。
最简单的窗口#
下面的代码将是 tkinter 的最精简的代码,但它也完成了最简单的 GUI 窗口设计。
import tkinter as tk
# 创建一个窗口实例
win = tk.Tk()
# 为窗口添加标题
win.title("Python GUI")
#======================
# 启动 GUI
#======================
win.mainloop()
显示的效果是:
从图1 可以看出该窗口可以最小化、最大化、关闭,也可以水平或者竖直拉长窗口。
为了限制用户对窗口的尺寸进行改变,可以这样:
import tkinter as tk
# 创建一个窗口实例
win = tk.Tk()
# 为窗口添加标题
win.title("Python GUI")
# 限制 resizing 窗口
win.resizable(False, False)
#======================
# 启动 GUI
#======================
win.mainloop()
效果图:
从图2 可以看出最大化功能被禁用了,同时用户也无法水平或者竖直拉长窗口。当然,您可以设置 win.resizable(True, False)
让用户可以水平拉长窗口,而无法竖直拉长窗口。
添加 ttk.Label#
为了让的窗口更加有意思,需要添加 Label
用以显示一些信息给用户:
from tkinter import ttk, Tk
# 创建一个窗口实例
win = Tk()
# 为窗口添加标题
win.title("Python GUI")
# 添加 Label
ttk.Label(win, text="A Label").grid(column=0, row=0)
#======================
# 启动 GUI
#======================
win.mainloop()
ttk
中存放了许多 tkinter 的主题化的界面外观(look and feel)让 GUI 看起来更符合您的操作系统(比如 Windows 风格的界面)。
效果图:
一行文本框:ttk.Entry#
先看代码:
from tkinter import ttk, Tk, StringVar
# 创建一个窗口实例
win = Tk()
# 为窗口添加标题
win.title("Python GUI")
# 添加 Label
a_label = ttk.Label(win, text="A Label")
a_label.grid(column=0, row=0)
# 按钮触发事件的函数
def click_me():
action.configure(text='您好 ' + name.get())
# 覆盖 a_label
ttk.Label(win, text="键入您的名字:").grid(column=0, row=0)
# 加入一行文本框 Entry widget
name = StringVar()
name_entered = ttk.Entry(win, width=12, textvariable=name)
name_entered.grid(column=0, row=1)
# 添加一个按钮
action = ttk.Button(win, text="点我呀!", command=click_me)
action.grid(column=1, row=1)
# ======================
# 启动 GUI
# ======================
win.mainloop()
代码演示了 grid 如果设定在同一个位置,会覆盖前面的小部件;添加了字符串变量 StringVar
用于追踪小部件的字符串信息。小部件 ttk.Entry
提供用户输入一行文档字符串信息。
效果图:
注意:您可以将上述的代码的最后的设定部分添加 name_entered.focus()
(鼠标光标)和 action['state'] = 'disabled'
(禁用按钮):
action['state'] = 'disabled'
name_entered.focus() # 进入 Entry 后,放置鼠标的光标
# 启动 GUI
win.mainloop()
效果图:
组合框:ttk.Combobox#
先看代码:
from tkinter import ttk, Tk, StringVar
# 创建一个窗口实例
win = Tk()
# 为窗口添加标题
win.title("Python GUI")
# 按钮触发事件的函数
def click_me():
action.configure(text=f'您好 {name.get()}, 选择了{number_chosen.get()}')
# 覆盖 a_label
ttk.Label(win, text="键入您的名字:").grid(column=0, row=0)
# 加入一行文本框 Entry widget
name = StringVar()
name_entered = ttk.Entry(win, width=12, textvariable=name)
name_entered.grid(column=0, row=1)
# 添加一个按钮
action = ttk.Button(win, text="点我呀!", command=click_me)
action.grid(column=2, row=1)
ttk.Label(win, text="选择一个数字:").grid(column=1, row=0)
number = tk.StringVar()
number_chosen = ttk.Combobox(
win, width=12, textvariable=number, state='readonly')
number_chosen['values'] = (1, 2, 4, 42, 100)
number_chosen.grid(column=1, row=1)
number_chosen.current(0) # 设置预选列表的第一个数字为初始值
name_entered.focus() # 进入 Entry 后,放置鼠标的光标
# 启动 GUI
win.mainloop()
组合框通过 number_chosen['values'] = (1, 2, 4, 42, 100)
通过用户可选择的数字;number_chosen.current(0)
设定了初始值。
效果图:
上面的代码 number_chosen = ttk.Combobox( win, width=12, textvariable=number, state='readonly')
设定用户无法改变列表中的数字,用户为了让可以自定义数字,只需要将 state
删除即可。
可滚动的文本框: ScrolledText#
滚动文本小部件比简单的"条目"(ttk.Entry)小部件大得多,并且支持跨越多行。有点类似于记事本,当文本大于 ScrollEdText 小部件的高度时,会自动启用垂直滚动条。
from tkinter import ttk, Tk, IntVar
from tkinter import scrolledtext
# 创建一个窗口实例
win = Tk()
# 为窗口添加标题
win.title("Python GUI")
# Using a scrolled Text control
scrol_w = 30
scrol_h = 3
scr = scrolledtext.ScrolledText(win, width=scrol_w, height=scrol_h, wrap='word')
scr.grid(column=0, columnspan=3)
# 启动 GUI
win.mainloop()
效果: