Python GUI编程
Python提供了多种选项来开发图形用户界面(GUI)。下面是最重要的特性列表:
- Tkinter − Tkinter是Python的Tk GUI工具包的接口。我们将在本章中介绍该选项。
-
wxPython − 这是一个开源的Python接口,用于wxWidgets GUI工具包。您可以在这里找到完整的WxPython教程。
-
PyQt − 这也是一个用于流行的跨平台Qt GUI库的Python接口。TutorialsPoint有一个非常好的PyQt5教程,您可以在这里找到。
-
PyGTK − PyGTK是用于GTK + GUI库的Python和C封装程序集。完整的PyGTK教程可在这里找到。
-
PySimpleGUI − PySimpleGui是一个用于Python的开源、跨平台的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()
这将创建一个以下的窗口−
当程序变得更加复杂时,采用面向对象的编程方法可以使代码更加有组织。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
app = App()
app.mainloop()
Tkinter小部件
Tkinter提供了用于GUI应用程序中的各种控件,例如按钮、标签和文本框。这些控件通常被称为小部件。
目前在Tkinter中有15种类型的小部件。我们在下表中介绍这些小部件以及简要描述−
序号 | 运算符和描述 |
---|---|
1 | Button Button小部件用于在应用程序中显示按钮。 |
2 | Canvas Canvas小部件用于在应用程序中绘制形状,如线条、椭圆、多边形和矩形。 |
3 | Checkbutton Checkbutton小部件用于显示多个选择项作为复选框。用户可以同时选择多个选项。 |
4 | Entry Entry小部件用于显示用于接受用户输入值的单行文本字段。 |
5 | Frame 小部件用作容器部件,以组织其他小部件。 |
6 | Label 小部件用于为其他小部件提供单行标题。它还可以包含图像。 |
7 | Listbox 小部件用于向用户提供选项列表。 |
8 | Menubutton 小部件用于在应用程序中显示菜单。 |
9 | Menu 小部件用于向用户提供各种命令。这些命令包含在Menubutton中。 |
10 | Message 小部件用于显示用于接受用户输入值的多行文本字段。 |
11 | Radiobutton Radiobutton部件用于将多个选项显示为单选按钮。用户一次只能选择一个选项。 |
12 | Scale Scale部件用于提供滑块部件。 |
13 | Scrollbar Scrollbar部件用于为各种部件添加滚动功能,如列表框。 |
14 | Text Text部件用于显示多行文本。 |
15 | Toplevel Toplevel部件用于提供一个独立的窗口容器。 |
16 | Spinbox Spinbox组件是标准的Tkinter Entry组件的一种变体,它可用于从固定数量的值中进行选择。 |
17 | PanedWindow PanedWindow是一个容器组件,可以包含任意数量的窗格,水平或垂直排列。 |
18 | LabelFrame LabelFrame是一个简单的容器组件。其主要目的是作为复杂窗口布局的间隔或容器。 |
19 | tkMessageBox 此模块用于在应用程序中显示消息框。 |
让我们详细研究这些小部件。
标准属性
让我们来看看如何指定一些常用的属性,比如大小、颜色和字体。
让我们简要地学习它们 –
几何管理
所有Tkinter小部件都有访问特定的几何管理方法,其目的是在父小部件区域内组织小部件。Tkinter暴露了以下几何管理器类:pack、grid和place。
- pack() 方法- 这个几何管理器在将小部件放置在父小部件之前,将它们组织成块。
-
grid() 方法- 这个几何管理器在父小部件中以类似表格的结构组织小部件。
-
place() 方法- 这个几何管理器通过将小部件放置在父小部件中的特定位置来组织小部件。
让我们简要地学习几何管理方法 –
SimpleDialog
tkinter包中的simpledialog模块包括一个对话框类和通过模态对话框接受用户输入的便利函数。它由一个标签、一个输入小部件和两个按钮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()
将会产生以下 输出 −
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()
它将产生以下输出
文件对话框模块
Tkinter包中的文件对话框模块包括一个FileDialog类。它还定义了方便的函数,使用户能够执行打开文件、保存文件和打开目录的操作。
- filedialog.asksaveasfilename()
- filedialog.asksaveasfile()
- filedialog.askopenfilename()
- filedialog.askopenfile()
- filedialog.askdirectory()
- filedialog.askopenfilenames()
- filedialog.askopenfiles()
askopenfile
该函数允许用户从文件系统中选择所需的文件。文件对话框窗口有打开和取消按钮。当点击确定时,返回文件名及其路径;如果点击取消,则返回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()
它将产生以下 输出 −
颜色选择器
在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模块中的新小部件有:
- Notebook - 此小部件管理一组“选项卡”,您可以在其间切换,从而改变当前显示的窗口。
-
ProgressBar - 通过使用动画显示进度或加载过程的小部件。
-
Separator - 用于使用分隔线将不同的小部件分开。
-
TreeView - 用于将项目以树状层次结构进行分组的小部件。每个项目都有一个文本标签,一个可选图像和一个可选的数据值列表。
-
ComboBox - 用于创建下拉选项列表,用户可以从中选择一个选项。
-
Sizegrip - 在屏幕右下角创建一个小手柄,可用于调整窗口大小。
ComboBox小部件
Python ttk ComboBox提供了一个下拉选项列表,并逐个显示它们。它是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的方向,可以是垂直或水平。
-
Length - 通过接受整数值来定义ProgressBar的宽度。
-
Mode - 此参数有两个选项,确定和不确定。
示例
下面的代码创建了一个ProgressBar,并与三个不同的函数链接到三个按钮。
第一个函数通过20增加ProgressBar中的”value”或”progress”。这是通过step()函数完成的,它接受一个整数值来改变进度值。(默认值为1.0)
第二个函数通过20减少ProgressBar中的”value”或”progress”。
第三个函数将当前进度级别打印出来。
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模块有一个新的有用小部件,叫做笔记本。它是一组包含许多小部件作为子元素的容器(例如帧)。
每个“标签”或“窗口”都有一个与之关联的标签ID,用于确定要切换到哪个标签。
您可以像在普通文本编辑器上一样在这些容器之间切换。
语法
notebook = ttk.Notebook(master, *options)
示例
在这个示例中,我们以两种不同的方式向Notebook小部件添加3个窗口。第一种方法使用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()
这将产生以下 输出 −
树形视图
树形视图小部件用于以表格或层次结构方式显示项目。它支持创建行和列,允许项目具有子项,从而形成层次结构格式。
语法
tree = ttk.Treeview(container, **options)
选项
序号 | 选项和描述 |
---|---|
1 | columns 列名列表 |
2 | displaycolumns 列标识符列表(可以是符号或整数索引),指定显示的数据列及其顺序,或字符串“#all”。 |
3 | height 可见行数。 |
4 | padding 小部件的内部填充。可以是整数或包含4个值的列表。 |
5 | selectmode 可选值为“extended”、“browse”或“none”。如果设置为“extended”(默认),可以选择多个项目。如果是“browse”,一次只能选择一个项目。如果是“none”,用户无法更改选择。 |
6 | show 包含零个或多个以下值的列表,指定要显示的树的元素。默认值为“树标题”,即显示所有元素。 |
示例
在这个例子中,我们将创建一个简单的Treeview ttk小部件,并将一些数据填充到其中。我们已经在一个列表中存储了一些数据,这些数据将在我们的read_data()函数中被读取和添加到Treeview小部件中。
我们首先需要定义一个列名的列表/元组。我们省略了”Name”列,因为已经存在一个带有空名称的(默认)列。
然后,我们将该列表/元组赋值给Treeview中的columns选项,然后定义”headings”,其中列是实际列,而heading只是在小部件显示时出现的列的标题。我们给每一列都命名。”#0″是默认列的名称。
tree.insert()函数有以下参数:
- Parent - 如果没有,则保留为空字符串。
-
Position - 我们要添加新项目的位置。要追加,请使用tk.END。
-
Iid - 这是后来用来跟踪该项的项目ID。
-
Text - 我们将把列表中的第一个值(名称)赋给它。
我们将传递给其他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 = 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.HORIZONTAL,分别用于垂直和水平分隔符。
示例
这里我们创建了两个Label控件,并在它们之间创建了一个水平分隔符。
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()
它将产生以下 输出 −