在Python的GUI開(kāi)發(fā)領(lǐng)域,是一款極具特色的庫(kù)。它整合了多種流行的GUI框架(如QT、Tkinter、和Remi等)的優(yōu)勢(shì),提供了簡(jiǎn)潔統(tǒng)一的API,讓開(kāi)發(fā)者能夠輕松快速地構(gòu)建出各種圖形用戶界面,無(wú)論是初學(xué)者想要入門GUI編程,還是有經(jīng)驗(yàn)的開(kāi)發(fā)者希望快速實(shí)現(xiàn)簡(jiǎn)單界面以驗(yàn)證想法,都能很好地滿足需求,大大降低了GUI開(kāi)發(fā)的門檻和復(fù)雜度。
一、安裝與導(dǎo)入(一)安裝
使用 pip 命令就能便捷地安裝庫(kù),執(zhí)行以下安裝命令:
pip?install?PySimpleGUI
(二)導(dǎo)入
在Python代碼中,通常按照以下方式導(dǎo)入模塊,根據(jù)不同的使用場(chǎng)景和需求,也可以選擇導(dǎo)入具體的子模塊或類等,例如:
import?PySimpleGUI?as?sg
二、核心組件與基本架構(gòu)(一)窗口(Window)
Window 類是應(yīng)用程序中界面展示的核心,它相當(dāng)于一個(gè)容器,用于承載各種GUI組件,如按鈕、文本框、標(biāo)簽等,定義了整個(gè)界面的布局和外觀,并且負(fù)責(zé)處理用戶與界面之間的交互事件,是構(gòu)建應(yīng)用程序可視化部分的關(guān)鍵所在。
例如,創(chuàng)建一個(gè)最簡(jiǎn)單的窗口,僅顯示一個(gè)關(guān)閉按鈕:
import?PySimpleGUI?as?sg
layout?=?[[sg.Button('關(guān)閉窗口')]]
window?=?sg.Window('我的第一個(gè)PySimpleGUI窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'關(guān)閉窗口':
????????break
window.close()
上述代碼中,首先定義了一個(gè)布局 layout,它是一個(gè)嵌套的列表結(jié)構(gòu),里面包含了要在窗口中顯示的組件(這里只有一個(gè) Button 按鈕)。然后通過(guò) sg.Window 創(chuàng)建了窗口對(duì)象,傳入窗口標(biāo)題和布局信息。接著進(jìn)入一個(gè)循環(huán),通過(guò) window.read() 方法不斷讀取用戶的操作事件以及對(duì)應(yīng)的輸入值,當(dāng)檢測(cè)到窗口關(guān)閉事件或者按鈕點(diǎn)擊事件(這里按鈕點(diǎn)擊等同于關(guān)閉窗口操作)時(shí),就跳出循環(huán),最后使用 window.close() 關(guān)閉窗口,整個(gè)過(guò)程實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的可交互窗口展示與關(guān)閉的功能。
(二)布局(Layout)
布局在中通過(guò)特定的列表結(jié)構(gòu)來(lái)表示,將各種組件按照一定的排列方式組合在一起,形成窗口內(nèi)的界面布局。常見(jiàn)的布局方式有線性布局(通過(guò)簡(jiǎn)單的列表嵌套實(shí)現(xiàn)組件的順序排列)、表格布局(類似表格形式安排組件位置)等,并且可以靈活嵌套來(lái)構(gòu)建復(fù)雜的界面結(jié)構(gòu)。
例如,使用線性布局創(chuàng)建一個(gè)包含文本標(biāo)簽和輸入文本框的簡(jiǎn)單界面:
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Text('請(qǐng)輸入你的名字:')],
????[sg.InputText()],
????[sg.Button('提交')]
]
window?=?sg.Window('信息輸入窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'提交':
????????if?event?==?'提交':
????????????print(f"你輸入的名字是:?{values[0]}")
????????break
window.close()
在這個(gè)示例中,layout 布局是一個(gè)包含三個(gè)子列表的列表,第一個(gè)子列表放置一個(gè) Text 文本標(biāo)簽用于提示,第二個(gè)子列表放置一個(gè) 文本輸入框用于用戶輸入內(nèi)容,第三個(gè)子列表放置一個(gè) Button 按鈕用于提交操作。這樣按照線性順序排列組件構(gòu)建出了簡(jiǎn)單的信息輸入界面布局,然后將其應(yīng)用到窗口上,通過(guò)循環(huán)處理事件來(lái)獲取用戶輸入并做出相應(yīng)反應(yīng),比如在用戶點(diǎn)擊提交按鈕后打印出輸入的名字信息。
(三)主題(Theme)
提供了多種預(yù)設(shè)的主題,通過(guò)設(shè)置主題可以快速改變整個(gè)應(yīng)用程序界面的外觀風(fēng)格,包括組件的顏色、字體等元素,讓界面具有不同的視覺(jué)效果,而且無(wú)需對(duì)每個(gè)組件單獨(dú)進(jìn)行樣式調(diào)整,十分方便快捷。
例如,使用不同的主題創(chuàng)建窗口并展示效果:
import?PySimpleGUI?as?sg
sg.theme('DarkBlue3')??#?設(shè)置主題為DarkBlue3
layout?=?[
????[sg.Text('這是使用主題后的示例')],
????[sg.Button('確定')]
]
window?=?sg.Window('主題示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'確定':
????????break
window.close()
sg.theme('LightGray1')??#?切換主題為L(zhǎng)ightGray1
layout?=?[
????[sg.Text('再次展示不同主題效果')],
????[sg.Button('確定')]
]
window?=?sg.Window('另一個(gè)主題示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'確定':
????????break
window.close()
在上述示例中,首先通過(guò) sg.theme('') 設(shè)置了一種深色系的主題,創(chuàng)建相應(yīng)的窗口展示包含文本和按鈕的界面,然后又通過(guò) sg.theme('') 切換到淺色系主題,再次創(chuàng)建窗口展示同樣結(jié)構(gòu)的界面,通過(guò)對(duì)比可以直觀看到不同主題對(duì)界面外觀風(fēng)格的改變效果,開(kāi)發(fā)者可以根據(jù)應(yīng)用的類型和用戶喜好等因素選擇合適的主題。
三、常用組件與交互功能(一)按鈕(Button)
Button 是中用于創(chuàng)建可點(diǎn)擊按鈕的組件,當(dāng)用戶點(diǎn)擊按鈕時(shí)會(huì)觸發(fā)相應(yīng)的事件,常用于執(zhí)行各種操作,比如提交表單、打開(kāi)新窗口、執(zhí)行特定功能等,按鈕上可以顯示清晰的文本內(nèi)容來(lái)傳達(dá)其功能含義,方便用戶進(jìn)行交互操作。
例如,創(chuàng)建一個(gè)點(diǎn)擊后在控制臺(tái)打印消息的按鈕,并設(shè)置按鈕的大小和樣式:
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Button('點(diǎn)擊我',?size=(10,?2),?button_color=('white',?'green'))]
]
window?=?sg.Window('按鈕示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'點(diǎn)擊我':
????????if?event?==?'點(diǎn)擊我':
????????????print("你點(diǎn)擊了按鈕!")
????????break
window.close()
在上述示例中,創(chuàng)建了一個(gè) Button 按鈕對(duì)象,通過(guò) size 參數(shù)設(shè)置了按鈕的大?。▽挾葹?0個(gè)字符單位,高度為2個(gè)字符單位),通過(guò) 參數(shù)設(shè)置了按鈕的前景色(文字顏色)為白色,背景色為綠色。然后將按鈕添加到布局中構(gòu)建窗口,在事件處理循環(huán)中,當(dāng)檢測(cè)到按鈕被點(diǎn)擊時(shí),就在控制臺(tái)打印出相應(yīng)的消息,實(shí)現(xiàn)了簡(jiǎn)單的交互邏輯。
(二)標(biāo)簽(Text)
Text 用于在界面上顯示文本信息,可作為提示性文字展示應(yīng)用的功能說(shuō)明、標(biāo)題等內(nèi)容,也能用于顯示固定不變的文本數(shù)據(jù),并且可以通過(guò)相關(guān)參數(shù)對(duì)文本的格式(如字體大小、顏色、對(duì)齊方式等)進(jìn)行一定程度的設(shè)置,使文本展示更加清晰、美觀,便于用戶理解界面?zhèn)鬟_(dá)的信息。
例如,創(chuàng)建一個(gè)顯示帶有特定格式文本的標(biāo)簽,并設(shè)置文本的顏色、字體大小和對(duì)齊方式:
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Text('這是一段示例文本',?text_color='blue',?font=('Arial',?14),?justification='center')]
]
window?=?sg.Window('標(biāo)簽示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED:
????????break
window.close()
在這個(gè)示例中,創(chuàng)建了 Text 標(biāo)簽對(duì)象,通過(guò) 參數(shù)將文本顏色設(shè)置為藍(lán)色,通過(guò) font 參數(shù)設(shè)置字體為 Arial 且大小為14,通過(guò) 參數(shù)設(shè)置文本的對(duì)齊方式為居中對(duì)齊,然后將帶有特定格式文本的標(biāo)簽添加到布局中應(yīng)用到窗口上展示,運(yùn)行代碼后就能看到符合設(shè)定的文本顯示效果了。
(三)文本框()
組件用于創(chuàng)建可輸入文本的區(qū)域,用戶能夠在其中輸入各種文本信息,如用戶名、密碼、留言內(nèi)容等,它還支持一些屬性設(shè)置,比如設(shè)置默認(rèn)提示文本(占位符)、限制輸入的文本長(zhǎng)度、控制是否為密碼輸入模式(隱藏輸入內(nèi)容)等,以滿足不同的文本輸入需求和應(yīng)用場(chǎng)景。
例如,創(chuàng)建一個(gè)用于輸入用戶名的文本框,并設(shè)置占位符提示文本和密碼輸入模式:
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Text('請(qǐng)輸入用戶名:')],
????[sg.InputText(placeholder_text='用戶名',?password_char='*')],
????[sg.Button('登錄')]
]
window?=?sg.Window('登錄示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'登錄':
????????if?event?==?'登錄':
????????????print(f"輸入的用戶名是:?{values[0]}")
????????break
window.close()
在上述示例中,創(chuàng)建 文本框?qū)ο髸r(shí),通過(guò) 參數(shù)設(shè)置了提示用戶輸入用戶名的占位符文本,通過(guò) 參數(shù)將輸入模式設(shè)置為密碼模式(輸入內(nèi)容用 * 替代顯示),然后將文本框與相關(guān)的文本標(biāo)簽、按鈕共同構(gòu)建成登錄界面布局應(yīng)用到窗口上,在事件處理循環(huán)中,當(dāng)用戶點(diǎn)擊登錄按鈕后,會(huì)打印出輸入的用戶名信息(這里只是簡(jiǎn)單打印,實(shí)際可做更多登錄驗(yàn)證等操作)。
(四)事件處理與循環(huán)機(jī)制
通過(guò)一個(gè)循環(huán)結(jié)構(gòu)來(lái)不斷讀取用戶的操作事件以及相應(yīng)的輸入值,根據(jù)不同的事件觸發(fā)對(duì)應(yīng)的處理邏輯,常見(jiàn)的事件包括窗口關(guān)閉事件、按鈕點(diǎn)擊事件、文本框內(nèi)容改變事件等,開(kāi)發(fā)者通過(guò)判斷具體的事件類型來(lái)執(zhí)行相應(yīng)的代碼,實(shí)現(xiàn)各種交互功能和界面的動(dòng)態(tài)響應(yīng)。
例如,創(chuàng)建一個(gè)文本框和一個(gè)按鈕,當(dāng)在文本框中輸入內(nèi)容并點(diǎn)擊按鈕時(shí),在控制臺(tái)打印輸入的內(nèi)容:
import?PySimpleGUI?as?sg
layout?=?[
????[sg.InputText(key='-INPUT-')],
????[sg.Button('打印輸入內(nèi)容')]
]
window?=?sg.Window('事件處理示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'打印輸入內(nèi)容':
????????if?event?==?'打印輸入內(nèi)容':
????????????print(f"你輸入的內(nèi)容是:?{values['-INPUT-']}")
????????break
window.close()
在這個(gè)示例中,定義了 文本框并設(shè)置了一個(gè) key 值(方便在獲取輸入值時(shí)準(zhǔn)確引用),還有一個(gè) Button 按鈕用于觸發(fā)操作。在事件處理循環(huán)中,當(dāng)檢測(cè)到按鈕點(diǎn)擊事件時(shí),通過(guò) values['-INPUT-'] 獲取文本框中輸入的內(nèi)容并打印出來(lái),通過(guò)這樣的事件處理和循環(huán)機(jī)制實(shí)現(xiàn)了簡(jiǎn)單的交互邏輯,根據(jù)用戶的操作做出相應(yīng)的響應(yīng)。
四、高級(jí)功能與拓展應(yīng)用(一)多窗口操作
支持創(chuàng)建多個(gè)窗口并實(shí)現(xiàn)它們之間的交互,比如從一個(gè)主窗口打開(kāi)子窗口,在子窗口中進(jìn)行操作后返回結(jié)果到主窗口,或者在不同窗口之間傳遞數(shù)據(jù)等,通過(guò)合理的窗口管理和事件處理,可以構(gòu)建出相對(duì)復(fù)雜的多窗口應(yīng)用程序架構(gòu)。
例如,創(chuàng)建一個(gè)主窗口和一個(gè)彈出式的子窗口,在子窗口中輸入信息后返回并顯示在主窗口上:
import?PySimpleGUI?as?sg
def?create_subwindow():
????sub_layout?=?[
????????[sg.Text('請(qǐng)?jiān)谧哟翱谳斎雰?nèi)容:')],
????????[sg.InputText(key='-SUB_INPUT-')],
????????[sg.Button('確定'),?sg.Button('取消')]
????]
????return?sg.Window('子窗口',?sub_layout)
layout?=?[
????[sg.Text('主窗口內(nèi)容,等待子窗口輸入:')],
????[sg.Text('',?key='-MAIN_DISPLAY-')],
????[sg.Button('打開(kāi)子窗口')]
]
window?=?sg.Window('主窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED:
????????break
????elif?event?==?'打開(kāi)子窗口':
????????sub_window?=?create_subwindow()
????????while?True:
????????????sub_event,?sub_values?=?sub_window.read()
????????????if?sub_event?==?sg.WINDOW_CLOSED?or?sub_event?==?'取消':
????????????????sub_window.close()
????????????????break
????????????elif?sub_event?==?'確定':
????????????????window['-MAIN_DISPLAY-'].update(f"你在子窗口輸入的內(nèi)容是:?{sub_values['-SUB_INPUT-']}")
????????????????sub_window.close()
????????????????break
window.close()
在上述示例中,首先定義了 函數(shù)用于創(chuàng)建子窗口的布局和對(duì)象,主窗口中有一個(gè)按鈕用于打開(kāi)子窗口。當(dāng)點(diǎn)擊該按鈕后,進(jìn)入子窗口的事件處理循環(huán),在子窗口中可以輸入內(nèi)容并點(diǎn)擊確定或取消按鈕,點(diǎn)擊確定按鈕時(shí),會(huì)將輸入的內(nèi)容更新顯示到主窗口的指定位置,然后關(guān)閉子窗口,通過(guò)這樣的多窗口操作實(shí)現(xiàn)了簡(jiǎn)單的數(shù)據(jù)傳遞和交互功能,可在此基礎(chǔ)上拓展構(gòu)建更復(fù)雜的應(yīng)用場(chǎng)景。
(二)彈出式對(duì)話框
提供了多種類型的彈出式對(duì)話框,如消息對(duì)話框(用于顯示提示信息、警告信息、錯(cuò)誤信息等)、輸入對(duì)話框(用于獲取用戶輸入的特定信息,如文本、數(shù)字等)、文件選擇對(duì)話框(用于選擇文件或文件夾路徑等),方便在應(yīng)用程序中與用戶進(jìn)行更靈活、便捷的交互操作,無(wú)需額外復(fù)雜的界面構(gòu)建就能滿足常見(jiàn)的交互需求。
例如,創(chuàng)建一個(gè)按鈕,點(diǎn)擊后彈出消息對(duì)話框顯示提示信息:
import?PySimpleGUI?as?sg
layout?=?[
????[sg.Button('顯示提示信息')]
]
window?=?sg.Window('對(duì)話框示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED?or?event?==?'顯示提示信息':
????????if?event?==?'顯示提示信息':
????????????sg.popup('這是一條提示信息!')
????????break
window.close()
在這個(gè)示例中,創(chuàng)建了一個(gè)簡(jiǎn)單的窗口布局包含一個(gè)按鈕,當(dāng)點(diǎn)擊按鈕時(shí),通過(guò) sg.popup 方法彈出一個(gè)消息對(duì)話框,顯示相應(yīng)的提示信息,類似地,還可以使用其他類型的對(duì)話框,比如通過(guò) sg. 可以彈出輸入對(duì)話框獲取用戶輸入的文本內(nèi)容等,根據(jù)具體應(yīng)用場(chǎng)景靈活運(yùn)用這些對(duì)話框能提升用戶交互的便捷性。
(三)界面更新與動(dòng)態(tài)效果
可以在運(yùn)行時(shí)動(dòng)態(tài)更新界面上的組件內(nèi)容、狀態(tài)等信息,實(shí)現(xiàn)諸如實(shí)時(shí)顯示數(shù)據(jù)變化、切換界面顯示內(nèi)容、更新按鈕可用性等動(dòng)態(tài)效果,讓應(yīng)用程序的界面更具交互性和實(shí)時(shí)性,通過(guò)修改組件對(duì)應(yīng)的屬性值并刷新窗口顯示來(lái)達(dá)成相應(yīng)的動(dòng)態(tài)展示效果。
例如,創(chuàng)建一個(gè)計(jì)數(shù)器按鈕,每次點(diǎn)擊按鈕時(shí)數(shù)字遞增并顯示在按鈕上:
import?PySimpleGUI?as?sg
count?=?0
layout?=?[
????[sg.Button(f'點(diǎn)擊計(jì)數(shù),當(dāng)前計(jì)數(shù):{count}',?key='-COUNTER-')]
]
window?=?sg.Window('動(dòng)態(tài)效果示例窗口',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED:
????????break
????elif?event?==?'-COUNTER-':
????????count?+=?1
????????window['-COUNTER-'].update(f'點(diǎn)擊計(jì)數(shù),當(dāng)前計(jì)數(shù):{count}')
window.close()
在這個(gè)示例中,首先定義了一個(gè)計(jì)數(shù)器變量 count,初始值為0,創(chuàng)建的按鈕文本初始顯示相應(yīng)的計(jì)數(shù)信息并設(shè)置了 key 值。在事件處理循環(huán)中,當(dāng)按鈕被點(diǎn)擊時(shí),計(jì)數(shù)器變量遞增,然后通過(guò) window['-COUNTER-'].update 方法更新按鈕的文本內(nèi)容,將新的計(jì)數(shù)信息顯示在按鈕上,實(shí)現(xiàn)了按鈕文本隨點(diǎn)擊操作動(dòng)態(tài)更新的效果,展示了界面動(dòng)態(tài)更新的一種簡(jiǎn)單應(yīng)用場(chǎng)景。
五、應(yīng)用場(chǎng)景示例(一)簡(jiǎn)易文本編輯器
可以利用開(kāi)發(fā)一個(gè)簡(jiǎn)單的文本編輯器,具備基本的文本輸入、保存、打開(kāi)等功能,通過(guò)文本框組件用于輸入和顯示文本,配合按鈕組件實(shí)現(xiàn)相應(yīng)的操作觸發(fā),再結(jié)合文件讀寫相關(guān)的Python代碼來(lái)處理文件的保存和打開(kāi)操作。
import?PySimpleGUI?as?sg
import?os
def?save_file(text):
????file_path?=?sg.popup_get_file('保存文件',?save_as=True,?file_types=(("Text?Files",?"*.txt"),))
????if?file_path:
????????with?open(file_path,?'w')?as?file:
????????????file.write(text)
def?open_file():
????file_path?=?sg.popup_get_file('打開(kāi)文件',?file_types=(("Text?Files",?"*.txt"),))
????if?file_path:
????????with?open(file_path,?'r')?as?file:
????????????return?file.read()
????return?""
layout?=?[
????[sg.Multiline(key='-TEXTBOX-',?size=(80,?20))],
????[sg.Button('保存'),?sg.Button('打開(kāi)')]
]
window?=?sg.Window('簡(jiǎn)易文本編輯器',?layout)
while?True:
????event,?values?=?window.read()
????if?event?==?sg.WINDOW_CLOSED:
????????break
????elif?event?==?'保存':
????????save_file(values['-TEXTBOX-'])
????elif?event?==?'打開(kāi)':
????????text?=?open_file()
????????window['-TEXTBOX-'].update(text