1. 程式人生 > >Python:EasyGUI v0.96學習文件

Python:EasyGUI v0.96學習文件

  • 使用命令視窗切換到easygui-docs-0.96的目錄下
  • 【Windows下】執行C:\Python33\python.exe setup.py install
  • 【Linux或Mac下】sudo /usr/bin/python33 setup.py install

1. 建議不要在 IDLE 上執行 EasyGui EasyGui 是執行在 Tkinter 上並擁有自身的事件迴圈,而 IDLE 也是 Tkinter 寫的一個應用程式並也擁有自身的事件迴圈。因此當兩者同時執行的時候,有可能會發生衝突,且帶來不可預測的結果。因此如果你發現你的 EasyGui 程式有這樣的問題,請嘗試在 IDLE 外去執行你的程式。2. 一個簡單的例子

在 EasyGui 中,所有的 GUI 互動均是通過簡單的函式呼叫,下邊一個簡單的例子告訴你 EasyGui 確實很 Easy!

  1. import easygui as g
  2. import sys
  3. while 1:
  4.         g.msgbox("嗨,歡迎進入第一個介面小遊戲^_^")
  5.         msg ="請問你希望在魚C工作室學習到什麼知識呢?"
  6.         title = "小遊戲互動"
  7.         choices = ["談戀愛", "程式設計", "OOXX", "琴棋書畫"]
  8.         choice = g.choicebox(msg, title, choices)
  9.         # note that we convert choice to string, in case
  10.         # the user cancelled the choice, and we got None.
  11.         g.msgbox("你的選擇是: " + str(choice), "結果")
  12.         msg = "你希望重新開始小遊戲嗎?"
  13.         title = "請選擇"
  14.         if g.ccbox(msg, title):     # show a Continue/Cancel dialog
  15.                 pass  # user chose Continue
  16.         else:
  17.                 sys.exit(0)     # user chose Cancel

複製程式碼

3. EasyGui 的各種功能演示 要執行 EasyGui 的演示程式,在命令列呼叫 EasyGui 是這樣的:

  1. C:\Python33\python.exe easygui.py

複製程式碼

或者你可以從 IDE(例如 IDLE, PythonWin, Wing, 等等)上來呼叫:

  1. >>> import easygui as g
  2. >>> g.egdemo()

複製程式碼

成功呼叫後你將可以嘗試 EasyGui 擁有的各種功能,並將你選擇的結果列印至控制檯。4. 匯入 EasyGui 為了使用 EasyGui 這個模組,你應該先匯入它。最簡單的匯入語句是:

  1. import easygui

複製程式碼

如果你使用上面這種形式匯入的話,那麼你使用 EasyGui 的函式的時候,必須在函式的前面加上字首 easygui,像這樣:

  1. easygui.msgbox(...)

複製程式碼

另一種選擇是匯入整個 EasyGui 包:

  1. from easygui import *

複製程式碼

這使得我們更容易呼叫 EasyGui 的函式,你可以直接這樣編寫程式碼:

  1. msgbox(...)

複製程式碼

第三種方案是使用類似下邊的 import 語句:

  1. import easygui as g

複製程式碼

這樣可以讓你保持 EasyGui 的名稱空間,同時減少你的打字數量。匯入之後你就可以這麼呼叫 EasyGui 的函式:

  1. g.msgbox(...)

複製程式碼

5. 使用 EasyGui 一旦你的模組匯入 EasyGui,GUI 操作就是一個簡單的呼叫 EasyGui 函式的幾個引數的問題了。 例如,使用 EasyGui 來實現著名的“你好,世界!”程式是這樣的:

  1. import easygui as g
  2.         g.msgbox("Hello, world!")

複製程式碼

6. EasyGui 函式的預設引數 對於所有函式而言,前兩個引數是訊息和標題。按照這個規律,在某種情況下,這可能不是最有利於使用者的安排(例如,對話方塊在獲取目錄和檔名的時候忽略訊息引數),但我覺得保持這種一致性貫穿於所有的視窗部件是一種更為重要的考慮!     絕大部分的 EasyGui 函式都有預設引數,幾乎所有的元件都會顯示一個訊息和標題。標題預設是空字串,資訊通常有一個簡單的預設值。    這使得你可以儘量少的去設定引數,比如 msgbox() 函式標題部分的引數就是可選的,所以你呼叫 msgbox() 的時候可以只指定一個訊息引數,例如:

  1. >>> msgbox('我愛小甲魚^_^')

複製程式碼

當然你也可以指定標題引數和訊息引數,例如:

  1. >>> msgbox('我愛小甲魚^_^', '魚油心聲')

複製程式碼

在各類按鈕元件裡,預設的訊息是"Shall I continue?",所以你可以不帶任何引數地去呼叫它們。這裡我們演示不帶任何引數地去呼叫 ccbox(),當選擇"cancel"或關閉視窗的時候返回一個布林型別的值:

  1. if ccbox(): 
  2.         pass         # user chose to continue
  3. else: 
  4.         return      # user chose to cancel

複製程式碼

7. 使用關鍵字引數呼叫 EasyGui 的函式 呼叫 EasyGui 函式還可以使用關鍵字引數哦。(如忘了的童鞋翻出《零基礎入門學習Python》第18講自行腦補) 現在假設你需要使用一個按鈕元件,但你不想指定標題引數(第二個引數),你仍可以使用關鍵字引數的方法指定 choices 引數(第三個引數),像這樣:

  1. >>> choices = ['願意', '不願意', '有錢的時候願意']
  2. >>> 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() 的例項函式:

  1. def msgbox(msg="(Your message goes here)", title="", ok_button="OK"):
  2.         ....

複製程式碼

重寫"OK"按鈕最簡單的方法是使用關鍵字引數:

  1. >>> 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。但你仍然可以這麼寫:

  1. if ccbox('要再來一次嗎?', choices=('要啊要啊^_^', '算了吧T_T')):
  2.         msgbox('不給玩了,再玩就玩壞了......')
  3. else:
  4.         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 格式哦):

  1. buttonbox('大家說我長得帥嗎?', image='turtle.gif', choices=('帥', '不帥', '[email protected]#$%'))

複製程式碼

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) 注:等寬字型很醜的,不信你試試看@[email protected]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() 方法在硬碟上持久化設定物件。 下面是建立一個"設定"類的例子:

  1. #-----------------------------------------------------------------------
  2. # create "settings", a persistent Settings object
  3. # Note that the "filename" argument is required.
  4. # The directory for the persistent file must already exist.
  5. #-----------------------------------------------------------------------
  6. settingsFilename = os.path.join("C:", "FishCApp", "settings.txt")  # Windows example
  7. settings = Settings(settingsFilename)

複製程式碼

下面是使用"設定"物件的例子:

  1. # we initialize the "user" and "server" variables
  2. # In a real application, we'd probably have the user enter them via enterbox
  3. user    = "奧巴馬"
  4. server  = "白宮"
  5. # we save the variables as attributes of the "settings" object
  6. settings.userId = user
  7. settings.targetServer = server
  8. settings.store()    # persist the settings
  9. # run code that gets a new value for userId
  10. # then persist the settings with the new value
  11. user    = "小甲魚"
  12. settings.userId = user
  13. settings.store()

複製程式碼

16. 捕獲異常exceptionbox() 使用 EasyGui 編寫 GUI 程式,有時候難免會產生異常。當然這取決於你如何執行你的應用程式,當你的應用程式崩潰的時候,堆疊追蹤可能會被丟擲,或者被寫入到 stdout 標準輸出函式中。 EasyGui 通過 exceptionbox() 函式提供了更好的方式去處理異常,異常出現的時候,exceptionbox() 會顯示堆疊追蹤在一個 codebox() 中並且允許你做進一步的處理。 exceptionbox() 很容易使用,下面是一個例子:

  1. try:
  2.         print('I Love FishC.com!')
  3.         int('FISHC') # 這裡會產生異常
  4. except:
  5.         exceptionbox()

複製程式碼