申明: 本站飛宇網 https://feiyetopro.blogspot.com/。自網路收集整理之書籍、文章、影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]。謝謝!
第 6 章 GUI——圖形化使用者介面
到目前為止,我們的所有輸入和輸出都只是 IDLE 中的簡單文本。不過現代電腦和程式會使用大量的圖形。如果我們的程式中也有一些圖形就太好了。在這一章中,我們會開始建立一些簡單的 GUI。這說明從現在開始,我們的程式看上去就會像你平常熟悉的那些程式一樣,將會有視窗、按鈕之類的圖形。
6.1 什麼是 GUI
GUI 是 Graphical User
Interface(圖形化使用者介面)的縮寫。在 GUI 中,並不只是鍵入文本和返回文本,使用者可以看到視窗、按鈕、文字方塊等圖形,而且可以用滑鼠點擊,還可以通過鍵盤鍵入。我們目前為止完成的程式都是命令列或文字模式程式。GUI 是與程式交互的一種不同的方式。有 GUI 的程式仍然有 3 個基本要素:輸入、處理和輸出,但它們的輸入和輸出更豐富、更有趣一些。
順便說一句,電腦上有 GUI 當然是可以的,但是要避免粘上黏性的東西哦。否則鍵盤將無法發揮效力,也會讓鍵入很困難!
6.2 第一個 GUI
我們一直都在使用 GUI,實際上已經用過很多。Web 流覽器是 GUI,IDLE 也是 GUI。現在我們就來建立自己的 GUI。為了做到這一點,要從 EasyGui 尋求一些幫助。
EasyGui 是一個 Python 模組,利用這個模組可以很容易地建立簡單的 GUI。我們還沒有具體討論過模組(第 15 章會介紹這方面的內容),不過應該知道:模組就是一種擴展方法,通過它可以向 Python 增加非內置的內容。
如果你使用這本書的安裝程式來安裝 Python,那麼你已經安裝了 EasyGui。否則,可以從 http://easygui.sourceforge.net/ 下載。
安裝 EasyGui
可以下載 easygui.py 或者一個包含 easygui.py 的 zip 文件。要安裝這個模組,只需要把檔 easygui.py 放在 Python 能找到的位置。這個位置是哪裡呢?
Python 路徑
Python 會在硬碟上的一組位置中查找可以使用的模組。這個工作可能有些複雜,因為在 Windows、Mac OS X 和 Linux 上,所查找的這組位置各不相同。不過,如果把 easygui.py 放在 Python 安裝的位置中,Python 肯定能找到它。所以,要在你的硬碟上查找一個名叫 Python27 的資料夾,再把 easygui.py 放在這個資料夾裡。
建立 GUI
啟動 IDLE,在交互模式鍵入以下命令:
>>>
import easygui
這會告訴 Python 你打算使用 EasyGui 模組。如果沒有得到錯誤消息,說明 Python 找到了 EasyGui 模組。如果收到一個錯誤消息,或者 EasyGui 看上去無效,可以訪問本書網站(www.helloworldbook2.com),從中可以找到一些其他的幫助。
現在來建立一個包含 OK 按鈕的簡單訊息方塊:
>>>
easygui.msgbox("Hello There!")
EasyGui msgbox() 函數用於創建一個訊息方塊。大多數情況下,EasyGui 函數的名就是相應英語單詞的縮寫。
使用 msgbox() 時,會看到類似這樣的結果:
如果點擊 OK 按鈕,這個訊息方塊會關閉。
6.3 GUI 輸入
我們只看過一種 GUI 輸出,就是一個訊息方塊。不過輸入呢?還可以使用 EasyGui 得到輸入。
在交互模式中運行前面的例子時,你點擊 OK 按鈕了嗎?如果點擊了這個按鈕,應該已經在 shell 或終端或命令視窗中見過這樣的結果:
>>>
import easygui
>>>
easygui.msgbox("Hello there!")
'OK'
'OK' 部分就是 Python 和 EasyGui 在告訴你:使用者點擊了 OK 按鈕。EasyGui 會返回資訊來告訴你使用者在 GUI 中做了什麼:點擊了什麼按鈕,鍵入了哪些內容等等。可以為這個響應指定一個名字(把它賦給一個變數)。試試看:
>>>
user_response = easygui.msgbox("Hello there!")
在訊息方塊中點擊 OK 將它關閉。然後鍵入:
>>>
print user_response
OK
現在用戶的響應(OK)有了一個變數名 user_response。下面再來看其他幾種使用 EasyGui 得到輸入的方法。
我們剛才看到的訊息方塊實際上只是對話方塊(dialog box)的一個例子。對話方塊包含一些 GUI 元素,用來告訴使用者某些資訊,或者從使用者得到一些輸入。輸入可以是按鈕點擊(如 OK),或者檔案名,也可以是某個文本(字串)。
EasyGui msgbox 就是包含一條消息和一個 OK 按鈕的對話方塊。不過還可以有不同類型的對話方塊,包含更多的按鈕和其他內容。
6.4 選擇你的口味
我們將舉一個挑選霜淇淋口味的例子來學習利用 EasyGui 從用戶得到輸入(霜淇淋口味)的不同方法。
有多個按鈕的對話方塊
下面來創建一個包含多個按鈕的對話方塊(如訊息方塊)。具體做法是使用一個按鈕框(button box ,buttonbox)。下面來建立一個程式,而不是在交互模式中完成。
在 IDLE 中新建一個檔。鍵入代碼清單 6-1 中的程式。
代碼清單 6-1 使用按鈕得到輸入
方括號中的代碼稱為一個列表(list)。我們還沒有討論清單,這部分內容將在第 12 章介紹。對現在來說,只需要鍵入這些代碼,讓這個 EasyGui 程式能夠工作(如果你確實很好奇,也可以跳到第 12 章看個究竟……)。
保存檔(我的檔就命名為 ice_cream1.py),運行這個程式,你就會看到下邊這個介面。
然後,根據你選擇的口味,你會看到下圖這樣的結果了。
這是怎麼做到的?使用者點擊的按鈕的標籤就是輸入(input)。我們為這個輸入指定了一個變數名,在這裡就是 flavor。這就像使用 raw_input(),只不過用戶並不是鍵入,而是點擊一個按鈕。這正是 GUI 的關鍵。
選擇框
下面來看用戶選擇口味的另一種方法。EasyGui 提供了一種選擇框(choice box,choicebox),它會顯示一個選擇清單。使用者可以選擇其中之一,然後點擊 OK 按鈕。
要嘗試選擇框,只需要對代碼清單 6-1 中的程式做一個很小的修改:把 buttonbox 改為 choicebox。這個新版本的程式見代碼清單 6-2。
代碼清單 6-2 使用選擇框得到輸入
import
easygui
flavor
= easygui.choicebox("What is your favorite ice cream flavor?",
choices = ['Vanilla',
'Chocolate', 'Strawberry'] )
easygui.msgbox
("You picked " + flavor)
保存代碼清單 6-2 中的程式並運行。你會看到類似下圖的結果。
選擇一個口味然後點擊 OK 時,你會看到與前面相同的訊息方塊。注意,除了用滑鼠點擊選擇,還可以用鍵盤上的上下方向鍵選擇一個口味。
如果點擊 Cancel,程式會結束,你還會看到一個錯誤。這是因為程式的最後一行希望得到某個文本(如 Vanilla),倘若你點擊 Cancel,它將得不到任何輸入。
我也遇到了同樣的問題。不過因為在這本書裡放上這個巨大的選擇框不太合適,所以我耍了點小聰明,稍稍做了點處理!我修改了 easygui.py,讓選擇框變小一些,這樣放在這本書裡看上去會好一些。你不需要這麼做,但如果你確實想試試看,下面我就把步驟告訴你。不過提醒你一句,這可有點複雜哦!
1. 找出 easygui.py 文件中以 def__choicebox 開頭的一節(在我的 easygui.py 中大約在 934 行)。要記住,大多數編輯器,都會在靠近視窗最下面的某個位置顯示出代碼行號。
2. 從這個位置向下大約 30 行(大概是 970 行),會看到類似下面的代碼行:
root_width
= int((screen_width * 0.8))
root_height
= int((screen_height * 0.5))
3. 把 0.8 改為 0.4,再把 0.5 改成 0.25。保存對 easygui.py 做的這些修改。下一次運行程式時,選擇框視窗就會小一些了。
文本輸入
這一章中的例子允許用戶從你(程式師)提供的一組選項中做出選擇。如果你想像 raw_input() 一樣(也就是讓使用者鍵入文本),該怎麼做呢?這樣用戶就可以輸入自己喜歡的任何口味了。EasyGui 提供了一種輸入框(enter box ,enterbox)能夠做到這一點。可以試試代碼清單 6-3 中的程式。
代碼清單 6-3 使用輸入框得到輸入
import
easygui
flavor
= easygui.enterbox("What is your favorite ice cream flavor?")
easygui.msgbox
("You entered " + flavor)
運行這個程式時,你會看到:
然後鍵入你最喜歡的口味,點擊 OK,就像前面一樣,你鍵入的內容會顯示在訊息方塊中。
這就類似於 raw_input(),同樣可以從使用者得到文本(一個字串)。
默認輸入
有時使用者輸入資訊時,可能會期望得到某個答案,或者有一個很常見或最可能輸入的答案。這稱為預設值(default)。這個最常見的答案可以由你為用戶自動輸入,這樣用戶就不用再鍵入了。有了預設值,只有當用戶有不同的輸入時才有必要鍵入。
要在一個輸入框中放入預設值,可以按照代碼清單 6-4 修改你的程式。
代碼清單 6-4 如何建立默認參數
現在運行這個程式時,輸入框中已經輸入了“Vanilla”(香草)。可以把它刪掉,再輸入你想要的內容,不過如果你最喜歡的口味確實是香草,就不用再鍵入任何內容,只需點擊 OK。
數字呢
如果想在 EasyGui 中輸入一個數,完全可以先通過輸入框得到一個字串,然後使用 int() 或者 float() 由這個字串創建一個數(就像第 4 章中的做法一樣)。
EasyGui 還提供了一種整數框(integer box ,integerbox),可以用它來輸入整數。還可以對所輸入的數設置一個下界和上界。
不過,整數框不允許輸入浮點數(小數)。要輸入小數,必須先通過輸入框得到字串,然後再使用 float() 轉換這個字串。
6.5 再看猜數遊戲……
第 1 章中,我創建了一個簡單的猜數程式。下面再來完成這個程式,不過這一次我們要使用 EasyGui 完成輸入和輸出。代碼清單 6-5 顯示了這個程式的代碼。
代碼清單 6-5 使用 EasyGui 的猜數遊戲
我們還沒有全面學習這個程式中各個部分是如何工作的,不過你可以先鍵入這個程式,試試看。運行程式時你會看到:

我們將在第 7 章學習 if、else 和 elif 的內容。第 8 章介紹 while,random 會在第 15 章講到。另外我們還會在第 23 章大量使用 random。
EasyGui 還提供了另外一些 GUI 元件,包括允許多重選擇(而不是只選擇一項)的選擇框,還有一些特殊的對話方塊用來得到檔案名等內容。不過,對現在來說,前面介紹的 GUI 組件已經足夠了。
利用 EasyGui,我們可以非常容易地生成一些簡單的 GUI,而且它隱藏了 GUI 涉及的很多複雜性,使你不用再操心這些問題。後面我們將會討論建立 GUI 的另一種方法,它可以提供更多的靈活性和控制。
如果你想更多地瞭解 EasyGui,可以訪問 EasyGui 主頁 easygui.sourceforge.net。
像(Python)程式師一樣思考
如果你想瞭解有關 Python 使用的更多內容,比如 EasyGui(或任何其他方面),有一個好消息告訴你:Python 提供了一個內置的説明系統,也許你可以試一試。
在交互模式中,可以在交互提示符後面鍵入
>>>help()
就會進入這個説明系統。現在提示符會變成:
help
>
一旦進入説明系統,你想要得到哪方面的幫助,只需要鍵入相應的名字,例如:
help>
time.sleep
或者
help>
easygui.msgbox
你就會得到你想要的一些資訊。
要退出説明系統,重回正常的交互提示符,只需要鍵入 quit:
help>
quit
>>>
有些幫助讀起來很費勁,也很難理解,你往往找不到你想找的東西。不過如果你要找 Python 中某個方面的更多資訊,這個説明系統還是值得試一試。
你學到了什麼
在這一章,你學到了以下內容。
·
如何利用 EasyGui 建立簡單的 GUI。
·
如何使用訊息方塊 msgbox 顯示消息。
·
如何使用按鈕、選擇框和文本輸入框(buttonbox、choicebox、enterbox、integerbox)得到輸入。
·
如何為一個文字方塊設置默認輸入。
·
如何使用 Python 的內置説明系統。
測試題
1. 如何使用 EasyGui 生成訊息方塊?
2. 如何使用 EasyGui 得到字串(一些文本)輸入?
3. 如何使用 EasyGui 得到整數輸入?
4. 如何使用 EasyGui 得到浮點數(小數)輸入?
5. 什麼是預設值?給出一個可能使用預設值的例子。
動手試一試
1. 試著修改第 5 章中的溫度轉換程式,這一次要用 GUI 輸入和輸出而不是 raw_input() 和 print。
2. 編寫一個程式,詢問你的姓名,然後是房間號、街道和城市,接下來是省 / 地區 / 州,最後是郵遞區號(所有這些都放在 EasyGui 對話方塊中)。然後這個程式要顯示一個寄信格式的完整位址,類似於:
John
Snead
28
Main Street
Akron,
Ohio
12345













0 留言:
發佈留言