一、什么是EasyGUI
EasyGUI是python中一個非常簡單的GUI編程模塊,不同於其他的GUI生成器,它不是事件驅動的,相反,所有的GUI交互都是通過簡地函數調用就可以實現(意思是:函數調用就可以實現GUI)
EasyGUI為用戶提供了簡單的GUI交互接口,不需要程序員知道任何相關tkinter,框架,部件,回調或lambda的任何細節
EasyGUI可以很好兼容python 2 和 3,並且不存在任何依賴關系
EasyGUI是運行在Tkinter上並擁有自身的時間循環,而IDLE也是Tkinter寫的一個應用程序並也擁有自身的時間循環。因此到那個兩者同時運行的時候,有可能會發生沖突,且帶來不可預測的結果。因此如果你發現你的EasyGUI程序有這樣的問題。請嘗試在idle外去運行
你的程序
二、在EasyGUI中,所有GUI互動均是通過簡單的函數調用,下邊一個簡單的例子告訴你EasyGUI確實很easy
import easygui as g import sys while 1: g.msgbox('嗨,歡迎進入第一個界面小游戲!') msg = '請問你希望在塵封的工作室學習到什么知識呢?' title = '小游戲互動' choices = ['談戀愛','編程','OOXX','琴棋書畫'] choice = g.choicebox(msg,title,choices) ''' |--注意:msgbox的參數是一個字符串 |--如果用戶選擇Cancel,該函數返回None ''' g.msgbox('你的選擇是:'+str(choice),"結果") msg = '你希望重新開始小游戲嗎?' title = '請選擇' #彈出一個Continue/Cancel對話框 if g.ccbox(msg,title): pass #如果用戶選擇Continue else: sys.exit(0) #如果用戶現在Cancel
三、倒入EasyGUI
使用EasyGUI這個模塊之前,必須先導入
1、最簡單的導入方式:
import EasyGUI
使用這種形式導入的話,那么你使用EasyGUI的函數的時候,必須在前面加上easygui,像這樣:
easygui.msgbox()
2、選擇導入整個EasyGUI包
from easygui import *
使用這種形式導入的話,那么使用EasyGUI的函數的時候,可以直接寫
msgbox()
3、導入as命名空間
import easygui as g
使用這種形式導入的話,調用EasyGUI函數,可以這樣寫
g.msgbox()
四、EasyGUI函數的默認參數
1、對於所有的對話框而言,前兩個參數都是消息主體和對話框標題
按照這個規律,在某種情況下這可能不是理想的布局設計(比如當對話框在獲取目錄或文件名的時候會選擇忽略消息參數)但保持這種一致性且貫穿於所有的窗口部件是更為得體的考慮
絕大部分的EasyGUI函數都有默認參數,幾乎所有的組件都會顯示消息主體和對話框標題
標題默認是空字符串,消息主體通常有一個簡單的默認值
比如msgbox()函數標題部分的參數是可選的,因此你調用msgbox()的時候只需要指定一個消息參數即可,例如:
>>> import easygui as g >>> g.msgbox('厲害了') ----只有消息體,沒有標題
當然也可以指定消息題和標題
>>> import easygui as g >>> g.msgbox('厲害了','我的國') ---既有消息題,也有標題
2、在各類按鈕組件中,默認的消息是“shall I continue?”所以你可以不用任何參數地去調用它們
這里演示一個不帶任何參數的調用ccbox(),當選擇“cancel”或關閉窗口的時候返回一個布爾類型的值:
import easygui as g import sys if g.ccbox(): pass # 用戶選擇繼續 else: sys.exit(0) #用戶選擇取消
五、使用關鍵字參數調用EasyGUI的函數
調用EasyGUI函數還可以使用關鍵字參數哦
現在假設你需要使用一個按鈕組件,但你不想指定標題參數(第二個參數)你仍可以使用關鍵字參數的方法指定choices參數(第三個參數)
choices = ['111','222','333'] reply = g.choicebox('你想選擇那個參數',choices=choices)
六、使用按鈕組件
根據需求,EasyGUI在buttonbox()上建立了一系列的函數供調用
6.1、msgbox()
msgbox(msg='(your message goes here)',title = ' ',ok_button='OK',image=None,root=None)
msgbox()顯示一個消息和提供一個“OK”按鈕,你可以指定任意的消息內容和標題,你甚至可以重寫"OK"按鈕的內容
重寫“OK”按鈕最簡單的方法是使用關鍵字參數:
>>> import easygui as g >>> g.msgbox('我一定要學會編程',ok_button="加油!")
6.2、ccbox()
ccbox(msg='Shall I continue?', title=' ', choices=('C[o]ntinue', 'C[a]ncel'), image=None, default_choice='C[o]ntinue', cancel_choice='C[a]ncel')
ccbox()提供了一個選擇:“C[o]ntinue'”或者“C[a]ncel'”,並相應的返回True或者False
注意:“C[o]ntinue”中的[o]表示快捷鍵,也就是說當用戶在鍵盤上敲一個o字符,就相當於點擊了“C[o]ntinue”按鍵
>>> g.ccbox('你的選擇是','python') True
6.3、yxbox()
ynbox(msg='Shall I continue?', title=' ', choices=('[<F1>]Yes', '[<F2>]No'), image=None, default_choice='[<F1>]Yes', cancel_choice='[<F2>]No')
跟ccbox()一樣,只不過這里默認的choices參數值不同而已,[<F1>]表示將鍵盤上的F1功能按鈕作為“YES”的快捷鍵使用
>>> g.ynbox('你的選擇是','python')
6.4、buttonbox()
buttonbox(msg='', title=' ', choices=('Button[1]', 'Button[2]', 'Button[3]'), image=None, images=None, default_choice=None, cancel_choice=None, callback=None, run=True)
可以使用buttonbox()定義自己的一組按鈕,buttonbox()會顯示一組由你自定義的按鈕
當用戶點擊任意一個按鈕的時候,buttonbox()返回按鈕的文本內容
如果用戶點擊取消或者關閉窗口,那么返回默認選項(第一個選項)
>>> choices = ['草莓','香蕉','山竹'] >>> g.buttonbox('你喜歡哪種水果','請選擇',choices)
6.5、indexbox()
indexbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None, default_choice='Yes', cancel_choice='No')
基本跟buttonbox()一樣,區別就是當用戶選擇第一個按鈕的時候返回序號0,選擇第二個按鈕的時候返回序號1
>>> g.indexbox('你一定要學會編程嗎?',choices=['yes','no']) 0
6.6、boolbox()
boolbox(msg='Shall I continue?', title=' ', choices=('[Y]es', '[N]o'), image=None, default_choice='Yes', cancel_choice='No')
如果第一個按鈕被選中則返回Ture,否則返回False
>>> g.boolbox('你一定要學會編程嗎?',choices=['yes','no']) True
七、如何在buttonbox()里面顯示圖片
當你調用一個buttonbox()函數(例如:msgbox(),ynbox(),indexbox()等等)的時候,你還可以為關鍵字參數image賦值,可以設置一個.gif格式的圖像(PNG格式的圖像也是支持的哦)
g.buttonbox('我帥不帥','塵封最帥',choices=('帥','很帥','超級帥'),image='/Users/yixia/Desktop/111.png')
八、為用戶提供一系列選項組件
8.1、choicebox()
choicebox(msg='Pick an item', title='', choices=[], preselect=0, callback=None, run=True)
按鈕組件方便提供用戶一個簡單的按鈕選項,但如果有很多選項,或者選項的內容特別長的話,更好的策略是為它們提供一個可選擇的列表
choicebox()為用戶提供一個可選擇的列表,使用序列(元祖或列表)作為選項,這些選項會按照字母進行排序
8.2、multchoicebox()
multchoicebox(msg='Pick an item', title='', choices=[], preselect=0, callback=None, run=True)
multchoicebox()函數也是提供一個可選擇的列表,與choicebox()不同的是,multchoicebox()支持用戶選擇0個,1個或者同時選擇多個選項
multchoicebox()函數也是使用序列(元祖或列表)作為選項,這些選項顯示前會會按照不區分大小寫的方法排好序
九、讓用戶輸入消息的組件
9.1、enterbox()
enterbox(msg='Enter something.', title=' ', default='', strip=True, image=None, root=None)
enterbox()為用戶提供一個簡單的輸入框,返回值為用戶輸入的字符串
默認返回的字符串時去除首位的空格,如果需要收尾的空格,函數寫上strip=False
>>> g.enterbox('一天最開心的事情是什么?') '擼代碼'
>>> g.enterbox('一天最開心的事情是什么?',strip=False) ' 敲代碼 '
9.2、integerbox()
integerbox(msg='', title=' ', default=None, lowerbound=0, upperbound=99, image=None, root=None)
integerbox()函數為用戶提供一個簡單的輸入框,用戶只能輸入范圍內(lowerbound最小范圍,upperbound最大范圍)的整形數值,否則要求用戶重新輸入
如果不輸入lowerbound和upperbound,則默認范圍是0~99
g.integerbox('塵封幸運數值是那個數字呢?')
只能輸入整形數字
>>> g.integerbox('塵封幸運數值是那個數字呢?',lowerbound=0,upperbound=1000) 999
9.3、multenterbox()
multenterbox(msg='Fill in values for the fields.', title=' ', fields=[], values=[], callback=None, run=True)
multenterbox()為用戶提供多個簡單的輸入框,要注意以下幾點:
--如果用戶輸入的值比選項少的話,則返回列表中的值用空字符穿填充用戶為輸入的選項
--如果用戶輸入的值比選項多的話,則返回的列表中的值將截斷為選項的數量
--如果用戶取消操作,則返回域中的列表的值或者None值
十、讓用戶輸入密碼
有時候可能需要用戶輸入密碼等敏感信息,那么界面看上去應該是這樣的:********
10.1、passwordbox()
passwordbox(msg='Enter your password.', title=' ', default='', image=None, root=None)
passwordbox()和enterbox()樣式一樣,不同的是用戶輸入的內容用星號(*)顯示出來,該函數返回用戶輸入的字符串:
>>> g.passwordbox('請輸入密碼:') '123456'
10.2、multpasswordbox()
multpasswordbox(msg='Fill in values for the fields.', title=' ', fields=(), values=(), callback=None, run=True)
multpasswordbox()和multenterbox()使用相同的接口,但當它顯示的時候,最后一個輸入框顯示為密碼的形式(*):
十一、顯示文本
11.1、textbox()
textbox(msg='', title=' ', text='', codebox=False, callback=None, run=True)
textbox()函數默認會以比例字體(參數codebox=True設置為等寬字體)來顯示文本內容(自動換行),這個函數適合用於顯示一般的書面文字
注:text參數設置可編輯文本區域的內容,可以是字符串,列表或者元祖類型
>>> g.textbox('文件內容')
11.2、codebox()
codebox(msg='', title=' ', text='')
codebox()以等寬字體顯示文本內容(不自動換行),相當於textbox(codebox=True)
注:等寬字體很丑,但適合代碼編寫,不信你試試看
>>> g.codebox('msg')
十二、目錄與文件
GUI編程中一個常見的場景是要求用戶輸入目錄及文件名,EasyGUI提供了一些基本函數讓用戶來瀏覽文件系統,選擇一個目錄或文件
12.1、diropenbox()
diropenbox(msg=None, title=None, default=None)
diropenbox()函數提供一個對話框,返回用戶選擇的目錄名(帶完整路徑哦),如果用戶選擇“Cancel”則返回None
default參數用於設置默認的打開目錄(請確保設置的目錄已存在)
>>> g.diropenbox() '/Users/yixia/Desktop/項目/關注限制白名單/關注-php測試腳本'
12.2、fileopenbox()
fileopenbox(msg=None, title=None, default='*', filetypes=None, multiple=False)
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"]]
最后是 multiple 參數,如果為 True 則表示可以同時選擇多個文件。
12.3、filesavebox()
filesavebox(msg=None, title=None, default='', filetypes=None)
filesavebox()函數提供一個對話框,讓用於選擇文件需要保存的路徑(帶完整的路徑)如果用戶選擇 “Cancel” 則返回 None。
default參數應該包含一個文件名(例如當前需要保存的文件名),當然也可以設置為空的,或者包含一個文件格式掩碼的通配符
filetypes參數的設置方法請參考fileopenbox()函數
十三、記住用戶的設置
13.1、EgStore
GUI編程中一個常見的場景就是要求用戶設置一下參數,然后保存下來,以便下次用戶使用你的程序的時候可以記住他的設置
為了實現對一哦那個戶的設置進行存儲和恢復這一過程,EasyGUI提供了一個叫做EgStore的類
為了記住某些設置,你的應用程序必須定義一個類(下面案例中的“Setting”)繼承自EgStore類
然后你的應用程序必須創建一個該類的實例話對象(下面案例中的“setting”)
設置類的構造函數(__init__方法)必須初始化多有的你想要它所記住的那些值
一旦你這樣做了,你就可以在setting對象中通過設定值去實例化變量,從而很簡單的記住設置
之后使用setting.store()方法在硬盤上持久化保存
from easygui import EgStore import os #定義一個Settings類繼承EgStore class Settings(EgStore): def __init__(self,filename): #需要指定文件名 #需要指定記住的屬性名稱 self.author = "" self.book = "" #必須執行下面的語句 self.filename = filename self.restore() #創建Settings實例化對象"settings" settingsfilename = os.path.join('/Users/yixia/PycharmProjects/python/num38/','settings.txt') settings = Settings(settingsfilename) author = '塵封' book = '《機器語言的魅力》' #將上面兩個變量的值保存到"settings"對象中 settings.author = author settings.book = book settings.store() print("\n保存完畢")
十四、抓獲異常
14.1、exceptionbox()
使用EasyGUI編寫GUI程序,有時候難免會產生異常。當然這取決於你如何運行你的應用程序,當你的應用程序崩潰的時候,堆棧追蹤坑會被拋出,或者被寫入到stdout標准輸出函數中
EasyGUI通過exceptionbox()函數提供了更好的方式處理異常
當異常出現的時候,exceptionbox()會將對戰追蹤顯示在一個codebox()中,並且允許你做進一步的處理
exceptionbox()很容易使用,下面舉個例子:
from easygui import exceptionbox try: print('I love write python') int('FISHC') # 這里會產生異常 except: exceptionbox()