如何用Tkinter获取Entry组件二进制文本?按钮点击无响应求助
问题分析与解决方案
核心问题1:Save Key按钮无响应
你的save_button定义时犯了典型错误:command参数传入了函数执行结果(带括号),而非函数本身。这会导致程序启动时就自动执行save_key_to_file(),点击按钮时反而没有绑定任何触发逻辑。
修复:
将command=save_key_to_file()改为command=save_key_to_file
核心问题2:Entry.get()无输出/内容异常
Fernet.generate_key()返回的是bytes类型,直接插入Entry会被自动转为带b''前缀的字符串(比如b'abc123')。如果没点击Generate Key按钮,Entry是空的,get()自然无输出;即使生成了key,直接获取的字符串带b'',后续encode会得到错误的二进制数据。
修复:
修改generate_key函数,将bytes转成UTF-8字符串后再插入Entry:
def generate_key(): key = Fernet.generate_key() key_entry.delete(0,"end") # 将二进制key解码为字符串,去掉b''前缀 key_entry.insert(0, key.decode('utf-8'))
从Entry获取二进制文本的正确方式
Entry只能存储字符串,获取后需将字符串重新编码为bytes:
# 从Entry获取字符串,再编码为二进制 key_str = key_entry.get().strip() key_bytes = key_str.encode('utf-8')
注意:若从文件加载二进制key,需先解码为字符串再插入Entry,保证格式统一。
额外修复:Load Key函数的错误
原select_key函数语法错误,正确加载逻辑如下:
def select_key(): try: with open("file.key", "rb") as file: key_bytes = file.read() key_entry.delete(0, "end") key_entry.insert(0, key_bytes.decode('utf-8')) except FileNotFoundError: print("未找到file.key文件")
同时给Load按钮绑定该函数:load_button = tk.Button(..., command=select_key)
修改后的完整代码
from tkinter import filedialog import tkinter as tk from tkinter import * from cryptography.fernet import Fernet import pyperclip import os root = Tk() key_entry = tk.Entry(root, bg="grey", fg="green", width="50") key_entry.place(x=35, y=100) def select_key(): try: with open("file.key", "rb") as file: key_bytes = file.read() key_entry.delete(0, "end") key_entry.insert(0, key_bytes.decode('utf-8')) except FileNotFoundError: print("未找到file.key文件") def generate_key(): key = Fernet.generate_key() key_entry.delete(0,"end") # 将二进制key解码为字符串插入Entry key_entry.insert(0, key.decode('utf-8')) def save_key_to_file(): key_str = key_entry.get().strip() print(key_str) if not key_str: print("请先生成或输入密钥") return key_bytes = key_str.encode('utf-8') with open("file.key", "wb") as file: file.write(key_bytes) print("密钥已保存到file.key") # 修复Load按钮的command绑定 load_button = tk.Button(root, text="Load Key", state="normal", borderwidth=0, bg="black", fg="green", activebackground='#2e2e2e', activeforeground="green", command=select_key) load_button.place(x=359, y=130) # 修复Save按钮的command参数(去掉括号) save_button = tk.Button(root, command=save_key_to_file, text="Save Key", state="normal", borderwidth=0, bg="black", fg="green", activebackground='#2e2e2e', activeforeground="green") save_button.place(x=270, y=130) def button_clicked(): generate_key() button = tk.Button(text="Generate key", borderwidth=0, bg="black", fg="green", activebackground='#2e2e2e', activeforeground="green", command=button_clicked) button.place(x=35, y=130) root.mainloop()
内容的提问来源于stack exchange,提问作者P1xelCyber
相关产品推荐
相关产品推荐

