Python 入門指南 5.0

單元 36 - 完成版的 EncryptController

~~學習進度表~~

我們發展編碼軟體的運算核心為 Encrypt 類別 (class) ,放在 encrypt 模組 (module) 中,至於使用者介面為 EncryptView 類別,這放在 encrypt_view 模組,負責 EncryptEncryptView 溝通的則是 EncryptController 類別,放在 encrypt_controller 模組

encrypt.py
     Encrypt
encrypt_view.py
     EncryptView
encrypt_controller.py
     EncryptController

單元 34 建置 EncryptView新建編碼解碼 按鈕,單元 35 完成 存檔載入 按鈕,現在剩下 清除拷貝 兩個按鈕還沒實際實作功能。

完整程式請參考「範例程式碼」的 encrypt.pyencrypt_view.pyencrypt_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"] = "已清除!"

這裡除了將 userinputresult 設定為空字串 (string) , input_fieldoutput_field 呼叫 delete() 刪除 0200 之間的字元內容, 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 練習 6generate_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 中,加入開始遊戲的按鈕以及相對應的程式碼,讓遊戲可以重複進行。 參考程式碼

上一頁 單元 35 - 存檔與載入
回 Python 入門指南 5.0 首頁
下一頁 單元 37 - 認識第三方程式庫與 Brython
回 Python 教材首頁
回程式語言教材首頁