丟棄 Tkinter!幾行代碼快速生成漂亮 GUI!

文 |?閑歡
來(lái)源:Python 技術(shù)「ID: pythonall」

Python 的 GUI 框架并不少,其中 Tkinter,wxPython,Qt 和 Kivy 是幾種比較主流的框架。此外,還有不少在上述框架基礎(chǔ)上封裝的簡(jiǎn)化框架,例如 EasyGUI,PyGUI 和 Pyforms 等。
但問(wèn)題在于,對(duì)于初學(xué)者而言,即使是最簡(jiǎn)單的主流框架,他們也無(wú)從下手;就算選擇封裝過(guò)的(簡(jiǎn)化)框架,但仍難以甚至無(wú)法創(chuàng)建自定義 GUI 布局。即便學(xué)會(huì)了某種(簡(jiǎn)化)框架,也需要編寫連篇累牘的代碼。
PySimpleGUI 嘗試解決上述 GUI 難題,它提供了一種簡(jiǎn)單明了、易于理解、方便自定義的 GUI 接口。它誕生于2018年,設(shè)計(jì)宗旨是 “Simplicity is the ultimate sophistication” (簡(jiǎn)單即美)。
PySimpleGUI 包含了絕大多數(shù)原本需要用戶界面構(gòu)建編寫的函數(shù),不僅如此,它還具有 Auto-packer 技術(shù),可以自動(dòng)創(chuàng)建界面,使用者不需要像 tkinter 那樣使用布局管理器。
安裝
和其他的模塊一樣,直接使用 pip 安裝即可:
pip install PySimpleGUI
使用步驟
一般使用 PySimpleGUI 都有固定套路,只要我們記住這個(gè)套路,其實(shí)就是使用 PySimpleGUI 的步驟,就能很容易地使用 PySimpleGUI 創(chuàng)建 GUI。
1.import 庫(kù) 2.創(chuàng)建 layout UI 布局 3.window 窗口顯示 4.Event loop 事件循環(huán),用戶持續(xù)交互 5.close 關(guān)閉窗口
下面詳細(xì)講解一下這些步驟。
import 庫(kù)
?import?PySimpleGUI?as?sg
這個(gè)是 PySimpleGUI 官方推薦的寫法。
創(chuàng)建 layout 布局
這里的 layout 布局,其實(shí)就是畫(huà)一些小部件,這些小部件就是你最終界面的一些元素組成,例如按鈕、復(fù)選框、文本框等。
layout?=?[
????[sg.Text('一句話概括Python')],
????[sg.Input(key='-INPUT-')],
????[sg.Button('確認(rèn)'),?sg.Button('取消')]?
]
我們上面代碼中就包含標(biāo)簽、文本輸入框、確認(rèn)和取消按鈕。
需要注意的是,PySimpleGUI 自動(dòng)按行布局,所以我們需要把對(duì)應(yīng)行中的所有部件放到一個(gè)列表中,如上“確認(rèn)”與“取消”按鈕放在一個(gè)列表中,兩個(gè)文本部件放到一個(gè)列表中,最后形成一個(gè)嵌套列表layout。
window 窗口顯示
定義好 layout 之后,我們只需要將其放在 window 窗口中就行了:
window?=?sg.Window('PySimpleGUI?Demo',?layout)
循環(huán)監(jiān)聽(tīng)事件
我們定義了一個(gè)窗體,需要監(jiān)聽(tīng)用戶在我們的窗體界面上的輸入操作來(lái)給與不同的事件處理。PySimpleGUI 給出的方案是通過(guò)構(gòu)建一個(gè)循環(huán)來(lái)監(jiān)聽(tīng)用戶的輸入:
while?True:
???event,?values?=?window.read()
???if?event?in?(None,?'取消'):
???????break
這里監(jiān)聽(tīng)到 None(右上角的關(guān)閉)和“取消”按鈕事件,就退出循環(huán)。
關(guān)閉窗口
關(guān)閉窗口就一行代碼:
window.close()
完整代碼
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Text('一句話概括Python')],
????[sg.Input(key='-INPUT-')],
????[sg.Button('確認(rèn)'),?sg.Button('取消')]
]
window?=?sg.Window('PySimpleGUI?Demo',?layout)
while?True:
????event,?values?=?window.read()
????print(event)
????print(values)
????if?event?in?(None,?'取消'):
????????break
window.close()
這里我將監(jiān)聽(tīng)到的事件和獲取到的值打印到控制臺(tái)。
運(yùn)行效果截圖:

當(dāng)我輸入文本,然后點(diǎn)擊“確定”按鈕時(shí),控制臺(tái)會(huì)打印如下內(nèi)容:
確認(rèn)
{'-INPUT-':?'人生苦短,我愛(ài)Python'}
傳遞值
PySimpleGUI 傳遞值的方式不同于其他的 GUI,它是通過(guò)相同關(guān)鍵詞進(jìn)行綁定的。
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Text('一句話概括Python')],
????[sg.Input(key='-INPUT111-')],
????[sg.Input(key='-INPUT222-')],
????[sg.Button('確認(rèn)'),?sg.Button('取消')],
????[sg.Text('輸出:'),?sg.Text(key='-OUTPUT-')]
]
window?=?sg.Window('PySimpleGUI?Demo',?layout)
while?True:
????event,?values?=?window.read()
????print(event)
????print(values)
????if?event?in?(None,?'取消'):
????????break
????else:
????????window['-OUTPUT-'].update(values['-INPUT222-'])
window.close()
我們?cè)贁U(kuò)展一下上面的例子,我界面上有兩個(gè)輸入框,然后底下有一個(gè)輸出行來(lái)顯示輸入框輸入的內(nèi)容。
運(yùn)行之后的界面如下:

當(dāng)我在兩個(gè)輸入框分別輸入內(nèi)容時(shí),只有第二個(gè)輸入框的內(nèi)容會(huì)顯示在底下,這是因?yàn)槲覍⒌诙€(gè)輸入框的 key('-INPUT222-') 綁定在了底下的輸出行中。
切換主題
PySimpleGUI 提供了很多其他主題供我們選擇:

你可以通過(guò)如下代碼來(lái)查看主題:
sg.preview_all_look_and_feel_themes()
切換主題的方式為:
sg.change_look_and_feel("GreenMono")
總結(jié)
本文給大家介紹了一款非常簡(jiǎn)單實(shí)用的 GUI 神器,無(wú)需堆積如山的代碼就可以打造一款簡(jiǎn)潔的 GUI,對(duì)初學(xué)者非常友好,也是快速生成 GUI 界面的不二選擇。
記得點(diǎn)贊 轉(zhuǎn)發(fā) 在看呀~留言說(shuō)說(shuō)你用過(guò)或者聽(tīng)過(guò)的好用的python包,我來(lái)寫使用感受和教程~
近期文章:
【干貨+贈(zèng)書(shū)】為什么我們現(xiàn)在不再需要?dú)⒍拒浖耍?/span>
【干貨】盤點(diǎn)2021最佳數(shù)據(jù)可視化作品
【干貨】如何打造一個(gè)能自動(dòng)回復(fù)的釘釘機(jī)器人
如何找到我:
