Python 入門指南 5.0

encrypt_controller.py

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# 從標準程式庫 tkinter 引入 Tk
from tkinter import Tk
# 從自定義模組 encrypt 引入 Encrypt
from encrypt import Encrypt
# 從自定義模組 encrypt_view 引入 EncryptView
from encrypt_view import EncryptView
# 從標準程式庫引入 os
import os

# Encrypt 的 Controller 類別
class EncryptController:
    # 設定初值
    def __init__(self):
        # 連結編碼物件的屬性
        self.e = None
        # 暫存使用者輸入的屬性
        self.userinput = ""
        # 暫存編碼結果的屬性
        self.result = ""
        # 設定 EncryptView 屬性
        self.app = EncryptView(master=Tk())
        # 設定按鈕的事件連結方法
        self.app.new_button["command"] = self.new_method
        self.app.load_button["command"] = self.load_method
        self.app.save_button["command"] = self.save_method
        self.app.encode_button["command"] = self.encode_method
        self.app.decode_button["command"] = self.decode_method
        self.app.clear_button["command"] = self.clear_method
        self.app.copy_button["command"] = self.copy_method
        # 呼叫維持視窗運作的 mainloop()
        self.app.mainloop()

    # 按下新建按鈕的事件
    def new_method(self):
        # 建立新的密碼屬性
        self.e = Encrypt()
        # 在底下訊息欄顯示密碼表
        self.app.display_text["text"] = self.e

    # 按下載入按鈕的事件
    def load_method(self):
        # 先測試檔案是否存在
        if os.path.exists("./code.txt"):
            # 檔案存在就進行載入工作
            with open('./code.txt', 'r') as f:
                # 讀取檔案第一行的密碼表
                code = f.readline()
            # 重新建立密碼屬性
            self.e = Encrypt(code)
            # 在底下狀態列顯示密碼表
            self.app.display_text["text"] = self.e
        else:
            # 在底下狀態列顯示檔案不存在的提示訊息
            self.app.display_text["text"] = "無法載入!"

    # 按下儲存按鈕的事件
    def save_method(self):
        # 先測試是否有按過新建按鈕
        if self.e == None:
            # 在底下狀態列顯示無法儲存的提示訊息
            self.app.display_text["text"] = "無法儲存!"
        else:
            # 有按過新建按鈕就進行存檔工作
            with open('./code.txt', 'w') as f:
                # 將密碼表寫入檔案的第一行
                f.write(str(self.e)[6:])
            # 在底下狀態列顯示工作完成的訊息
            self.app.display_text["text"] = "完成存檔!"

    # 按下編碼按鈕的事件
    def encode_method(self):
        # 取得使用者輸入
        self.userinput = self.app.input_field.get()
        # 先測試使用者是否有輸入
        if self.userinput == "":
            # 在底下狀態列顯示相關訊息
            self.app.display_text["text"] = m = "沒有輸入!"
        else:
            # 再測試是否有按過新建按鈕
            if self.e == None:
                # 在底下狀態列顯示相關訊息
                self.app.display_text["text"] = "沒有密碼物件!"
            else:
                # 使用者有輸入並且有按過新建按鈕
                self.result = self.e.toEncode(self.userinput)
                # 解鎖輸出欄位
                self.app.output_field.config(state="abled")
                # 刪除輸出欄位前 200 個字元
                self.app.output_field.delete(0, 200)
                # 將編碼結果顯示在輸出欄位
                self.app.output_field.insert(0, self.result)
                # 重新鎖著輸出欄位
                self.app.output_field.config(state="disabled")
                # 在底下狀態列顯示相關訊息
                self.app.display_text["text"] = "編碼成功!"

    # 按下解碼按鈕的事件
    def decode_method(self):
        # 取得使用者輸入
        self.userinput = self.app.input_field.get()
        # 先測試使用者是否有輸入
        if self.userinput == "":
            # 在底下狀態列顯示相關訊息
            self.app.display_text["text"] = "沒有輸入!"
        else:
            # 再測試是否有按過新建按鈕
            if self.e == None:
                # 在底下狀態列顯示相關訊息
                self.app.display_text["text"] = "沒有密碼物件!"
            else:
                # 使用者有輸入並且有按過新建按鈕
                self.result = self.e.toDecode(self.userinput)
                # 解鎖輸出欄位
                self.app.output_field.config(state="abled")
                # 刪除輸出欄位前 200 個字元
                self.app.output_field.delete(0, 200)
                # 將解碼結果顯示在輸出欄位
                self.app.output_field.insert(0, self.result)
                # 重新鎖著輸出欄位
                self.app.output_field.config(state="disabled")
                # 在底下狀態列顯示相關訊息
                self.app.display_text["text"] = "解碼成功!"

    # 按下清除按鈕的事件
    def clear_method(self):
        # 將密碼屬性設定為 None
        self.e = None
        # 將暫存使用者輸入的屬性設定為空字串
        self.userinput = ""
        # 將暫存編碼結果的屬性設定為空字串
        self.result = ""
        # 刪除輸出入欄位前 200 個字元
        self.app.input_field.delete(0, 200)
        # 解鎖輸出欄位
        self.app.output_field.config(state="abled")
        # 刪除輸出欄位前 200 個字元
        self.app.output_field.delete(0, 200)
        # 重新鎖著輸出欄位
        self.app.output_field.config(state="disabled")
        # 在底下狀態列顯示清除成功的訊息
        self.app.display_text["text"] = "已清除!"

    # 按下拷貝按鈕的事件
    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"] = "已拷貝!"

# GUI 執行部分
if __name__ == '__main__':
    # 建立 EncryptController 物件
    app = EncryptController()

# 檔名: encrypt_controller01.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 6 月

上一頁 encrypt_view.py
回 Python 入門指南 5.0 首頁
下一頁 index.html
回 Python 教材首頁
回程式語言教材首頁