发现PySide6文本输入框又有个BUG

 今天又发现一个坑,当QLineEdit设置了Validator后,editingFinished事件不能被触发。注释掉Validator后,事件响应恢复正常。

很好,这是一个具有挑战性的项目,需要使用 Python 的 GUI 框架,同时深入了解块加密算法。我将为你提供一些代码框架和实现思路。 首先,让我们讨论一下界面设计。你可以使用 Tkinter、PySide、PyQt 或 wxPythonPython GUI 框架来创建界面。在这里,我们将使用 Tkinter。下面是一个简单的代码示例: ```python import tkinter as tk class Application(tk.Tk): def __init__(self): super().__init__() # 创建菜单栏 menubar = tk.Menu(self) filemenu = tk.Menu(menubar, tearoff=0) filemenu.add_command(label="打开", command=self.open_file) filemenu.add_command(label="保存", command=self.save_file) filemenu.add_separator() filemenu.add_command(label="退出", command=self.quit) menubar.add_cascade(label="文件", menu=filemenu) # 创建工具栏 toolbar = tk.Frame(self, bd=1, relief=tk.RAISED) encrypt_button = tk.Button(toolbar, text="加密", command=self.encrypt_file) decrypt_button = tk.Button(toolbar, text="解密", command=self.decrypt_file) encrypt_button.pack(side=tk.LEFT, padx=2, pady=2) decrypt_button.pack(side=tk.LEFT, padx=2, pady=2) toolbar.pack(side=tk.TOP, fill=tk.X) # 创建文本框 self.text = tk.Text(self) self.text.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True) def open_file(self): pass def save_file(self): pass def encrypt_file(self): pass def decrypt_file(self): pass if __name__ == "__main__": app = Application() app.mainloop() ``` 在这个例子中,我们创建了一个继承自 `tk.Tk` 的 `Application` 类,并在构造函数中创建了菜单栏、工具栏和文本框。我们还定义了一些回调函数来处理打开、保存、加密和解密文件的事件。这些函数现在还没有实现,我们将在下面的步骤中逐一实现它们。 接下来,让我们讨论一下块加密算法。在这里,我们将使用 PyCrypto 库中的 DES 算法。首先,你需要安装 PyCrypto 库: ``` pip install pycrypto ``` 然后,使用下面的代码创建一个 DES 加密器和解密器: ```python from Crypto.Cipher import DES def pad_data(data, block_size): padding_size = block_size - len(data) % block_size padding = chr(padding_size) * padding_size return data + padding.encode() def unpad_data(data): padding_size = data[-1] return data[:-padding_size] def encrypt_data(data, key): cipher = DES.new(key, DES.MODE_ECB) padded_data = pad_data(data, DES.block_size) return cipher.encrypt(padded_data) def decrypt_data(data, key): cipher = DES.new(key, DES.MODE_ECB) padded_data = cipher.decrypt(data) return unpad_data(padded_data) ``` 在这个例子中,我们定义了一些辅助函数来填充和取消填充数据,并使用 PyCrypto 库中的 `DES.new` 函数创建一个 DES 加密器和解密器。我们使用电子密码本 (ECB) 模式进行加密和解密。 现在,我们可以实现 `open_file`、`save_file`、`encrypt_file` 和 `decrypt_file` 方法。在 `open_file` 方法中,我们可以使用 `tkinter.filedialog` 模块打开一个文件选择对话框,然后读取选定的文件并在文本框中显示出来。在 `save_file` 方法中,我们可以使用相同的方法保存文本框中的内容。在 `encrypt_file` 和 `decrypt_file` 方法中,我们可以使用上面定义的 `encrypt_data` 和 `decrypt_data` 函数加密或解密文本框中的内容,然后将结果显示在文本框中。 下面是完整的代码示例: ```python import tkinter as tk import tkinter.filedialog from Crypto.Cipher import DES class Application(tk.Tk): def __init__(self): super().__init__() # 创建菜单栏 menubar = tk.Menu(self) filemenu = tk.Menu(menubar, tearoff=0) filemenu.add_command(label="打开", command=self.open_file) filemenu.add_command(label="保存", command=self.save_file) filemenu.add_separator() filemenu.add_command(label="退出", command=self.quit) menubar.add_cascade(label="文件", menu=filemenu) # 创建工具栏 toolbar = tk.Frame(self, bd=1, relief=tk.RAISED) encrypt_button = tk.Button(toolbar, text="加密", command=self.encrypt_file) decrypt_button = tk.Button(toolbar, text="解密", command=self.decrypt_file) encrypt_button.pack(side=tk.LEFT, padx=2, pady=2) decrypt_button.pack(side=tk.LEFT, padx=2, pady=2) toolbar.pack(side=tk.TOP, fill=tk.X) # 创建文本框 self.text = tk.Text(self) self.text.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True) def open_file(self): file_path = tkinter.filedialog.askopenfilename() if file_path: with open(file_path, "rb") as f: data = f.read() self.text.delete("1.0", tk.END) self.text.insert(tk.END, data) def save_file(self): file_path = tkinter.filedialog.asksaveasfilename() if file_path: with open(file_path, "wb") as f: data = self.text.get("1.0", tk.END).encode() f.write(data) def encrypt_file(self): key = b"12345678" # 8 字节密钥 data = self.text.get("1.0", tk.END).encode() encrypted_data = encrypt_data(data, key) self.text.delete("1.0", tk.END) self.text.insert(tk.END, encrypted_data) def decrypt_file(self): key = b"12345678" # 8 字节密钥 data = self.text.get("1.0", tk.END).encode() decrypted_data = decrypt_data(data, key) self.text.delete("1.0", tk.END) self.text.insert(tk.END, decrypted_data.decode()) def pad_data(data, block_size): padding_size = block_size - len(data) % block_size padding = chr(padding_size) * padding_size return data + padding.encode() def unpad_data(data): padding_size = data[-1] return data[:-padding_size] def encrypt_data(data, key): cipher = DES.new(key, DES.MODE_ECB) padded_data = pad_data(data, DES.block_size) return cipher.encrypt(padded_data) def decrypt_data(data, key): cipher = DES.new(key, DES.MODE_ECB) padded_data = cipher.decrypt(data) return unpad_data(padded_data) if __name__ == "__main__": app = Application() app.mainloop() ``` 这个程序还有很多可以改进的地方,例如添加密码输入框来输入密钥,添加进度条来显示加密和解密进度,添加文件类型过滤器等等。现在,你可以根据自己的需要进行扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值