官網:https://sourceforge.net/projects/easygui/
演示使用:Python 3.3.3 版本、EasyGUI-0.96
黃色字體爲根據實際情況所做備註
0. 安裝 EasyGui
使用標準方法安裝:
- 使用命令窗口切換到easygui-docs-0.96的目錄下(EasyGUI安裝文件所在文件夾)
- 【Windows下】執行C:\Python33\python.exe setup.py install
(C:\Users\huhan\AppData\Local\Programs\Python\Python37-32\python.exe setup.py install)
(EasyGUI安裝路徑:C:\Users\huhan\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\easygui-0.98.0_UNRELEASED-py3.7.egg\easygui) - 【Linux或Mac下】sudo /usr/bin/python33 setup.py install
我的電腦:
修改界面字體:
C:\Users\huhan\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\easygui-0.98.0_UNRELEASED-py3.7.egg\easygui\boxes\global_state.py
PROPORTIONAL_FONT_FAMILY = ("微軟雅黑")
修改窗口大小:
C:\Users\huhan\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\easygui-0.98.0_UNRELEASED-py3.7.egg\easygui\boxes\choice_box.py
root_width、root_height
1. 建議不要在 IDLE 上運行 EasyGui
EasyGui 是運行在 Tkinter 上並擁有自身的事件循環,而 IDLE 也是 Tkinter 寫的一個應用程序並也擁有自身的事件循環。因此當兩者同時運行的時候,有可能會發生衝突,且帶來不可預測的結果。因此如果你發現你的 EasyGui 程序有這樣的問題,請嘗試在 IDLE 外去運行你的程序。
2. 一個簡單的例子
在 EasyGui 中,所有的 GUI 互動均是通過簡單的函數調用,下邊一個簡單的例子告訴你 EasyGui 確實很 Easy!
import easygui as g
import sys
while 1:
g.msgbox("嗨,歡迎進入第一個界面小遊戲^_^") # 顯示對話框,只有“OK”按鈕
msg ="請問你希望在魚C工作室學習到什麼知識呢?"
title = "小遊戲互動"
choices = ["談戀愛", "編程", "OOXX", "琴棋書畫"]
choice = g.choicebox(msg, title, choices)
# note that we convert choice to string, in case
# the user cancelled the choice, and we got None.
g.msgbox("你的選擇是: " + str(choice), "結果")
msg = "你希望重新開始小遊戲嗎?"
title = "請選擇"
if g.ccbox(msg, title): # show a Continue/Cancel dialog
pass # user chose Continue
else:
sys.exit(0) # user chose Cancel
3. EasyGui 的各種功能演示
要運行 EasyGui 的演示程序,在命令行調用 EasyGui 是這樣的:
C:\Python33\python.exe easygui.py
或者你可以從 IDE(例如 IDLE, PythonWin, Wing, 等等)上來調用:
>>> import easygui as g
>>> g.egdemo()
成功調用後你將可以嘗試 EasyGui 擁有的各種功能,並將你選擇的結果打印至控制檯。
4. 導入 EasyGui
爲了使用 EasyGui 這個模塊,你應該先導入它。最簡單的導入語句是:
import easygui # 初次安裝EasyGUI後,需重啓IDLE
如果你使用上面這種形式導入的話,那麼你使用 EasyGui 的函數的時候,必須在函數的前面加上前綴 easygui,像這樣:
easygui.msgbox('ABCDE')
另一種選擇是導入整個 EasyGui 包(或覆蓋同名函數):
from easygui import *
這使得我們更容易調用 EasyGui 的函數,你可以直接這樣編寫代碼:
msgbox('ABCDF')
第三種方案是使用類似下邊的 import 語句:
import easygui as g
這樣可以讓你保持 EasyGui 的命名空間,同時減少你的打字數量。導入之後你就可以這麼調用 EasyGui 的函數:
g.msgbox('ABCDE')
5. 使用 EasyGui
一旦你的模塊導入 EasyGui,GUI 操作就是一個簡單的調用 EasyGui 函數的幾個參數的問題了。例如,使用 EasyGui 來實現著名的“你好,世界!”程序是這樣的:
import easygui as g
g.msgbox("Hello, world!")
6. EasyGui 函數的默認參數
對於所有函數而言,前兩個參數是消息和標題。按照這個規律,在某種情況下,這可能不是最有利於用戶的安排(例如,對話框在獲取目錄和文件名的時候忽略消息參數),但我覺得保持這種一致性貫穿於所有的窗口部件是一種更爲重要的考慮!
絕大部分的 EasyGui 函數都有默認參數,幾乎所有的組件都會顯示一個消息和標題。標題默認是空字符串,信息通常有一個簡單的默認值。
這使得你可以儘量少的去設置參數,比如 msgbox() 函數標題部分的參數就是可選的,所以你調用 msgbox() 的時候可以只指定一個消息參數,例如:
- >>> msgbox('我愛小甲魚^_^')
複製代碼
當然你也可以指定標題參數和消息參數,例如:
- >>> msgbox('我愛小甲魚^_^', '魚油心聲')
複製代碼
在各類按鈕組件裏,默認的消息是"Shall I continue?",所以你可以不帶任何參數地去調用它們。這裏我們演示不帶任何參數地去調用 ccbox(),當選擇"cancel"或關閉窗口的時候返回一個布爾類型的值:
- if ccbox():
- pass # user chose to continue
- else:
- return # user chose to cancel
複製代碼
7. 使用關鍵字參數調用 EasyGui 的函數
調用 EasyGui 函數還可以使用關鍵字參數哦。(如忘了的童鞋翻出《零基礎入門學習Python》第18講自行腦補)
現在假設你需要使用一個按鈕組件,但你不想指定標題參數(第二個參數),你仍可以使用關鍵字參數的方法指定 choices 參數(第三個參數),像這樣:
- >>> choices = ['願意', '不願意', '有錢的時候願意']
- >>> reply = choicebox('你願意購買資源打包支持小甲魚嗎?', choices = choices)
複製代碼
8. 使用按鈕組件
根據需求,EasyGui 在 buttonbox() 上建立了一系列的函數供調用。
8.1 msgbox()
msgbox(msg='(Your message goes here)', title=' ', ok_button='OK', image=None, root=None)
msgbox() 顯示一個消息和提供一個"OK"按鈕,你可以指定任意的消息和標題,你甚至可以重寫"OK"按鈕的內容。
以下是 msgbox() 的實例函數:
- def msgbox(msg="(Your message goes here)", title="", ok_button="OK"):
- ....
複製代碼
重寫"OK"按鈕最簡單的方法是使用關鍵字參數:
- >>> msgbox("我一定要學會編程!", ok_button="加油!")
複製代碼
8.2 ccbox()
ccbox(msg='Shall I continue?', title=' ', choices=('Continue', 'Cancel'), image=None)
ccbox() 提供一個選擇:Continue 或者 Cancel,並相應的返回 1(選中Continue)或者 0(選中Cancel)。
注意 ccbox() 是返回整型的 1 或 0,不是布爾類型的 True 或 False。但你仍然可以這麼寫:
- if ccbox('要再來一次嗎?', choices=('要啊要啊^_^', '算了吧T_T')):
- msgbox('不給玩了,再玩就玩壞了......')
- else:
- sys.exit(0) # 記得先 import sys 哈
複製代碼
8.3 ynbox()
ynbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None)
同上,都不知作者設計這兩玩意兒搞啥......
8.4 buttonbox()
buttonbox(msg='', title=' ', choices=('Button1', 'Button2', 'Button3'), image=None, root=None)
可以使用 buttonbox() 定義自己的一組按鈕,buttonbox() 會顯示一組你定義好的按鈕。
當用戶點擊任意一個按鈕的時候,buttonbox() 返回按鈕的文本內容。如果用戶取消取消或者關閉窗口,那麼會返回默認選項(第一個選項)。請看例子:
8.5 indexbox()
indexbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None)
基本跟上邊一樣,區別就是當用戶選擇第一個按鈕的時候返回序號 0, 選擇第二個按鈕的時候返回序號 1。
8.6 boolbox()
boolbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None)
如果第一個按鈕被選中則返回 1,否則返回 0。
9. 如何在 buttonbox 裏邊顯示圖片
當你調用一個 buttonbox 函數(例如 msgbox(), ynbox(), indexbox() 等等)的時候,你還可以爲關鍵字參數 image 賦值,這是設置一個 .gif 格式的圖像(注意僅支持 GIF 格式哦):
- buttonbox('大家說我長得帥嗎?', image='turtle.gif', choices=('帥', '不帥', '!@#$%'))
複製代碼
10. 爲用戶提供一系列選項
10.1 choicebox()
choicebox(msg='Pick something.', title=' ', choices=())
按鈕組件方便提供用戶一個簡單的按鈕選項,但如果有很多選項,或者選項的內容特別長的話,更好的策略是爲它們提供一個可選擇的列表。
choicebox() 爲用戶提供了一個可選擇的列表,使用序列(元祖或列表)作爲選項,這些選項顯示前會按照不區分大小寫的方法排好序。
另外還可以使用鍵盤來選擇其中一個選項(比較糾結,但一點兒都不重要):
- 例如當按下鍵盤上的"g"鍵,將會選中的第一個以"g"開頭的選項。再次按下"g"鍵,則會選中下一個以"g"開頭的選項。在選中最後一個以"g"開頭的選項的時候,再次按下"g"鍵將重新回到在列表的開頭的第一個以"g"開頭的選項。
- 如果選項中沒有以"g"開頭的,則會選中字符排序在"g"之前("f")的那個字符開頭的選項
- 如果選項中沒有字符的排序在"g"之前的,那麼在列表中第一個元素將會被選中。
綜合我們之前學習的文件功能,舉個高達上的例子(源代碼在第35講的課後作業中^_^):
10.2 multchoicebox()
multchoicebox(msg='Pick as many items as you like.', title=' ', choices=(), **kwargs)
multchoicebox() 函數也是提供一個可選擇的列表,與 choicebox() 不同的是,multchoicebox() 支持用戶選擇 0 個,1 個或者同時選擇多個選項。
multchoicebox() 函數也是使用序列(元祖或列表)作爲選項,這些選項顯示前會按照不區分大小寫的方法排好序。
11. 讓用戶輸入消息
11.1 enterbox()
enterbox(msg='Enter something.', title=' ', default='', strip=True, image=None, root=None)
enterbox() 爲用戶提供一個最簡單的輸入框,返回值爲用戶輸入的字符串。默認返回的值會自動去除首尾的空格,如果需要保留首尾空格的話請設置參數 strip=False。
11.2 integerbox()
integerbox(msg='', title=' ', default='', lowerbound=0, upperbound=99, image=None, root=None, **invalidKeywordArguments)
integerbox() 爲用戶提供一個簡單的輸入框,用戶只能輸入範圍內(lowerbound參數設置最小值,upperbound參數設置最大值)的整型數值,否則會要求用戶重新輸入。
11.3 multenterbox()
multenterbox(msg='Fill in values for the fields.', title=' ', fields=([list]), values=())
例:list1= ['用戶名:','密碼:']
g.multpasswordbox(msg='請輸入用戶名和密碼',title='登錄',fields=(list1))
multenterbox() 爲用戶提供多個簡單的輸入框,要注意以下幾點:
- 如果用戶輸入的值比選項少的話,則返回列表中的值用空字符串填充用戶爲輸入的選項。
- 如果用戶輸入的值比選項多的話,則返回的列表中的值將截斷爲選項的數量。
- 如果用戶取消操作,則返回域中的列表的值或者None值。
實現如下圖(源代碼在第35講的課後作業中^_^):
12. 讓用戶輸入密碼
有時候我們需要讓用戶輸入密碼,就是用戶輸入的東西看上去都是"*******"。
12.1 passwordbox()
passwordbox(msg='Enter your password.', title=' ', default='', image=None, root=None)
passwordbox() 跟 enterbox() 樣式一樣,不同的是用戶輸入的內容用"*"顯示出來,返回用戶輸入的字符串:
12.2 multpasswordbox()
multpasswordbox(msg='Fill in values for the fields.', title=' ', fields=(), values=())
multpasswordbox() 跟 multenterbox() 使用相同的接口,但當它顯示的時候,最後一個輸入框顯示爲密碼的形式("*"):
13. 顯示文本
EasyGui 還提供函數用於顯示文本。
13.1 textbox()
textbox(msg='', title=' ', text='', codebox=0)
例:g.textbox(text= open('E:\\新建文本文檔.txt','r'))
testbox() 函數默認會以比例字體(參數 codebox=1 設置爲等寬字體)來顯示文本內容(會自動換行哦),這個函數適合用於顯示一般的書面文字。
注:text 參數(第三個參數)可以是字符串類型,列表類型,或者元祖類型。
13.2 codebox()
codebox(msg='', title=' ', text='')
codebox() 以等寬字體顯示文本內容,相當於 textbox(codebox=1)
注:等寬字體很醜的,不信你試試看@_@
14. 目錄與文件
GUI 編程中一個常見的場景是要求用戶輸入目錄及文件名,EasyGui 提供了一些基本函數讓用戶來瀏覽文件系統,選擇一個目錄或文件。
14.1 diropenbox()
diropenbox(msg=None, title=None, default=None)
diropenbox() 函數用於提供一個對話框,返回用戶選擇的目錄名(帶完整路徑哦),如果用戶選擇"Cancel"則返回 None。
default 參數用於設置默認的打開目錄(請確保設置的目錄已存在)。
14.2 fileopenbox()
fileopenbox(msg=None, title=None, default='*', filetypes=None)
fileopenbox() 函數用於提供一個對話框,返回用戶選擇的文件名(帶完整路徑哦),如果用戶選擇"Cancel"則返回 None。
關於 default 參數的設置方法:
- default 參數指定一個默認路徑,通常包含一個或多個通配符。
- 如果設置了 default 參數,fileopenbox() 顯示默認的文件路徑和格式。
- default 默認的參數是'*',即匹配所有格式的文件。
例如:
- default="c:/fishc/*.py" 即顯示 C:\fishc 文件夾下所有的 Python 文件。
- default="c:/fishc/test*.py" 即顯示 C:\fishc 文件夾下所有的名字以 test 開頭的 Python 文件。
關於 filetypes 參數的設置方法:
- 可以是包含文件掩碼的字符串列表,例如:filetypes = ["*.txt"]
- 可以是字符串列表,列表的最後一項字符串是文件類型的描述,例如:filetypes = ["*.css", ["*.htm", "*.html", "HTML files"]]
14.3 filesavebox()
filesavebox(msg=None, title=None, default='', filetypes=None)
filesavebox() 函數提供一個對話框,讓用於選擇文件需要保存的路徑(帶完整路徑哦),如果用戶選擇"Cancel"則返回 None。
default 參數應該包含一個文件名(例如當前需要保存的文件名),當然你也可以設置爲空的,或者包含一個文件格式掩碼的通配符。
filetypes 參數的設置方法請參考上邊。
15. 記住用戶的設置
15.1 EgStore
GUI 編程中一個常見的場景就是要求用戶設置一下參數,然後保存下來,以便下次用戶使用你的程序的時候可以記住他的設置。
爲了實現對用戶的設置進行存儲和恢復這一過程,EasyGui 提供了一個叫做 EgStore 的類。爲了記住某些設置,你的應用程序必須定義一個類(暫時稱之爲"設置"類,儘管你隨意地使用你想要的名稱設置它)繼承自 EgStore 類。
然後你的應用程序必須創建一個該類的對象(暫時稱之爲"設置"對象)。
設置類的構造函數(__init__ 方法)必須初始化所有的你想要它所記住的那些值。
一旦你這樣做了,你就可以在"設置"對象中通過設定值去實例化變量,從而很簡單地記住設置。之後使用 settings.store() 方法在硬盤上持久化設置對象。
下面是創建一個"設置"類的例子:
- #-----------------------------------------------------------------------
- # create "settings", a persistent Settings object
- # Note that the "filename" argument is required.
- # The directory for the persistent file must already exist.
- #-----------------------------------------------------------------------
- settingsFilename = os.path.join("C:", "FishCApp", "settings.txt") # Windows example
- settings = Settings(settingsFilename)
複製代碼
下面是使用"設置"對象的例子:
- # we initialize the "user" and "server" variables
- # In a real application, we'd probably have the user enter them via enterbox
- user = "奧巴馬"
- server = "白宮"
- # we save the variables as attributes of the "settings" object
- settings.userId = user
- settings.targetServer = server
- settings.store() # persist the settings
- # run code that gets a new value for userId
- # then persist the settings with the new value
- user = "小甲魚"
- settings.userId = user
- settings.store()
複製代碼
16. 捕獲異常
exceptionbox()
使用 EasyGui 編寫 GUI 程序,有時候難免會產生異常。當然這取決於你如何運行你的應用程序,當你的應用程序崩潰的時候,堆棧追蹤可能會被拋出,或者被寫入到 stdout 標準輸出函數中。
EasyGui 通過 exceptionbox() 函數提供了更好的方式去處理異常,異常出現的時候,exceptionbox() 會顯示堆棧追蹤在一個 codebox() 中並且允許你做進一步的處理。
exceptionbox() 很容易使用,下面是一個例子:
- try:
- print('I Love FishC.com!')
- int('FISHC') # 這裏會產生異常
- except:
- exceptionbox()
複製代碼