Python - GUI程式設計



Python 提供了多種開發圖形使用者介面 (GUI) 的選項。最重要的特性如下所示。

  • Tkinter − Tkinter 是 Python 與 Python 自帶的 Tk GUI 工具包的介面。我們將在本章中介紹此選項。

  • wxPython − 這是一個用於 wxWidgets GUI 工具包的開源 Python 介面。您可以在此處找到關於 WxPython 的完整教程 這裡

  • PyQt − 這也是一個用於流行的跨平臺 Qt GUI 庫的 Python 介面。TutorialsPoint 有一個關於 PyQt5 的非常好的教程 這裡

  • PyGTK − PyGTK 是一組用 Python 和 C 編寫的 GTK + GUI 庫的包裝器。完整的 PyGTK 教程可在 這裡找到。

  • PySimpleGUI − PySimpleGUI 是一個開源的跨平臺 Python GUI 庫。它旨在為基於 Python 的 Tkinter、PySide 和 WxPython 工具包建立桌面 GUI 提供統一的 API。有關詳細的 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 Programming

當程式變得更復雜時,使用面向物件程式設計方法可以使程式碼更有條理。

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)

Frame 部件用作容器部件來組織其他部件。

6 標籤 (Label)

Label 部件用於為其他部件提供單行標題。它還可以包含影像。

7 列表框 (Listbox)

Listbox 部件用於向用戶提供選項列表。

8 選單按鈕 (Menubutton)

Menubutton 部件用於在應用程式中顯示選單。

9 選單 (Menu)

Menu 部件用於向用戶提供各種命令。這些命令包含在 Menubutton 中。

10 訊息 (Message)

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)

標籤框架是一個簡單的容器部件。其主要目的是充當複雜窗口布局的間隔符或容器。

19 tkMessageBox

此模組用於在應用程式中顯示訊息框。

讓我們詳細研究這些部件。

標準屬性

讓我們看看如何指定一些常見屬性,例如大小、顏色和字型。

讓我們簡要地研究一下它們:

幾何管理

所有 Tkinter 部件都可以訪問特定的幾何管理方法,這些方法的目的是在父部件區域內組織部件。Tkinter 公開了以下幾何管理器類:pack、grid 和 place。

  • pack() 方法 − 此幾何管理器在將部件放置到父部件之前,將部件組織成塊。

  • grid() 方法 − 此幾何管理器以表格狀結構在父部件中組織部件。

  • place() 方法 − 此幾何管理器透過將部件放置在父部件中的特定位置來組織部件。

讓我們簡要地研究一下幾何管理方法:

簡單對話方塊 (SimpleDialog)

tkinter 包中的 simpledialog 模組包括一個對話方塊類和便捷函式,用於透過模式對話方塊接受使用者輸入。它包含一個標籤、一個輸入部件和兩個按鈕“確定”和“取消”。這些函式是:

  • askfloat(title, prompt, **kw) − 接受浮點數。

  • askinteger(title, prompt, **kw) − 接受整數輸入。

  • askstring(title, prompt, **kw) − 接受使用者的文字輸入。

以上三個函式提供對話方塊,提示使用者輸入所需型別的數值。如果按下“確定”,則返回輸入;如果按下“取消”,則返回 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()

它將產生以下輸出

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

它將產生以下輸出

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

Tkinter 包中的 filedialog 模組包括一個 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()

它將產生以下輸出

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

它將產生以下輸出

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

新的部件提供了跨平臺更好的外觀和感覺;但是,替換部件並不完全相容。主要區別在於,諸如“fg”、“bg”以及其他與部件樣式相關的部件選項不再存在於 Ttk 部件中。改為使用 ttk.Style 類以獲得改進的樣式效果。

ttk 模組中的新部件是:

  • 筆記本 (Notebook) − 此部件管理一系列“選項卡”,您可以在這些選項卡之間切換,從而更改當前顯示的視窗。

  • 進度條 (ProgressBar) − 此部件用於透過使用動畫顯示進度或載入過程。

  • 分隔符 (Separator) − 使用分隔線分隔不同的部件。

  • 樹形檢視 (Treeview) − 此部件用於將專案組合成樹狀層次結構。每個專案都有一個文字標籤、一個可選影像和一個可選資料值列表。

  • 組合框 (ComboBox) − 用於建立一個下拉選項列表,使用者可以從中選擇一個選項。

  • 大小調整手柄 (Sizegrip) − 在螢幕的右下角建立一個小的控制代碼,可用於調整視窗大小。

組合框部件 (Combobox Widget)

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

它將產生以下輸出

Combobox Widget

進度條 (Progressbar)

ttk ProgressBar 部件及其如何用於建立載入螢幕或顯示當前任務的進度。

語法

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

引數

  • 父容器 (Parent) − 將放置 ProgressBar 的容器,例如 root 或 Tkinter 框架。

  • 方向 (Orient) − 定義 ProgressBar 的方向,可以是垂直或水平。

  • 長度 (Length) − 透過採用整數值來定義 ProgressBar 的寬度。

  • 模式 (Mode) − 此引數有兩個選項:確定性 (determinate) 和不確定性 (indeterminate)。

示例

下面給出的程式碼建立了一個帶有三個按鈕的進度條,這些按鈕連結到三個不同的函式。

第一個函式將進度條中的“值”或“進度”遞增 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()

它將產生以下輸出

Progressbar

筆記本 (Notebook)

Tkinter ttk 模組有一個新的有用部件,稱為 Notebook。它是一組容器(例如框架),其中包含許多部件作為子部件。

每個“選項卡”或“視窗”都有一個與其關聯的選項卡 ID,用於確定要切換到哪個選項卡。

您可以像在普通文字編輯器中一樣在這些容器之間切換。

語法

notebook = ttk.Notebook(master, *options)

示例

本例將透過兩種不同的方法向我們的 Notebook 小部件新增 3 個視窗。第一種方法使用 `add()` 函式,它簡單地將新標籤新增到末尾。另一種方法是 `insert()` 函式,它可以用於將標籤新增到特定位置。

`add()` 函式接受一個必需引數,即要新增的容器小部件,其餘引數是可選引數,例如 text(顯示為標籤標題的文字)、image 和 compound。

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

它將產生以下輸出

Notebook

樹狀檢視 (Treeview)

Treeview 小部件用於以表格或分層方式顯示專案。它支援建立專案的行和列等功能,並允許專案具有子項,從而形成分層格式。

語法

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

包含零個或多個以下值的列表,指定要顯示的樹的哪些元素。預設值為“tree headings”,即顯示所有元素。

示例

在本例中,我們將建立一個簡單的 Treeview ttk 小部件,並向其中填充一些資料。我們已經將一些資料儲存在一個列表中,這些資料將在我們的 `read_data()` 函式中讀取並新增到 Treeview 小部件。

我們首先需要定義一個列名稱的列表/元組。我們省略了“Name”列,因為已經存在一個名稱為空的(預設)列。

然後,我們將該列表/元組賦給 Treeview 中的 columns 選項,然後定義“headings”,其中 column 是實際的列,而 heading 只是顯示小部件時顯示的列標題。我們為每個列指定一個名稱。“#0”是預設列的名稱。

`tree.insert()` 函式具有以下引數:

  • Parent − 如果沒有父項,則留空字串。

  • Position − 我們想要新增新專案的位置。要追加,請使用 `tk.END`。

  • Iid − 專案 ID,用於稍後跟蹤相關的專案。

  • Text − 我們將為其分配列表中的第一個值(名稱)。

我們將把從列表中獲得的其他兩個值作為 Value 傳遞。

完整程式碼

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

它將產生以下輸出

Treeview

尺寸控制柄 (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.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()

它將產生以下輸出

Separator
廣告