Python 简明教程

Python - GUI Programming

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

  1. Tkinter - Tkinter 是 Python 与 Python 附带的 Tk GUI 工具包的接口。我们将在本章中研究此选项。

  2. wxPython - 这是 wxWidgets GUI 工具包的开源 Python 接口。你可以在 here 找到有关 WxPython 的完整教程。

  3. PyQt - 这是另一个流行的跨平台 Qt GUI 库的 Python 接口。TutorialsPoint 在 here 上有一个非常好的 PyQt5 教程。

  4. PyGTK − PyGTK 是一组用 Python 和 C 编写的 GTK+ GUI 库的包装器。可通过 here 获得完整的 PyGTK 教程。

  5. PySimpleGUI − PySimpleGUI 是一个开源、跨平台的 Python GUI 库。它旨在为基于 Python 的 Tkinter、PySide 和 WxPython 工具包创建桌面 GUI 提供统一的 API。要获取详细的 PySimpleGUI 教程,请点击 here

  6. Pygame − Pygame 是一个流行的 Python 库,用于开发视频游戏。它是一个免费、开源、跨平台的 Simple DirectMedia Library (SDL) 封装。要获取有关 Pygame 的综合教程,请 visit 这条链接。

  7. Jython − Jython 是一个针对 Java 的 Python 移植,它使 Python 脚本可以无缝访问本地机器上的 Java 类库 http: //www.jython.org

网上还能找到许多其他可用的接口。

Tkinter Programming

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

tkinter 包包括以下模块 −

  1. Tkinter − Main Tkinter 模块。

  2. tkinter.colorchooser − 对话框,使用户可以选择颜色。

  3. tkinter.commondialog − 此处列出的其他模块中定义的对话框的基本类。

  4. tkinter.filedialog − 常用对话框,允许用户指定要打开或保存的文件。

  5. tkinter.font − 有助于使用字体工作的实用程序。

  6. tkinter.messagebox − 访问标准 Tk 对话框。

  7. tkinter.scrolledtext − 内置有垂直滚动条的文本小部件。

  8. tkinter.simpledialog − 基本对话框和便利函数。

  9. tkinter.ttk − Tk 8.5 中引入的主题小部件集合,为 tkinter 主模块中的许多经典小部件提供了现代替代品。

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

  1. Import the Tkinter module.

  2. 创建 GUI 应用程序主窗口。

  3. 向 GUI 应用程序添加一个或多个上述小部件。

  4. 进入主事件循环,以对用户触发的每个事件采取行动。

Example

# 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 programming

当程序变得更复杂时,使用面向对象编程方法会让代码更具条理。

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

app = App()
app.mainloop()

Tkinter Widgets

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

Tkinter 中当前有 15 种微件。我们以下表的形式介绍这些微件并进行简要说明 -

让我们详细了解这些微件。

Standard Attributes

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

让我们简要地研究一下 -

Geometry Management

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

  1. * The pack() Method* − 此几何管理器在将微件放入父微件之前,以块的形式组织微件。

  2. * The grid() Method* − 此几何管理器在父微件中以表格结构组织微件。

  3. * The place() Method* − 此几何管理器将微件组织到父微件中的特定位置。

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

SimpleDialog

tkinter 包中的 simpledialog 模块包括一个对话框类和通过模式对话框接受用户输入的便捷函数。它包含一个标签、一个小组件和两个按钮(确定和取消)。这些函数如下 -

  1. askfloat(title, prompt, **kw) − 接受浮点数。

  2. askinteger(title, prompt, **kw) − 接受整数输入。

  3. askstring(title, prompt, **kw) − 接受用户输入的文本。

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

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

它将生成以下 output

simpledialog

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

它将生成以下 output

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

它将生成以下 output

askstring

The FileDialog Module

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

  1. filedialog.asksaveasfilename()

  2. filedialog.asksaveasfile()

  3. filedialog.askopenfilename()

  4. filedialog.askopenfile()

  5. filedialog.askdirectory()

  6. filedialog.askopenfilenames()

  7. filedialog.askopenfiles()

askopenfile

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

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

它将生成以下 output

askopenfile

ColorChooser

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

它将生成以下 output

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

ttk module

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。

新的小部件在各个平台上带来更好的外观和使用体验;不过,替换的小部件并不完全兼容。主要区别在于小部件选项(如“fg”、“bg”和与小部件样式相关的其他选项)不再存在于 Ttk 小部件中。相反,使用 ttk.Style 类以获得改进的样式效果。

ttk 模块中的新小部件有−

  1. Notebook − 此小部件管理一系列“选项卡”,您可在其之间切换,从而更改当前显示的窗口。

  2. ProgressBar − 此小部件用于通过动画显示进度或加载进程。

  3. Separator − 用于通过分隔线分隔不同的部件。

  4. Treeview − 此小部件用于以树形层级分组项目。每个项目都有文本标签、可选图像和可选的数据值列表。

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

  6. Sizegrip − 在屏幕右下角创建一个小手柄,用于调整窗口大小。

Combobox Widget

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

Syntax

from tkinter import ttk

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

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

Example

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

它将生成以下 output

combobox widget

Progressbar

ttk ProgressBar 小部件及其如何用于创建加载屏幕或显示当前任务的进度。

Syntax

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

Parameters

  1. Parent − 放置 ProgressBar 的容器,例如根或 Tkinter 框架。

  2. Orient − 定义进度条的方向,可以是垂直的或水平的。

  3. Length − 通过输入一个整数值来定义进度条的宽度。

  4. Mode − 此参数有两个选项,确定的和不确定的。

Example

下面给出的代码创建一个具有三个按钮的进度条,这些按钮链接到三个不同的函数。

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

它将生成以下 output

Progressbar

Notebook

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

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

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

Syntax

notebook = ttk.Notebook(master, *options)

Example

在此示例中,以两种不同的方式将 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()

它将生成以下 output

notebook

Treeview

Treeview 小部件用于以表格或层次结构方式显示项目。它支持诸如为项目创建行和列以及允许项目也有子项的功能,从而形成层次结构。

Syntax

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

Options

Example

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

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

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

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

  1. Parent − 如果没有,则将其留为空字符串。

  2. Position - 我们想要添加新项目的位置。要追加内容,请使用 tk.END

  3. Iid - 这是之后用来跟踪所讨论项目的是项 ID。

  4. Text - 我们将向其中分配列表中的第一个值(名称)。

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

The Complete Code

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

它将生成以下 output

treeview

Sizegrip

Sizegrip 小组件基本上是一个小箭头式控件,通常放置在屏幕的右下角。将 Sizegrip 拖动到屏幕上也能调整其所连接容器的大小。

Syntax

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

Example

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

它将生成以下 output

sizegrip

Separator

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

Syntax

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

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

Example

这里我们创建了两个 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()

它将生成以下 output

separator