Python - 图形用户界面编程


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

  • Tkinter - Tkinter 是 Python 附带的 Tk GUI 工具包的 Python 接口。我们将在本章中讨论这个选项。

  • wxPython - 这是 wxWidgets GUI 工具包的开源 Python 界面。您可以在此处找到有关 WxPython 的完整教程。

  • PyQt - 这也是流行的跨平台 Qt GUI 库的 Python 接口。TutorialsPoint这里有一个关于 PyQt5 的非常好的教程。

  • PyGTK - PyGTK 是一组用 Python 和 C 编写的 GTK + GUI 库的包装器。完整的 PyGTK 教程可在此处获取。

  • PySimpleGUI - PySimpleGui 是一个开源的、跨平台的 Python GUI 库。它旨在提供一个统一的 API,用于创建基于 Python 的 Tkinter、PySide 和 WxPython 工具包的桌面 GUI。有关详细的 PySimpleGUI 教程,请单击此处

  • Pygame - Pygame 是一个流行的 Python 库,用于开发视频游戏。它是简单 DirectMedia 库 (SDL) 的免费、开源和跨平台包装。有关 Pygame 的综合教程,请访问此链接。

  • Jython - Jython 是 Java 的 Python 端口,它使 Python 脚本能够无缝访问本地计算机上的 Java 类库http://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 应用程序中使用的按钮、标签和文本框。这些控件通常称为小部件。

目前 Tkinter 中有 15 种类型的小部件。我们在下表中介绍这些小部件以及简要说明 -

先生。 运算符及描述
1 按钮

按钮小部件用于显示应用程序中的按钮。

2 帆布

Canvas 小部件用于在应用程序中绘制形状,例如直线、椭圆形、多边形和矩形。

3 检查按钮

Checkbutton 小部件用于将许多选项显示为复选框。用户可以一次选择多个选项。

4 入口

Entry 小部件用于显示单行文本字段以接受用户的值。

5 框架

Frame 小部件用作容器小部件来组织其他小部件。

6 标签

标签小部件用于为其他小部件提供单行标题。它还可以包含图像。

7 列表框

列表框小部件用于向用户提供选项列表。

8 菜单按钮

Menubutton 小部件用于在应用程序中显示菜单。

9 菜单

菜单小部件用于向用户提供各种命令。这些命令包含在菜单按钮内。

10 信息

消息小部件用于显示多行文本字段以接受来自用户的值。

11 单选按钮

Radiobutton 小部件用于将许多选项显示为单选按钮。用户一次只能选择一个选项。

12 规模

Scale 小部件用于提供滑块小部件。

13 滚动条

滚动条小部件用于向各种小部件(例如列表框)添加滚动功能。

14 文本

文本小部件用于显示多行文本。

15 顶层

Toplevel 小部件用于提供单独的窗口容器。

16 纺纱箱

Spinbox 小部件是标准 Tkinter Entry 小部件的变体,可用于从固定数量的值中进行选择。

17 号 窗格窗

PanedWindow 是一个容器小部件,可以包含任意数量的水平或垂直排列的窗格。

18 标签框

标签框架是一个简单的容器小部件。它的主要目的是充当复杂窗口布局的间隔物或容器。

19 tk消息框

该模块用于在应用程序中显示消息框。

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

标准属性

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

让我们简单研究一下它们 -

几何管理

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

  • pack() 方法- 该几何管理器在将小部件放入父小部件之前将它们组织在块中。

  • grid() 方法- 该几何管理器在父窗口小部件中以类似表格的结构组织窗口小部件。

  • place() 方法- 该几何管理器通过将小部件放置在父小部件中的特定位置来组织小部件。

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

简单对话框

tkinter 包中的 simpledialog 模块包括一个对话框类和用于通过模式对话框接受用户输入的便利函数。它由一个标签、一个条目小部件和两个按钮“确定”和“取消”组成。这些功能是 -

  • Askfloat(title, Prompt, **kw) - 接受浮点数。

  • askinteger(title,prompt,**kw) - 接受整数输入。

  • Askstring(title, Prompt, **kw) - 接受用户的文本输入。

上述三个函数提供了对话框,提示用户输入所需类型的值。如果按下“确定”,则返回输入,如果按下“取消”,则返回“无”。

阿斯金泰格

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

它将产生以下输出-

简单对话框

询问浮动

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

它将产生以下输出-

询问浮动

询问字符串

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

它将产生以下输出-

询问字符串

文件对话框模块

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

  • filedialog.asksaveasfilename()
  • filedialog.asksaveasfile()
  • filedialog.askopen文件名()
  • filedialog.askopenfile()
  • filedialog.askdirectory()
  • filedialog.askopenfilenames()
  • filedialog.askopenfiles()

询问打开文件

此功能允许用户从文件系统中选择所需的文件。文件对话框窗口有“打开”和“取消”按钮。当按下“确定”时,将返回文件名及其路径;如果按下“取消”,则返回“无”。

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

它将产生以下输出-

询问打开文件

颜色选择器

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。

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

ttk 模块中的新小部件是 -

  • 笔记本- 此小部件管理“选项卡”集合,您可以在这些选项卡之间交换,更改当前显示的窗口。

  • ProgressBar - 此小部件用于通过使用动画来显示进度或加载过程。

  • Separator - 用于使用分隔线分隔不同的小部件。

  • Treeview - 此小部件用于将树状层次结构中的项目分组在一起。每个项目都有一个文本标签、一个可选图像和一个可选数据值列表。

  • ComboBox - 用于创建选项下拉列表,用户可以从中选择一个。

  • Sizegrip - 在屏幕右下角附近创建一个小手柄,可用于调整窗口大小。

组合框小部件

Python ttk 组合框呈现一个选项下拉列表,并一次显示一个选项。它是小部件 Entry 的子类。因此它从 Entry 类继承了许多选项和方法。

句法

from tkinter import ttk

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

get() 函数用于检索组合框的当前值。

例子

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 的容器,例如根或 Tkinter 框架。

  • Orient - 定义 ProgressBar 的方向,可以是垂直的也可以是水平的。

  • Length - 通过接受整数值来定义 ProgressBar 的宽度。

  • 模式- 此参数有两个选项:确定的和不确定的。

例子

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

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

第二个函数将进度条中的“值”或“进度”减少 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()

它将产生以下输出-

进度条

笔记本

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

每个“选项卡”或“窗口”都有一个与其关联的选项卡 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 小部件用于以表格或分层方式显示项目。它支持为项目创建行和列等功能,以及允许项目具有子项,从而形成分层格式。

句法

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

选项

先生。 选项和说明
1

列名称列表

2

显示列

指定显示哪些数据列及其出现顺序的列标识符(符号索引或整数索引)列表,或字符串“#all”。

3

高度

可见的行数。

4

填充

指定小部件的内部填充。可以是整数或 4 个值的列表。

5

选择模式

“扩展”、“浏览”或“无”之一。如果设置为“扩展”(默认),则可以选择多个项目。如果“浏览”,则一次只能选择一个项目。如果为“无”,则用户无法更改选择。

6

展示

包含零个或多个以下值的列表,指定要显示树的哪些元素。默认为“树标题”,即显示所有元素。

例子

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

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

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

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

  • Parent - 如果没有,则保留为空字符串。

  • 位置- 我们要添加新项目的位置。要追加,请使用 tk.END

  • Iid - 这是用于稍后跟踪相关项目的项目 ID。

  • 文本- 我们将为其分配列表中的第一个值(名称)。

我们将传递从列表中获得的其他 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 = 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()

它将产生以下输出-

大小握把

分隔器

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

句法

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

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

例子

在这里,我们创建了两个标签小部件,然后在它们之间创建了一个水平分隔符。

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 TutorialsPoint")
label.pack(padx = 5)

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

root.mainloop()

它将产生以下输出-

分隔器