1. 程式人生 > >EasyGUI 學習文件

EasyGUI 學習文件

目錄

由於版本更迭,本篇所有示例及截圖均已更新,最新演示版本為 EasyGUI 0.98 & Python 3.7。

注意:由於模組、Python 版本或系統環境的差異,書中涉及的演示截圖與實際環境可能會有出入,但函式的用法及行為均是一致。

0. 安裝 EasyGUI

1. 什麼是 EasyGUI?

EasyGUI 是 Python 中一個非常簡單的 GUI 程式設計模組,不同於其他的 GUI 生成器,它不是事件驅動的。相反,所有的 GUI 互動都是通過簡地函式呼叫就可以實現。

EasyGUI 為使用者提供了簡單的 GUI 互動介面,不需要程式設計師知道任何有關 tkinter,框架,部件,回撥或 lambda 的任何細節。



EasyGUI 可以很好地相容 Python 2 和 3,並且不存在任何依賴關係。

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

2. 一個簡單的例子

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

import easygui as g
import sys

while 1:
        g.msgbox("嗨,歡迎進入第一個介面小遊戲^_^")

        msg ="請問你希望在魚C工作室學習到什麼知識呢?"
        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

3. EasyGUI 的各種功能演示

要執行 EasyGUI 的演示程式,在命令列呼叫 EasyGUI 是這樣的:
 

python easygui.py

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

>>> import easygui
>>> easygui.egdemo()


成功呼叫後將可以嘗試 EasyGUI 擁有的各種功能,並將結果列印至控制檯。

4. 匯入 EasyGUI

為了使用 EasyGUI 這個模組,你應該先匯入它。

最簡單的匯入語句是:

import easygui

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

easygui.msgbox(...)

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

from easygui import *

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

msgbox(...)

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

import easygui as g

這種方法還可以讓你保持 EasyGUI 的名稱空間,同時減少你的打字數量。

匯入之後就可以這麼呼叫 EasyGUI 的函式:

g.msgbox(...)

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         # 使用者選擇繼續
else: 
        return      # 使用者選擇取消

7. 使用關鍵字引數呼叫 EasyGUI 的函式

呼叫 EasyGUI 函式還可以使用關鍵字引數哦。

現在假設你需要使用一個按鈕元件,但你不想指定標題引數(第二個引數),你仍可以使用關鍵字引數的方法指定 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” 按鈕的內容。

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

>>> msgbox("我一定要學會程式設計!", ok_button="加油!")


8.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” 按鍵。

8.3 ynbox()

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” 的快捷鍵使用。

8.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() 返回按鈕的文字內容。

如果使用者點選取消或者關閉視窗,那麼會返回預設選項(第一個選項)。

請看例子:

 


8.5 indexbox()

indexbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None, default_choice='Yes', cancel_choice='No')

基本跟 buttonbox() 一樣,區別就是當用戶選擇第一個按鈕的時候返回序號 0, 選擇第二個按鈕的時候返回序號 1。


8.6 boolbox()

boolbox(msg='Shall I continue?', title=' ', choices=('[Y]es', '[N]o'), image=None, default_choice='Yes', cancel_choice='No')

如果第一個按鈕被選中則返回 True,否則返回 False。

9. 如何在 buttonbox 裡邊顯示圖片

當你呼叫一個 buttonbox 函式(例如 msgbox()ynbox()indexbox() 等等)的時候,你還可以為關鍵字引數 image 賦值,可以設定一個 .gif 格式的影象(PNG 格式的影象也是支援的哦^_^):

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


10. 為使用者提供一系列選項

10.1 choicebox()

choicebox(msg='Pick an item', title='', choices=[], preselect=0, callback=None, run=True)

按鈕元件方便提供使用者一個簡單的按鈕選項,但如果有很多選項,或者選項的內容特別長的話,更好的策略是為它們提供一個可選擇的列表。   
   
choicebox() 為使用者提供了一個可選擇的列表,使用序列(元祖或列表)作為選項,這些選項會按照字母進行排序。

另外還可以使用鍵盤來選擇其中一個選項(比較糾結,但一點兒都不重要):
 

  • 例如當按下鍵盤上的 “g” 鍵,將會選中的第一個以 “g” 開頭的選項。再次按下 “g” 鍵,則會選中下一個以 “g” 開頭的選項。在選中最後一個以 “g” 開頭的選項的時候,再次按下 “g” 鍵將重新回到在列表的開頭的第一個以 “g” 開頭的選項。
  • 如果選項中沒有以 “g” 開頭的,則會選中字元排序在 “g” 之前(“f”)的那個字元開頭的選項
  • 如果選項中沒有字元的排序在 “g” 之前的,那麼在列表中第一個元素將會被選中。


結合我們之前學習的檔案操作,舉個高達上的例子(原始碼在第35講的課後作業中^_^):

 

10.2 multchoicebox()

multchoicebox(msg='Pick an item', title='', choices=[], preselect=0, callback=None, run=True)

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=None, lowerbound=0, upperbound=99, image=None, root=None)

integerbox() 為使用者提供一個簡單的輸入框,使用者只能輸入範圍內(lowerbound 引數設定最小值,upperbound 引數設定最大值)的整型數值,否則會要求使用者重新輸入。

11.3 multenterbox()

multenterbox(msg='Fill in values for the fields.', title=' ', fields=[], values=[], callback=None, run=True)

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=(), callback=None, run=True)

multpasswordbox() 跟 multenterbox() 使用相同的介面,但當它顯示的時候,最後一個輸入框顯示為密碼的形式(*):

13. 顯示文字

EasyGUI 還提供函式用於顯示文字。

13.1 textbox()

textbox(msg='', title=' ', text='', codebox=False, callback=None, run=True)

textbox() 函式預設會以比例字型(引數 codebox=True 設定為等寬字型)來顯示文字內容(自動換行),這個函式適合用於顯示一般的書面文字。

注:text 引數設定可編輯文字區域的內容,可以是字串、列表或者元祖型別。

 

13.2 codebox()

codebox(msg='', title=' ', text='')

codebox() 以等寬字型顯示文字內容(不自動換行),相當於 textbox(codebox=True)

注:等寬字型很醜的,但適合程式碼編寫,不信你試試看@[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, 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 則表示可以同時選擇多個檔案。

 

14.3 filesavebox()

filesavebox(msg=None, title=None, default='', filetypes=None)

filesavebox() 函式提供一個對話方塊,讓用於選擇檔案需要儲存的路徑(帶完整路徑哦),如果使用者選擇 “Cancel” 則返回 None。

default 引數應該包含一個檔名(例如當前需要儲存的檔名),當然也可以設定為空的,或者包含一個檔案格式掩碼的萬用字元。

filetypes 引數的設定方法請參考 fileopenbox() 函式。

15. 記住使用者的設定

15.1 EgStore

GUI 程式設計中一個常見的場景就是要求使用者設定一下引數,然後儲存下來,以便下次使用者使用你的程式的時候可以記住他的設定。

為了實現對使用者的設定進行儲存和恢復這一過程,EasyGUI 提供了一個叫做 EgStore 的類。

為了記住某些設定,你的應用程式必須定義一個類(下面案例中的 “Settings”)繼承自 EgStore 類。

然後你的應用程式必須建立一個該類的例項化物件(下面案例中的 “settings”)。

設定類的建構函式(__init__ 方法)必須初始化所有的你想要它所記住的那些值。

一旦你這樣做了,你就可以在 settings 物件中通過設定值去例項化變數,從而很簡單地記住設定。

之後使用 settings.store() 方法在硬碟上持久化儲存。

下面建立一個叫做 “Settings” 的類:
 

from easygui import EgStore

# 定義一個叫做“Settings”的類,繼承自EgStore類
class Settings(EgStore):

    def __init__(self, filename):  # 需要指定檔名
        # 指定要記住的屬性名稱
        self.author = ""
        self.book = ""

        # 必須執行下面兩個語句
        self.filename = filename
        self.restore()

# 建立“Settings”的例項化物件“settings”
settingsFilename = "settings.txt"
settings = Settings(settingsFilename)

author = "小甲魚"
book = "《零基礎入門學習Pyhon》"

# 將上面兩個變數的值儲存到“settings”物件中
settings.author = author
settings.book = book
settings.store()
print("\n儲存完畢\n")

16. 捕獲異常

exceptionbox()

使用 EasyGUI 編寫 GUI 程式,有時候難免會產生異常。當然這取決於你如何執行你的應用程式,當你的應用程式崩潰的時候,堆疊追蹤可能會被丟擲,或者被寫入到 stdout 標準輸出函式中。

EasyGUI 通過 exceptionbox() 函式提供了更好的方式去處理異常。

當異常出現的時候,exceptionbox() 會將堆疊追蹤顯示在一個 codebox() 中,並且允許你做進一步的處理。

exceptionbox() 很容易使用,下面舉個例子:

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


 

 

相關推薦

EasyGui 學習【超詳細中文版】[增強版]

翻譯改編自官方文件:http://easygui.sourceforge.net/tutorial/index.html 翻譯改編者:小甲魚,本文歡迎轉載,轉載請保證原文的完整性! 演示使用 Python 3.3.3 版本0. 安裝 EasyGui 官網:http://ea

EasyGUI 學習

目錄 由於版本更迭,本篇所有示例及截圖均已更新,最新演示版本為 EasyGUI 0.98 & Python 3.7。 注意:由於模組、Python 版本或系統環境的差異,書中涉及的演示截圖與實際環

easygui學習

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

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

Ubuntu學習 權限

表示 就是 ubuntu 復制 權限 復制代碼 數字 寫的權限 root 文件權限```rwxrwxr-- : 三組rwx 分別表示 所有者、所有組、其他人 的權限。r : 表示可讀, 可以用數字 4 來表示w : 標識可寫 ,可以用數字 2 來表示x : 表示可執行 ,

Linux學習-管理(1)

詳細信息 src 最長 mod 展開 重新啟動 upper 填充 虛擬 文件管理——當你使用Linux時,大部分時間都會和文件打交道,我們需要了解基本的文件操作,如創建文件、刪除文件、復制文件、重命名文件以及為文件創建鏈接等。目錄 文件的組成 目錄結構

Linux學習-管理(2)

mdi 批量 字符 nbsp ren 交互 替換 mkdir -p txt 九、移動、重命名文件 mv 移動文件 格式:mv+源文件+目標 -i 交互式,覆蓋前提示 -f 強制覆蓋 rm 刪除文件和目錄 -i

(獨孤九劍)--PHP視頻學習--系統

獲取文件 pen 讀取 warning 寫入 字符型 級別 fread 資源 【一】文件系統概述 文件的創建,刪除,編輯,復制,粘貼(移動),即文件的增刪改查 【二】讀取文件 打開讀取:readfile(string),傳入文件路徑即可打開讀取(如讀取成功,則返回字節數

shell學習操作之sort,cut,uniq

3linux系統使用過程中,我們經常需要對文件進行一些操作分析,例如對文本進行分類排序,去重,截取一些規則化字段。cut,sort,uniq很方便使用。 1.sort:一般有三種模式,分別為排序文本,檢查文件,合並文件。 常用方法及參數 sort [option] [file] -b,#忽略前空格或者制表

Python學習——操作和異常處理

not ret lease ext title eas err turn with # title = "Alice in Wonderland"# print(title.split())def count_words(filename): ‘‘‘ count ho

Python學習-操作

code see ref 字符 pri lines 清空 文件的 末尾 使用open函數創建文件對象, 然後就可以使用文件對象(file)常用的函數. 例: f = open(‘/path/to/targetfile/test.txt‘, mode=‘r‘, encodin

Linux(RedHat)基礎學習尋址與管理

fcc 強制 表示 命名 mv命令 追加內容 size tar tro 1.系統結構 Linux系統目錄結構 /:根目錄,linux系統中最高層目錄。在根目錄下的目錄叫

Linux(RadHat)基礎學習權限

chgrp 訪問 用戶權限 文件屬性 vpd 冒險位 images ont use 文件權限的意義:系統最底層安全設定方法之一,保證文件可以被可用的用戶作相應操作 1.文件屬性的查看 ls -l filename 等同於 ll filename (文件屬性) ls

Linux(RadHat)基礎學習傳輸

文件歸檔 路徑 遠程同步 syn code tar.xz mnt 文件上傳 進行 1.scp傳輸 scp:遠程復制傳輸,速度很慢 目錄上傳: scp -r 目錄 用戶名@主機ip:絕對路徑 文件上傳 scp 文件 用戶名@主機ip:絕對路徑 遠程下

Python學習操作

like import false 不能 pfile 返回 unicode 支持 zip 1.文件基礎知識 1.文件是存儲在外部介質上的數據的集合,文件的基本單位是字節,文件所含的字節數就是文件的長度。每個字節都有一個默認的位置,位置從0開始,文件頭的位置就是0,文件尾的位

ElasticSearch學習2018.11

1       Elasticsearch安裝 1.1    ES6.0版本安裝head外掛 1.1 下載head外掛 下載地址:https://github.com/mobz/elasticsearch-head

近期學習

node node 基礎 https://www.runoob.com/nodejs/nodejs-tutorial.html node api 查詢 http://nodejs.cn/api/ vue 基礎 https://router.vuejs.org/zh

Tushare學習(十 電影票房)

import tushare  as ts 1.實時票房 ts.realtime_boxoffice() BoxOffice 實時票房(萬) Irank 排名 MovieName 影片名 boxPer 票房佔比 (%) movieD

Tushare學習(六 新聞事件資料)

import  tushare  as  ts 1.即時新聞 ts.get_latest_news()  ,預設是80條新聞 ts.get_latest_news(數字小於八十) ts.get_latest_news(top=10,show_conten

Tushare學習(三 股票分類資料)

import tushare as ts 1.行業分類 ts.get_industry_classified()   2.概念分類 ts.get_concept_classified()   3.地域分類 ts.get_area_classified()