Python 3 – GUI编程 (Tkinter)
Python 作为一门优秀的编程语言,已经被广泛应用于机器学习、数据分析、Web 开发和自动化等领域。同时,Python 还拥有一个强大的 GUI 库——Tkinter,可以方便地创建各种图形界面。本文将介绍如何使用 Python 3 在 Tkinter 中创建 GUI 程序。
安装 Tkinter
Python 3 默认自带 Tkinter 模块,因此不需要额外安装。可以在命令行输入以下命令,查看自己的 Python 版本和是否安装了 Tkinter:
python -V
如果输出了类似 Python 3.x.x
的版本号,则说明 Python 3 已经安装。可以输入以下命令,导入 Tkinter 模块并查看其版本:
import tkinter
print(tkinter.TkVersion)
如果输出了版本号,则说明 Tkinter 已经安装。
Tkinter 基础
创建窗口
使用 Tkinter 创建窗口非常简单,只需完成以下步骤:
- 导入 Tkinter 模块;
- 创建主窗口对象;
- 进入主事件循环。
下面是一个示例程序:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 进入主事件循环
window.mainloop()
运行后,会看到一个空白的窗口,窗口的标题为 tk
。
设置窗口大小和位置
使用 geometry()
方法可以设置窗口的大小和位置。它的参数是字符串,格式为 宽度x高度+水平偏移量+垂直偏移量
。例如,以下代码将窗口大小设置为 300×200,位置设置为 (100, 100):
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 设置窗口大小和位置
window.geometry('300x200+100+100')
# 进入主事件循环
window.mainloop()
设置窗口标题和图标
使用 title()
方法可以设置窗口的标题,例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 设置窗口标题
window.title('Hello, Tkinter')
# 进入主事件循环
window.mainloop()
其结果是窗口的标题变为 Hello, Tkinter
。
使用 iconbitmap()
方法可以设置窗口的图标,方法的参数为一个 ICO 文件的路径。例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 设置窗口图标
window.iconbitmap('icon.ico')
# 进入主事件循环
window.mainloop()
其中 icon.ico
是一个 ICO 文件的路径。
创建 Label
创建 Label 是 Tkinter 中常用的 GUI 元素之一,它可以显示文本或图片。使用 Label()
方法可以创建一个 Label,方法的参数为窗口对象和显示的文本。例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 创建 Label
label = tk.Label(window, text='Hello, Tkinter')
# 显示 Label
label.pack()
# 进入主事件循环
window.mainloop()
其中 pack()
方法用于显示 Label,它还可以指定 Label 的位置和对齐方式。
创建 Button
创建 Button 是 Tkinter 中常用的 GUI 元素之一,它可以响应用户的点击事件。使用 Button()
方法可以创建一个 Button,方法的参数为窗口对象、显示的文本和点击事件的回调函数。例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 点击事件的回调函数
def on_click():
print('Button clicked.')
# 创建 Button
button = tk.Button(window, text='Click me', command=on_click)
# 显示 Button
button.pack()
# 进入主事件循环
window.mainloop()
其中 command
参数指定了点击事件的回调函数,它会在用户点击 Button 时被调用。
Tkinter 高级特性
创建菜单
使用 Menu()
方法可以创建一个菜单。在 Tkinter 中,菜单的种类有三种:顶层菜单、下拉菜单和上下文菜单。下面分别介绍如何创建这三种菜单。
顶层菜单
顶层菜单是作为窗口的一部分创建的,通常包含在窗口顶部的菜单栏中。使用 Menu()
方法创建顶层菜单,在创建窗口后立即创建菜单栏,然后在菜单栏中添加菜单项。例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 创建菜单栏
menubar = tk.Menu(window)
# 添加 File 菜单项
filemenu = tk.Menu(menubar, tearoff=False)
filemenu.add_command(label='Open')
filemenu.add_command(label='Save')
menubar.add_cascade(label='File', menu=filemenu)
# 添加 Help 菜单项
helpmenu = tk.Menu(menubar, tearoff=False)
helpmenu.add_command(label='About')
menubar.add_cascade(label='Help', menu=helpmenu)
# 显示菜单栏
window.config(menu=menubar)
# 进入主事件循环
window.mainloop()
其中 Menu()
方法创建了一个菜单,tearoff
参数为 False 表示不允许菜单项被拆分,add_command()
方法用于添加一个菜单项,add_cascade()
方法用于在菜单栏中添加一个菜单。
下拉菜单
下拉菜单是指在菜单栏或其他菜单项上单击时弹出的菜单。使用 Menu()
方法创建下拉菜单,在创建菜单时指定该菜单所属的菜单项,然后在该菜单中添加菜单项。例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 创建菜单栏
menubar = tk.Menu(window)
# 添加 File 菜单项及下拉菜单
filemenu = tk.Menu(menubar, tearoff=False)
filemenu.add_command(label='Open')
filemenu.add_command(label='Save')
submenu = tk.Menu(filemenu, tearoff=False)
submenu.add_command(label='Copy')
submenu.add_command(label='Paste')
filemenu.add_cascade(label='Edit', menu=submenu)
menubar.add_cascade(label='File', menu=filemenu)
# 显示菜单栏
window.config(menu=menubar)
# 进入主事件循环
window.mainloop()
其中 add_cascade()
方法用于在下拉菜单中添加另一个菜单,参数 label
为该菜单的名称,menu
为该菜单对象。
上下文菜单
上下文菜单是指在图形界面中右键单击某个对象时弹出的菜单。使用 Menu()
方法创建上下文菜单,在创建窗口时指定该窗口的上下文菜单,然后在该菜单中添加菜单项。例如:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 创建上下文菜单并添加菜单项
menu = tk.Menu(window, tearoff=False)
menu.add_command(label='Copy')
menu.add_command(label='Paste')
# 绑定右键单击事件
def on_right_click(event):
menu.post(event.x_root, event.y_root)
window.bind('<Button-3>', on_right_click)
# 进入主事件循环
window.mainloop()
其中 <Button-3>
表示鼠标右键单击事件,on_right_click()
方法用于响应该事件并弹出菜单。
创建对话框
使用对话框可以方便地与用户交互,获取用户的输入或显示提示信息。在 Tkinter 中,可以使用 Toplevel()
方法创建对话框,也可以使用 tkinter.messagebox
模块中的方法创建各种类型的对话框。
创建 Toplevel 对话框
创建 Toplevel 对话框的方法与创建主窗口类似。以下是一个显示对话框的示例程序:
import tkinter as tk
# 创建主窗口对象
window = tk.Tk()
# 创建按钮
def on_click():
# 创建对话框
dialog = tk.Toplevel(window)
dialog.geometry('200x100+200+200')
dialog.title('Dialog')
tk.Label(dialog, text='Hello, Tkinter!').pack()
button = tk.Button(window, text='Click me', command=on_click)
button.pack()
# 进入主事件循环
window.mainloop()
在该程序中,单击按钮会创建一个 Toplevel 对话框,其中包含一个 Label,显示文本为 Hello, Tkinter!
。
创建消息框
在 Tkinter 中,可以使用 tkinter.messagebox
模块中的方法创建各种类型的对话框。以下是一些示例:
import tkinter as tk
import tkinter.messagebox as msgbox
# 创建主窗口对象
window = tk.Tk()
# 创建按钮
def on_click():
# 消息框(带 OK 按钮)
msgbox.showinfo('Message', 'Hello, Tkinter!')
# 询问框(带 Yes 和 No 按钮)
result = msgbox.askyesno('Question', 'Do you like Tkinter?')
if result:
print('Yes')
else:
print('No')
# 警告框(带 OK 按钮)
msgbox.showwarning('Warning', 'This is a warning message.')
# 错误框(带 OK 按钮)
msgbox.showerror('Error', 'An error occurred.')
button = tk.Button(window, text='Click me', command=on_click)
button.pack()
# 进入主事件循环
window.mainloop()
在该程序中,单击按钮会依次显示消息框、询问框、警告框和错误框。
Tkinter Tips
美化程序
通过将图像和自定义字体添加到程序中,可以美化 Python Tkinter GUI 应用程序。以下代码演示如何用自定义字体和图像装饰标签控件:
import tkinter as tk
from PIL import Image, ImageTk
# 创建主窗口对象
window = tk.Tk()
# 添加自定义字体
font = ('Yu Gothic UI', 14)
title_font = ('Yu Gothic UI', 20, 'bold')
# 添加标签
tk.Label(window, text='Hello, Tkinter!', font=title_font).pack(pady=10)
# 添加图像
image = Image.open('image.png')
photo = ImageTk.PhotoImage(image)
tk.Label(window, image=photo).pack(pady=10)
# 进入主事件循环
window.mainloop()
在该程序中,添加自定义字体只需将字体名称传递给 font
或 title_font
参数。添加图像则需要使用 Pillow
库中的 Image
和 ImageTk
两个模块,先使用 Image.open()
方法打开图像文件并创建 Image
对象,再使用 ImageTk.PhotoImage()
方法将 Image
对象转换为 PhotoImage
对象,然后将该对象传递给标签控件的 image
参数。
调用 Python 外部脚本
将函数外部代码定义为 Python 模块可以方便地从 Tkinter GUI 控件调用它们。以下代码演示如何调用 Python 外部脚本添加计算器控件:
import tkinter as tk
import calculator
# 创建主窗口对象
window = tk.Tk()
# 添加计算器控件
calc = calculator.Calculator(window)
calc.pack(pady=10)
# 进入主事件循环
window.mainloop()
在该程序中,calculator
模块定义了一个名为 Calculator
的控件,该控件可以实现基本的算术运算。要从 Tkinter GUI 控件调用 Calculator
,只需导入 calculator
模块并创建该控件对象即可。
结论
Python Tkinter 是一个强大的 GUI 库,它可以方便地创建各种类型的图形用户界面。在创建 Tkinter 程序时,需要先创建主窗口对象,设置窗口的大小和位置,然后将各种 Tkinter 控件添加到窗口中。使用菜单和对话框可以方便地与用户交互,获取用户的输入或显示提示信息。使用自定义字体和图像可以美化程序,让它更加吸引人。在编写 Tkinter 程序时,最好将功能模块定义为 Python 模块,以便从 Tkinter 控件调用它们。