1. 程式人生 > >Python圖形介面之Tkinter簡單用法

Python圖形介面之Tkinter簡單用法

前言

Tkinter 是 Python 標準的 GUI 工具包包含在Python標準安裝包中,所以無需再另外安裝。我個人覺得使用 Tkinter 建立 GUI 介面相比於 PyQt 來說程式碼更加簡潔,不過看個人愛好吧,只要熟悉這些 GUI 工具包過後使用起來都不算難,關鍵是找到自己更喜歡的一種。

正文

首先通過建立一個簡單的應用來逐步說明 Tkinter 的用法,示例來源於《Python 基礎教程》。該應該是一個簡單的文字編輯器,可以開啟檔案然後進行編輯,最後儲存檔案。

先來看看 UI 介面:

原始碼:

from tkinter import *
from tkinter.scrolledtext import ScrolledText

def load():
	with open(filename.get()) as file:
		contents.delete('1.0',END)
		contents.insert(INSERT,file.read())

def save():
	with open(filename.get()) as file:
		file.write(contents.get('1.0',END))

top = Tk()
top.title("Simple Editor")

contents = ScrolledText()
contents.pack(side = BOTTOM,expand = True,fill = BOTH)

filename = Entry()
filename.pack(side = LEFT,expand = True,fill = X)

Button(text = "Open",command = load).pack(side = LEFT)
Button(text = "Save",command = save).pack(side = LEFT)

mainloop()

程式碼解讀

首先,要使用 Tkinter,就得先匯入模組吧,這裡將模組所有內容都匯入了:

from tkinter import *

此外,編輯文字內容,需要用到一個編輯框,這裡使用ScrolledText,該控制元件其實就是對應 Qt 裡面的 QTextEdit,是同樣的東西,只是叫法不同罷了。所以這裡再匯入該控制元件:

from tkinter.scrolledtext import ScrolledText

要建立 GUI,需要先建立一個將充當主視窗的頂級控制元件,為此,需要例項化一個 Tk 物件。如下:

top = Tk()

接著,可以給該建立設定一個標題:

top.title("Simple Editor")

建立完頂層視窗後,我們將呼叫 函式mainloop()以進入 Tkinter 主事件迴圈中。這就和 Qt 裡面的 app.exec() 一樣一樣兒的。

緊接著建立ScrolledText物件,這是一個文字編輯控制元件,然後 pack 是一個佈局管理器,用於調整控制元件的位置,必須要使用佈局管理器,要不然控制元件將不可見。

pack 中的引數,side表示停靠的方位,相對於主視窗的位置,可設定成 LEFT、RIGHT、TOP 或 BOTTOM,expand表示是否填滿分配給它的空間,fill表示要哪個座標,可以是 X 或者 Y,BOTH 表示 x 和 Y 均填充滿父視窗。

Entry()是一個輸入框,用於輸入需要開啟的檔名,該控制元件對應 Qt 裡面的 QLineEdit。

最後是兩個按鈕的建立,這裡是直接使用控制元件的建構函式來配置控制元件。
如果分解開來可以這樣寫:

btn = Button()
btn['text'] = "Open"
btn.pack(side = LEFT)
btn['command'] = load

注意這裡的 command 屬性,這是新增按鈕點選的行為,點選按鈕時會呼叫 load 函式。

也可以不用分別給屬性賦值,而使用方法 config 同時設定多個屬性,如下:

btn.config(text = 'Open',command = load)

最後再來看看兩個函式。
首先是 load 函式,這是用於開啟檔案的,通過 with open 來開啟檔案,將檔案內容讀取出來顯示到文字框中。
contents.delete(‘1.0’,END) 是用於清空文字框中的內容,這裡的1.0用來指定第一行和第0個字元(即第一個字元前面),使用 END 來指定文字末尾。
清空之後開始插入文字:contents.insert(INSERT,file.read()),file.read()是將檔案中的所有內容讀取出來。

同樣 save() 函式就是用於儲存文字框中的內容到檔案中去,這裡就不細說了。

ok,該介面很簡單,基本就這些內容,如果要快速瞭解 pack 可用的屬性,可以直接在命令列輸入:help(Pack.config)進行檢視。

事件處理

通過上面的示例知道,可以通過屬性 command 給按鈕置頂動作,這是一種特殊的事件處理,但 Tkinter 還提供了更通用的事件處理機制:方法 bind,要讓控制元件對特定的事件進行處理,可對其呼叫方法 bind,並指定時間的名稱和要使用的函式。示例如下:

from tkinter import *
top = Tk()
def callback(event):
    print(event.x,event.y)
 
top.bind('<Button-1>',callback)

mainloop()

其中是使用滑鼠左按鈕單擊的事件名稱,將事件關聯到 callback 函式,當用戶在視窗中單擊時,將呼叫這個函式,向函式傳遞一個 event 物件,這個物件包含的屬性隨事件型別而異。將滑鼠點選的座標位置打印出來。

還有很多其他型別的事件,完整的清單可以使用下面的命令來獲取:help(Tk.bind)

本文只是簡單的介紹了 Tkinter 的使用,更多的用法還要通過幫助文件來進行深入瞭解。