Python - GUI 编程



Python 为开发图形用户界面 (GUI) 提供了各种选项。下面列出了最重要的功能。

  • Tkinter − Tkinter 是 Python 附带的 Tk GUI 工具包的 Python 接口。 我们将在本章中介绍此选项。
  • wxPython − 这是 wxWidgets GUI 工具包的开源 Python 接口。你可以在此处找到有关 WxPython 的完整教程
  • PyQt − 这也是一个流行的跨平台 Qt GUI 库的 Python 接口。 这里有一个非常好的 PyQt5 教程
  • PyGTK − PyGTK 是一组用 Python 和 C 编写的 GTK + GUI 库的包装器。 完整的 PyGTK 教程可在此处获得。
  • PySimpleGUI − PySimpleGui 是一个开源的跨平台 GUI 库,用于 蟒。它旨在提供一个统一的 API,用于创建基于 Python 的 Tkinter、PySide 和 WxPython 工具包的桌面 GUI。有关详细的 PySimpleGUI 教程,请单击。
  • Pygame − Pygame 是一种流行的 Python 库,用于开发视频游戏。它是免费的开源和跨平台包装器,围绕 Simple DirectMedia Library (SDL)。有关 Pygame 的综合教程,请访问此链接。
  • Jython – Jython 是 Java 的 Python 端口,它使 Python 脚本能够无缝访问本地计算机上的 Java 类库 www.jython.org

还有许多其他可用的接口,您可以在网上找到它们。

Tkinter 编程

Tkinter 是 Python 的标准 GUI 库。Python 与 Tkinter 结合使用时,提供了一种快速简便的方法来创建 GUI 应用程序。Tkinter 为 Tk GUI 工具包提供了一个强大的面向对象的接口。

tkinter 软件包包括以下模块 -

  • Tkinter − 主 Tkinter 模块。
  • tkinter.colorchooser − 让用户选择颜色的对话框。
  • tkinter.commondialog − 此处列出的其他模块中定义的对话框的基类。
  • tkinter.filedialog − 允许用户指定要打开或保存的文件的常用对话框。
  • tkinter.font − 帮助处理字体的实用程序。
  • tkinter.messagebox − 访问标准 Tk 对话框。
  • tkinter.scrolledtext − 内置垂直滚动条的文本小部件。
  • tkinter.simpledialog − 基本对话框和便捷函数。
  • tkinter.ttk − Tk 8.5 中引入的主题小部件集,为主 tkinter 模块中的许多经典小部件提供了现代替代方案。

使用 Tkinter 创建 GUI 应用程序是一项简单的任务。您需要做的就是执行以下步骤。

  • 导入 Tkinter 模块。
  • 创建 GUI 应用程序主窗口。
  • 将上述一个或多个小部件添加到 GUI 应用程序。
  • 进入主事件循环,对用户触发的每个事件执行操作。


# note that module name has changed from Tkinter in Python 2
# to tkinter in Python 3

import tkinter
top = tkinter.Tk()

# Code to add widgets will go here...
top.mainloop()

这将创建一个以下窗口 -

Tkinter 编程

当程序变得更加复杂时,使用面向对象的编程方法可以使代码更有条理。


import tkinter as tk
class App(tk.Tk):
	 	def __init__(self):
	 	 	 super().__init__()

app = App()
app.mainloop()

Tkinter 小部件

Tkinter 提供了各种控件,例如 GUI 应用程序中使用的按钮、标签和文本框。这些控件通常称为 widget。

目前 Tkinter 中有 15 种类型的小部件。我们在下表中展示了这些小部件以及简要描述 -

小部件 描述
Button Button 小部件用于显示应用程序中的按钮。
Canvas Canvas 小部件用于在应用程序中绘制形状,例如线条、椭圆、多边形和矩形。
Checkbutton Checkbutton 小部件用于将许多选项显示为复选框。用户可以一次选择多个选项。
Entry Entry 小部件用于显示用于接受用户值的单行文本字段。
Frame Frame 小部件用作容器小部件来组织其他小部件。
Label Label 小部件用于为其他小部件提供单行标题。它还可以包含图像。
Listbox Listbox 小部件用于向用户提供选项列表。
Menubutton Menubutton 小部件用于显示应用程序中的菜单。
Menu Menu 小部件用于向用户提供各种命令。这些命令包含在 Menubutton 中。
Message Message 小部件用于显示用于接受用户值的多行文本字段。
Radiobutton Radiobutton 小部件用于将许多选项显示为单选按钮。用户一次只能选择一个选项。
Scale Scale 小部件用于提供滑块 Widget。
Scrollbar Scrollbar 小部件用于向各种小部件(如列表框)添加滚动功能。
Text Text 小部件用于以多行显示文本。
Toplevel Toplevel 小部件用于提供单独的窗口容器。
Spinbox Spinbox 小部件是标准 Tkinter Entry 小部件的变体,可用于从固定数量的值中进行选择。
PanedWindow PanedWindow 是一个容器窗口小部件,可以包含任意数量的窗格,水平或垂直排列。
LabelFrame 标签框是一个简单的容器小部件。它的主要用途是充当复杂窗口布局的分隔条或容器。
tkMessageBox 此模块用于在应用程序中显示消息框。

让我们详细研究这些小部件。

标准属性

让我们看看如何指定一些常见属性,例如大小、颜色和字体。

让我们简要地研究一下它们 -

几何管理

所有 Tkinter 小部件都可以访问特定的几何管理方法,这些方法的目的是在整个父小部件区域中组织小部件。Tkinter 公开了以下几何管理器类:pack、grid 和 place。

  • pack() 方法 - 此几何管理器在将 widget 放入父 widget 之前将其组织成块。
  • grid() 方法 - 此几何管理器在父 widget 中以类似表格的结构组织 widget。
  • place() 方法 - 此几何管理器通过将小部件放置在父小部件中的特定位置来组织小部件。

让我们简要地研究一下几何管理方法 -

简单对话框

tkinter 包中的 simpledialog 模块包括一个 dialog 类和用于通过模态对话框接受用户输入的便捷函数。它由一个标签、一个入口小部件和两个按钮 Ok 和 Cancel 组成。这些函数是 −

  • askfloat(title, prompt, **kw) − 接受浮点数。
  • askinteger(title, prompt, **kw) − 接受整数输入。
  • askstring(title, prompt, **kw) − 接受用户的文本输入。

上述三个函数提供了提示用户输入所需类型的值的对话框。如果按下 Ok,则返回输入,如果按下 Cancel,则返回 None。

askinteger


from tkinter.simpledialog import askinteger
from tkinter import *
from tkinter import messagebox
top = Tk()

top.geometry("100x100")
def show():
	 	num = askinteger("Input", "Input an Integer")
	 	print(num)
	 	
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

它将产生以下输出 -

简单对话框

askfloat


from tkinter.simpledialog import askfloat
from tkinter import *
top = Tk()

top.geometry("100x100")
def show():
	 	num = askfloat("Input", "Input a floating point number")
	 	print(num)
	 	
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

它将产生以下输出 -

askfloat

askstring


from tkinter.simpledialog import askstring
from tkinter import *

top = Tk()

top.geometry("100x100")
def show():
	 	name = askstring("Input", "Enter you name")
	 	print(name)
	 	
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

它将产生以下输出 -

askstring

FileDialog 模块

Tkinter 包中的 filedialog 模块包括一个 FileDialog 类。它还定义了使用户能够执行打开文件、保存文件和打开目录活动的便捷功能。

  • filedialog.asksaveasfilename()
  • filedialog.asksaveasfile()
  • filedialog.askopenfilename()
  • filedialog.askopenfile()
  • filedialog.askdirectory()
  • filedialog.askopenfilenames()
  • filedialog.askopenfiles()

askopenfile

此功能允许用户从文件系统中选择所需的文件。文件对话框窗口具有 Open 和 Cancel 按钮。按下 Ok 时返回文件名及其路径,如果按下 Cancel 则返回 None。


from tkinter.filedialog import askopenfile
from tkinter import *

top = Tk()

top.geometry("100x100")
def show():
	 	filename = askopenfile()
	 	print(filename)
	 	
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

它将产生以下输出 -

askopenfile

颜色选择器

tkinter 包中包含的 colorchooser 模块具有允许用户通过颜色对话框选择所需颜色对象的功能。askcolor() 函数提供颜色对话框,其中包含预定义的色板和通过设置 RGB 值来选择自定义颜色的工具。该对话框返回所选颜色的 RGB 值元组及其十六进制值。


from tkinter.colorchooser import askcolor
from tkinter import *

top = Tk()

top.geometry("100x100")
def show():
	 	color = askcolor()
	 	print(color)
	 	
B = Button(top, text ="Click", command = show)
B.place(x=50,y=50)

top.mainloop()

它将产生以下输出 -

颜色选择器


((0, 255, 0), '#00ff00')

TTK 模块

术语 ttk 代表 Tk 主题小部件。ttk 模块是在 Tk 8.5 及更高版本中引入的。它提供了其他好处,包括 X11 下的抗锯齿字体渲染和窗口透明度。它为 Tkinter 提供主题和样式支持。

ttk 模块捆绑了 18 个小部件,其中 12 个已经存在于 Tkinter 中。导入 ttk 会用新的小部件覆盖这些小部件,这些小部件旨在在所有平台上具有更好、更现代的外观。

ttk 中的 6 个新小部件是 Combobox、Separator、Sizegrip、Treeview、Notebook 和 ProgressBar。

要覆盖基本的 Tk 小部件,导入应遵循 Tk 导入 -


from tkinter import *
from tkinter.ttk import *

原始的 Tk 小部件会自动替换为 tkinter.ttk 小部件。它们是 Button、Checkbutton、Entry、Frame、Label、LabelFrame、Menubutton、PanedWindow、Radiobutton、Scale Scrollbar

新的小部件,可跨平台提供更好的外观和感觉;但是,替换 Widget 并不完全兼容。主要区别在于 Ttk 小部件中不再存在 “fg”、“bg” 等与小部件样式相关的小部件选项。请改用 ttk.Style 类,以改进样式效果。

ttk 模块中的新小部件是 -

  • Notebook − 此小部件管理一组“选项卡”,您可以在这些选项卡之间进行交换,从而更改当前显示的窗口。
  • ProgressBar - 此小部件用于通过使用动画来显示进度或加载过程。
  • Separator - 用于使用分隔线分隔不同的小部件。
  • Treeview - 此小组件用于将树状层次结构中的项目组合在一起。每个项目都有一个文本标签、一个可选图像和一个可选的数据值列表。
  • ComboBox - 用于创建选项下拉列表,用户可以从中选择一个选项。
  • Sizegrip − 在屏幕右下角附近创建一个小手柄,可用于调整窗口大小。

组合框小部件

Python ttk Combobox 显示一个选项下拉列表,并一次显示一个选项。它是 widget Entry 的子类。因此,它从 Entry 类继承了许多选项和方法。

语法


from tkinter import ttk

Combo = ttk.Combobox(master, values.......)

get() 函数检索 Combobox 的当前值。


from tkinter import *
from tkinter import ttk

top = Tk()
top.geometry("200x150")

frame = Frame(top)
frame.pack()

langs = ["C", "C++", "Java",
	 	"Python", "PHP"]
	 	
Combo = ttk.Combobox(frame, values = langs)
Combo.set("Pick an Option")
Combo.pack(padx = 5, pady = 5)
top.mainloop()

它将产生以下输出 -

组合框小部件

进度条

ttk ProgressBar 小部件,以及如何使用它来创建加载屏幕或显示当前任务的进度。

语法


ttk.Progressbar(parent, orient, length, mode)

参数

  • Parent - 要放置 ProgressBar 的容器,例如 root 或 Tkinter 帧。
  • Orient − 定义 ProgressBar 的方向,可以是 vertical 或 horizontal。
  • Length − 通过采用整数值来定义 ProgressBar 的宽度。
  • Mode − 此参数有两个选项:dedetermined 和 indedetermined。

下面给出的代码创建了一个带有三个按钮的进度条,这些按钮链接到三个不同的功能。

第一个函数将进度条中的“value”或“progress”增加 20。这是通过 step() 函数完成的,该函数采用整数值来更改进度量。(默认值为 1.0)

第二个函数将进度条中的“value”或“progress”递减 20。

第三个函数在进度条中打印出当前进度级别。


import tkinter as tk
from tkinter import ttk

root = tk.Tk()
frame= ttk.Frame(root)
def increment():
	 	progressBar.step(20)
	 	
def decrement():
	 	progressBar.step(-20)
	 	
def display():
	 	print(progressBar["value"])

progressBar= ttk.Progressbar(frame, mode='determinate')
progressBar.pack(padx = 10, pady = 10)

button= ttk.Button(frame, text= "Increase", command= increment)
button.pack(padx = 10, pady = 10, side = tk.LEFT)

button= ttk.Button(frame, text= "Decrease", command= decrement)
button.pack(padx = 10, pady = 10, side = tk.LEFT)
button= ttk.Button(frame, text= "Display", command= display)
button.pack(padx = 10, pady = 10, side = tk.LEFT)

frame.pack(padx = 5, pady = 5)
root.mainloop()

它将产生以下输出 -

进度条

Notebook

Tkinter ttk 模块有一个名为 Notebook 的新有用小部件。它是容器(例如框架)的集合,其中有许多小部件作为子项。

每个 “tab” 或 “window” 都有一个与之关联的选项卡 ID,用于确定要切换到哪个选项卡。

您可以像在常规文本编辑器上一样在这些容器之间进行交换。

语法


notebook = ttk.Notebook(master, *options)

在此示例中,以两种不同的方式将 3 个窗口添加到我们的 Notebook 小部件中。第一种方法涉及 add() 函数,该函数只是在末尾附加一个新选项卡。另一种方法是 insert() 函数,可用于将制表符添加到特定位置。

add() 函数采用一个必需参数,即要添加的容器小部件,其余参数是可选参数,例如文本(要显示为选项卡标题的文本)、图像和复合。

insert() 函数需要一个 tab_id,它定义了它应该插入的位置。tab_id可以是索引值,也可以是字符串文本(如 “end”),它会将其附加到末尾。


import tkinter as tk
from tkinter import ttk

root = tk.Tk()
nb = ttk.Notebook(root)

# Frame 1 and 2
frame1 = ttk.Frame(nb)
frame2 = ttk.Frame(nb)

label1 = ttk.Label(frame1, text = "This is Window One")
label1.pack(pady = 50, padx = 20)
label2 = ttk.Label(frame2, text = "This is Window Two")
label2.pack(pady = 50, padx = 20)

frame1.pack(fill= tk.BOTH, expand=True)
frame2.pack(fill= tk.BOTH, expand=True)
nb.add(frame1, text = "Window 1")
nb.add(frame2, text = "Window 2")

frame3 = ttk.Frame(nb)
label3 = ttk.Label(frame3, text = "This is Window Three")
label3.pack(pady = 50, padx = 20)
frame3.pack(fill= tk.BOTH, expand=True)
nb.insert("end", frame3, text = "Window 3")
nb.pack(padx = 5, pady = 5, expand = True)

root.mainloop()

它将产生以下输出 -

笔记本

Treeview

Treeview 小部件用于以表格或分层方式显示项目。它支持为项目创建行和列等功能,以及允许项目具有子项,从而导致分层格式。

语法


tree = ttk.Treeview(container, **options)

选项

选项 描述
columns 列名列表
displaycolumns 列标识符列表(符号或整数索引),指定要显示的数据列及其显示顺序,或字符串 “#all”。
height 可见的行数。
padding 指定小部件的内部填充。可以是整数或 4 个值的列表。
selectmode “extended”、“browse” 或 “none” 之一。如果设置为 “extended”(默认),则可以选择多个项目。如果 “浏览” ,则一次只能选择一项。如果为 “none”,则所选内容不能为 由用户更改。
show 包含零个或多个以下值的列表,指定要显示的树的元素。默认值为 “tree headings”,即显示所有元素。

在这个例子中,我们将创建一个简单的 Treeview ttk 小部件并在其中填充一些数据。我们已经将一些数据存储在一个列表中,该列表将读取并添加到 read_data() 函数中的 Treeview 小部件中。

我们首先需要定义一个列名列表/元组。我们省略了 “Name” 列,因为已经存在一个名称为空的 (default) 列。

然后,我们将该列表/元组分配给 Treeview 中的 columns 选项,然后定义 “headings”,其中列是实际的列,而 heading 只是显示小部件时出现的列的标题。我们为每个列命名。“#0” 是默认列的名称。

tree.insert() 函数具有以下参数 -

  • Parent − 如果没有,则保留为空字符串。
  • Position − 我们要添加新项目的位置。要附加,请使用 tk.结束
  • Iid - 这是稍后用于跟踪相关项目的项目 ID。
  • Text − 我们将为其分配列表中的第一个值(名称)。

value 中,我们将传递我们从列表中获得的其他 2 个值。


import tkinter as tk
import tkinter.ttk as ttk
from tkinter import simpledialog

root = tk.Tk()
data = [
	 	["Bobby",26,20000],
	 	["Harrish",31,23000],
	 	["Jaya",18,19000],
	 	["Mark",22, 20500],
]
index=0
def read_data():
	 	for index, line in enumerate(data):
	 	 	 tree.insert('', tk.END, iid = index,
	 	 	 	 	text = line[0], values = line[1:])
columns = ("age", "salary")

tree= ttk.Treeview(root, columns=columns ,height = 20)
tree.pack(padx = 5, pady = 5)

tree.heading('#0', text='Name')
tree.heading('age', text='Age')
tree.heading('salary', text='Salary')

read_data()
root.mainloop()

它将产生以下输出 -

树视图

Sizegrip

Sizegrip 小部件基本上是一个类似箭头的小手柄,通常位于屏幕的右下角。在屏幕上拖动 Sizegrip 还会调整它所附加到的容器的大小。

语法


sizegrip = ttk.Sizegrip(parent, **options)


import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("100x100")

frame = ttk.Frame(root)
label = ttk.Label(root, text = "Hello World")
label.pack(padx = 5, pady = 5)
sizegrip = ttk.Sizegrip(frame)
sizegrip.pack(expand = True, fill = tk.BOTH, anchor = tk.SE)
frame.pack(padx = 10, pady = 10, expand = True, fill = tk.BOTH)

root.mainloop()

它将产生以下输出 -

Sizegrip

Separator

ttk Separator 小部件是一个非常简单的小部件,它只有一个目的,那就是通过在小部件之间画一条线来帮助将小部件“分离”成组/分区。我们可以将这条线(分隔符)的方向更改为水平或垂直,并更改其长度/高度。

语法


separator = ttk.Separator(parent, **options)

“orient”,可以是 tk.VERTICAL 或 tk.HORIZTONAL,分别用于垂直和水平分隔线。

在这里,我们创建了两个 Label 小部件,然后在它们之间创建了一个 Horizontal Separator。


import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("200x150")

frame = ttk.Frame(root)

label = ttk.Label(frame, text = "Hello World")
label.pack(padx = 5)

separator = ttk.Separator(frame,orient= tk.HORIZONTAL)
separator.pack(expand = True, fill = tk.X)

label = ttk.Label(frame, text = "Welcome To qikepu")
label.pack(padx = 5)

frame.pack(padx = 10, pady = 50, expand = True, fill = tk.BOTH)

root.mainloop()

它将产生以下输出 -

Horizontal Separator