Python 入門指南 5.0
單元 36 - 完成版的 EncryptController
我們發展編碼軟體的運算核心為 Encrypt 類別 (class) ,放在 encrypt 模組 (module) 中,至於使用者介面為 EncryptView 類別,這放在 encrypt_view 模組,負責 Encrypt 與 EncryptView 溝通的則是 EncryptController 類別,放在 encrypt_controller 模組
Encrypt
encrypt_view.py
EncryptView
encrypt_controller.py
EncryptController
單元 34 建置 EncryptView 的新建 、 編碼 及 解碼 按鈕,單元 35 完成 存檔 及 載入 按鈕,現在剩下 清除 與 拷貝 兩個按鈕還沒實際實作功能。
完整程式請參考「範例程式碼」的 encrypt.py 、 encrypt_view.py 及 encrypt_controller.py 。
清除 的目的就是用來清除使用者 (user) 輸入與結果,程式如下
125 127 129 131 133 135 137 139 141 | def clear_method(self):
self.e = None
self.userinput = ""
self.result = ""
self.app.input_field.delete(0, 200)
self.app.output_field.config(state="abled")
self.app.output_field.delete(0, 200)
self.app.output_field.config(state="disabled")
self.app.display_text["text"] = "已清除!"
|
這裡除了將 userinput 、 result 設定為空字串 (string) , input_field 與 output_field 呼叫 delete() 刪除 0 到 200 之間的字元內容, e 也重新設定為 None
125 | self.e = None
|
output_field 同樣要先解鎖,然後呼叫 delete() 刪除,最後再鎖上。
因此使用者點擊 清除 之後,所有設定都會歸零,如果要編碼或解碼文字必須重新輸入文字,也都得 新建 或 載入 ,才能順利 編碼 或 解碼 。
清除工作完畢,訊息欄顯示 "已清除!" 。
141 | self.app.display_text["text"] = "已清除!"
|
拷貝 則是把編碼結果拷貝到系統剪貼簿,當然,如果使用者沒有按過 編碼 或 解碼 , result 就會是空字串,這樣拷貝是沒有意義的,因此這裡先做個條件判斷
144 146 148 149 151 153 155 | def copy_method(self):
if self.result == "":
self.app.display_text["text"] = "無法拷貝!"
else:
self.app.clipboard_clear()
self.app.clipboard_append(self.result)
self.app.display_text["text"] = "已拷貝!"
|
如果不是空字串就會進行拷貝到剪貼簿的動作,這裡是用 Tk 本身 Frame 類別的 clipboard_append() 方法 (method) ,然後直接以 self.result 當參數 (parameter)
153 | self.app.clipboard_append(self.result)
|
這裡同樣是先呼叫 clipboard_clear() 來先清空剪貼簿內容。
來執行看看囉!下面是 清除
下面是 拷貝
拷貝過後就可以貼到其他地方
好了,我們已經學完開發功能完整的「編密碼小工具」了,下一單元繼續介紹第三方程式庫 (third-party library) 及 Brython 。
中英文術語對照 | |
---|---|
類別 | class |
方法 | method |
模組 | module |
參數 | parameter |
字串 | string |
第三方程式庫 | third-party library |
使用者 | user |
重點整理 |
---|
1. 運算核心 M 為 Encrypt 類別,放在 encrypt 模組,使用者介面 V 為 EncryptView 類別,這放在 encrypt_view 模組,控制運算核心跟使用者介面的 C 為 EncryptController ,放在 encrypt_controller 模組,三個模組各有各自專屬的任務。 |
2. 清除就是清除所有輸入,也就是將所有設定歸零。 |
3. 拷貝到系統剪貼簿是利用 Tk 提供的 clipboard_append() 方法。 |
問題與討論 |
---|
1. 清除的目的是清空所有輸入及輸出,除了上面所提的方式外,有更好的方式嗎? |
2. 為什麼拷貝到系統剪貼簿前要先呼叫 clipboard_clear() 方法? |
練習 |
---|
1. 寫一個程式 exercise3601.py ,設計鬥獸棋模擬的 GUI ,並且利用單元 29 練習 6 的 generate_result() 函數,讓按下按鈕就進行鬥獸棋模擬。 參考程式碼 |
2. 承上題,將新程式寫在 exercise3602.py 中,在模擬進行時鎖住按鈕。 參考程式碼 |
3. 承上題,將新程式寫在 exercise3603.py 中,利用第三方程式庫 keyboard 接收使用者上下左右鍵的輸入,以此改寫 generate_result() 函數,在命令列操作鼠進行遊戲。 參考程式碼 |
4. 承上題,將新程式寫在 exercise3604.py 中,由於新版的 generate_result() 難以套用到 Tk 視窗,因此改成用 root 物件的 bind() 方法連結上下左右鍵到上下左右移動相對應的方法,並且在棋盤上放上鼠與上下左右按鈕,讓使用者操作移動。 參考程式碼 |
5. 承上題,將新程式寫在 exercise3605.py 中,繼續在棋盤上加入其他三隻動物。 參考程式碼 |
6. 承上題,將新程式寫在 exercise3606.py 中,繼續加入互吃規則。 參考程式碼 |
7. 承上題,將新程式寫在 exercise3607.py 中,在使用者操作的鼠被吃掉後鎖住上下左右按鈕,並且取消按鍵連結。 參考程式碼 |
8. 承上題,將新程式寫在 exercise3608.py 中,隨機選擇其他三隻動物的任意一隻,然後以隨機方向移動。 參考程式碼 |
9. 承上題,將新程式寫在 exercise3609.py 中,設定遊戲結束的方式。 參考程式碼 |
10. 承上題,將新程式寫在 exercise3610.py 中,加入開始遊戲的按鈕以及相對應的程式碼,讓遊戲可以重複進行。 參考程式碼 |