用PySimpleGUI輕松為程序和腳本添加GUI
譯文【51CTO.com快譯】很少有人通過像雙擊.exe文件那樣雙擊.py文件來運(yùn)行Python程序。普通用戶(非程序員)雙擊.exe文件時(shí),認(rèn)為應(yīng)該彈出可與之交互的窗口。雖然可以使用tkinter借助標(biāo)準(zhǔn)的Python安裝來創(chuàng)建GUI,但是許多程序不太可能這樣。
1.GUI框架
市面上不缺面向Python的GUI框架。Tkinter、WxPython、Qt和Kivy是幾個(gè)主要的軟件包。此外,還有大量簡化版GUI軟件包可“包裝”其中一個(gè)主要軟件包,包括EasyGUI、PyGUI和Pyforms。
問題是,初學(xué)者連最簡單的主要軟件包都學(xué)不會(huì)。這使得包裝程序包成為一種潛在的選擇,但對(duì)于大多數(shù)新用戶來說,構(gòu)建自定義GUI布局依然很困難或不可能。即便可能,包裝程序包也仍需要編一頁頁代碼。
PySimpleGUI(https://github.com/MikeTheWatchGuy/PySimpleGUI)試圖通過為GUI提供一種超級(jí)簡單、易于理解且易于定制的界面來克服這些GUI挑戰(zhàn)。若使用PySimpleGUI,連許多復(fù)雜的GUI也用不了20行代碼。
2.秘密
PySimpleGUI非常適合新手的原因是,該軟件包含有用戶通常需要編寫的大部分代碼。處理按鈕回調(diào)的是PySimpleGUI,而不是用戶的代碼。初學(xué)者很難掌握函數(shù)這個(gè)概念,要求他們在頭幾周理解回調(diào)函數(shù)確實(shí)勉為其難。
就大多數(shù)GUI而言,安排GUI窗口組件通常需要幾行代碼,每個(gè)窗口組件至少一兩行。 PySimpleGUI使用自動(dòng)創(chuàng)建布局的“自動(dòng)打包程序”。布局GUI窗口無需pack或grid系統(tǒng)。
最后,PySimpleGUI以巧妙的方式利用Python語言構(gòu)件,減少代碼數(shù)量,簡單直觀地返回GUI數(shù)據(jù)。用表單布局創(chuàng)建窗口組件時(shí),它已配置到位,無需編寫多行代碼。
3.GUI是什么?
大多數(shù)GUI做一件事:從用戶處收集信息并返回信息。從程序員的角度來看,這可以概括為函數(shù)調(diào)用,如下所示:
button, values = GUI_Display(gui_layout)
大多數(shù)GUI需要用戶點(diǎn)擊的按鈕(比如,確定、取消、保存、是或不等)以及用戶輸入的值。GUI的本質(zhì)可以歸結(jié)為一行代碼。
這正是PySimpleGUI的工作原理(對(duì)于簡單的GUI而言)。調(diào)用以顯示GUI時(shí),在點(diǎn)擊關(guān)閉表單的按鈕之前不執(zhí)行任何操作。
有些較復(fù)雜的GUI,比如點(diǎn)擊按鈕后不關(guān)閉的GUI。包括面向機(jī)器人的遠(yuǎn)程控制界面和聊天窗口。這些復(fù)雜的表單也可以用PySimpleGUI來創(chuàng)建。
4.快速創(chuàng)建GUI
PySimpleGUI何時(shí)有用?只要你需要GUI就有用。創(chuàng)建和嘗試GUI用不了5分鐘。創(chuàng)建GUI的最快方法是從PySimpleGUI Cookbook(https://pysimplegui.readthedocs.io/en/latest/cookbook/)復(fù)制一個(gè)。遵照這些步驟:
- 找到類似你想創(chuàng)建的GUI的一個(gè)GUI。
- 從Cookbook復(fù)制代碼。
- 粘貼到你的IDE,并運(yùn)行。
不妨看看來自Cookbook的第一個(gè)recipe。
- import PySimpleGUI as sg
- # Very basic form. Return values as a list
- form = sg.FlexForm('Simple data entry form') # begin with a blank form
- layout = [
- [sg.Text('Please enter your Name, Address, Phone')],
- [sg.Text('Name', size=(15, 1)), sg.InputText('name')],
- [sg.Text('Address', size=(15, 1)), sg.InputText('address')],
- [sg.Text('Phone', size=(15, 1)), sg.InputText('phone')],
- [sg.Submit(), sg.Cancel()]
- ]
- button, values = form.LayoutAndRead(layout)
- print(button, values[0], values[1], values[2])
它是大小合適的表單。
圖1:PySimpleGUI數(shù)據(jù)輸入表單
如果你只需要收集幾個(gè)值,它們又都是字符串,可以復(fù)制這個(gè)recipe,根據(jù)你的要求來修改。
你甚至可以僅用5行代碼來創(chuàng)建自定義GUI布局。
- import PySimpleGUI as sg
- form = sg.FlexForm('My first GUI')
- layout = [ [sg.Text('Enter your name'), sg.InputText()],
- [sg.OK()] ]
- button, (name,) = form.LayoutAndRead(layout)
圖2:僅用5行代碼的PySimpleGUI表單
5.5分鐘內(nèi)創(chuàng)建自定義GUI
如果你有簡單的布局,應(yīng)該用不了5分鐘,就能夠用PySimpleGUI創(chuàng)建自定義布局,只要修改來自Cookbook的代碼。
窗口組件在PySimpleGUI中名為元素。這些元素就是你輸入到Python代碼中的,注意拼寫。
核心元素
Text
InputText
Multiline
InputCombo
Listbox
Radio
Checkbox
Spin
Output
SimpleButton
RealtimeButton
ReadFormButton
ProgressBar
Image
Slider
Column
快捷方式列表
PySimpleGUI還有兩種元素快捷方式。一種就是一模一樣的元素的其他名稱(比如T代替Text)。第二種為元素配置某個(gè)特定的設(shè)置,那樣不必指定所有參數(shù)(比如Submit是上面有文本“Submit”的按鈕)。
T = Text
Txt = Text
In = InputText
Input = IntputText
Combo = InputCombo
DropDown = InputCombo
Drop = InputCombo
按鈕快捷方式
許多常用按鈕已被實(shí)施成快捷方式。這包括:
FolderBrowse
FileBrowse
FileSaveAs
Save
Submit
OK
Ok
Cancel
Quit
Exit
Yes
No
還有針對(duì)更一般的按鈕功能的快捷方式。
SimpleButton
ReadFormButton
RealtimeButton
這些都是你可以在PySimpleGUI中選擇的GUI窗口組件。如果某個(gè)不在這些列表上,它不會(huì)進(jìn)入表單布局。
6.GUI設(shè)計(jì)模式
GUI中往往不變的元素是創(chuàng)建和顯示窗口的調(diào)用。元素的布局因程序而異。
下面是上述例子的代碼,布局已去除:
- import PySimpleGUI as sg
- form = sg.FlexForm('Simple data entry form')
- # Define your form here (it's a list of lists)
- button, values = form.LayoutAndRead(layout)
大多數(shù)GUI的流程如下:
- 創(chuàng)建表單對(duì)象
- 將GUI定義成列表清單
- 顯示GUI,獲得結(jié)果
7.GUI布局
想創(chuàng)建自定義GUI,先將表單細(xì)分成幾行,因?yàn)楸韱蚊看味x一行。然后將一個(gè)元素放在另一個(gè)后面,按從左到右的順序。
結(jié)果是看起來是這樣的“列表清單”:
- layout = [ [Text('Row 1')], [Text('Row 2'), Checkbox('Checkbox 1', OK()), Checkbox('Checkbox 2'), OK()] ]
這個(gè)布局生成這個(gè)窗口:
圖3:PySimpleGUI自定義數(shù)據(jù)輸入表單
8.顯示GUI
一旦完成了布局,并復(fù)制了創(chuàng)建和顯示表單的代碼行,現(xiàn)在可以顯示表單,并從用戶處獲得值。
這行代碼顯示表單并提供結(jié)果:
- button, values = form.LayoutAndRead(layout)
表單返回兩個(gè)值:所點(diǎn)擊按鈕的文本和用戶輸入到表單的值列表。
如果示例表單已顯示,用戶只是點(diǎn)擊了“確定”按鈕,結(jié)果會(huì)是如此:
- button == 'OK'
- values == [False, False]
復(fù)選框元素返回True或False的值。由于復(fù)選框默認(rèn)情況下未勾選,返回的兩個(gè)值都是False。
9.顯示結(jié)果
一旦你有了來自GUI的值,可以核實(shí)變量中有什么值。不是使用print語言將它們輸出,不妨堅(jiān)持使用GUI、將數(shù)據(jù)輸出到窗口。
PySimpleGUI有好多消息框可供選擇。傳遞到消息框的數(shù)據(jù)在窗口中顯示。該函數(shù)接受眾多變量。你只要表明想在調(diào)用中看到的所有變量。
PySimpleGUI中最常用的消息框是MsgBox。為了顯示前一個(gè)示例的結(jié)果,編寫:
- MsgBox('The GUI returned:', button, values)
10.統(tǒng)統(tǒng)組合起來
你已知道了基本面,不妨組建一個(gè)含有PySimpleGUI盡可能多元素的表單。另外為了有漂亮的外觀,我們將“look and feel”改成綠色和棕黃色顏色方案。
- import PySimpleGUI as sg
- sg.ChangeLookAndFeel('GreenTan')
- form = sg.FlexForm('Everything bagel', default_element_size=(40, 1))
- column1 = [[sg.Text('Column 1', background_color='#d3dfda', justification='center', size=(10,1))],
- [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
- [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
- [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]
- layout = [
- [sg.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25))],
- [sg.Text('Here is some text.... and a place to enter text')],
- [sg.InputText('This is my text')],
- [sg.Checkbox('My first checkbox!'), sg.Checkbox('My second checkbox!', default=True)],
- [sg.Radio('My first Radio! ', "RADIO1", default=True), sg.Radio('My second Radio!', "RADIO1")],
- [sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
- sg.Multiline(default_text='A second multi-line', size=(35, 3))],
- [sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 3)),
- sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
- [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
- sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
- sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
- sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
- sg.Column(column1, background_color='#d3dfda')],
- [sg.Text('_' * 80)],
- [sg.Text('Choose A Folder', size=(35, 1))],
- [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
- sg.InputText('Default Folder'), sg.FolderBrowse()],
- [sg.Submit(), sg.Cancel()]
- ]
- button, values = form.LayoutAndRead(layout)
- sg.MsgBox(button, values)
看起來代碼好多,但是試著直接用tkinter編寫同樣的GUI布局,你很快意識(shí)到代碼是何等少。
圖4:PySimpleGUI高級(jí)自定義數(shù)據(jù)輸入表單
最后一行代碼打開消息框。 這就是它的樣子:
圖5:PySimpleGUI自定義消息框
消息框調(diào)用的每個(gè)參數(shù)都在一個(gè)新的行上顯示。消息框中有兩行文本;第二行很長,包了好多次。
花點(diǎn)時(shí)間將結(jié)果值與GUI配對(duì),了解如何創(chuàng)建和返回結(jié)果。
11.將GUI添加到程序或腳本
如果你有一個(gè)使用命令行的腳本,不必為了添加GUI而丟棄它。一個(gè)簡單的辦法是,如果命令行上給出零參數(shù),就運(yùn)行GUI。 否則,執(zhí)行命令行。
只需要這種邏輯:
- if len(sys.argv) == 1:
- # collect arguments from GUI
- else:
- # collect arguements from sys.argv
想盡快創(chuàng)建并運(yùn)行GUI,最簡單的方法就是,從PySimpleGUI Cookbook(https://pysimplegui.readthedocs.io/en/latest/cookbook/)復(fù)制一個(gè)recipe并修改。
原文標(biāo)題:Add GUIs to your programs and scripts easily with PySimpleGUI,作者:Mike Barnett
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】