如何将Python Tkinter中的用户输入保存至TXT文件并读取?
解决Tkinter中API密钥保存与读取问题
修正后的完整代码
from tkinter import * from tkinter import messagebox import tweepy import time window = Tk() window.title("Tweetio") window.minsize(1000, 800) top_frame = Frame(window).pack() bottom_frame = Frame(window).pack() btns_frame = Frame(window, pady=10) btns_frame.pack() def openKey(): newwin = Toplevel(window) newwin.title('Insert API Key') newwin.geometry('500x300') # 调整高度适配按钮位置 newwin.resizable(0, 0) newwin.columnconfigure(0, pad=3) newwin.columnconfigure(1, pad=3) # 统一设置行间距 for i in range(5): newwin.rowconfigure(i, pad=6) # 创建标签 Label(newwin, text="API KEY:").grid(row=0, column=0, sticky=W) Label(newwin, text="API KEY SECRET:").grid(row=1, column=0, sticky=W) Label(newwin, text="BEARER TOKEN:").grid(row=2, column=0, sticky=W) Label(newwin, text="ACCESS TOKEN:").grid(row=3, column=0, sticky=W) Label(newwin, text="ACCESS TOKEN SECRET:").grid(row=4, column=0, sticky=W) # 分开创建Entry和布局,确保变量存储Entry实例 api_key = Entry(newwin, width=40) api_key.grid(row=0, column=1) api_secret_key = Entry(newwin, width=40) api_secret_key.grid(row=1, column=1) bearer_token = Entry(newwin, width=40) bearer_token.grid(row=2, column=1) access_token = Entry(newwin, width=40) access_token.grid(row=3, column=1) access_token_secret = Entry(newwin, width=40) access_token_secret.grid(row=4, column=1) def saveEntry(): # 获取每个输入框的内容 keys = [ api_key.get().strip(), api_secret_key.get().strip(), bearer_token.get().strip(), access_token.get().strip(), access_token_secret.get().strip() ] # 检查是否有空白项 if not all(keys): messagebox.showerror("错误", "所有字段不能为空!") return # 保存到文件 try: with open('api_keys.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(keys)) messagebox.showinfo("成功", "API密钥已保存!") newwin.destroy() except Exception as e: messagebox.showerror("保存失败", f"错误信息:{str(e)}") def loadEntry(): # 从文件读取密钥并填充到输入框 try: with open('api_keys.txt', 'r', encoding='utf-8') as f: keys = [line.strip() for line in f.readlines() if line.strip()] if len(keys) == 5: api_key.delete(0, END) api_key.insert(0, keys[0]) api_secret_key.delete(0, END) api_secret_key.insert(0, keys[1]) bearer_token.delete(0, END) bearer_token.insert(0, keys[2]) access_token.delete(0, END) access_token.insert(0, keys[3]) access_token_secret.delete(0, END) access_token_secret.insert(0, keys[4]) messagebox.showinfo("成功", "已加载保存的API密钥!") else: messagebox.showwarning("警告", "密钥文件格式错误!") except FileNotFoundError: messagebox.showwarning("提示", "未找到保存的密钥文件!") except Exception as e: messagebox.showerror("加载失败", f"错误信息:{str(e)}") # 创建按钮,修正command绑定 Button(newwin, text="保存密钥", width=20, fg="Black", bg="Gold", command=saveEntry).grid(row=5, column=1, pady=10) Button(newwin, text="加载已有密钥", width=20, fg="Black", bg="LightBlue", command=loadEntry).grid(row=6, column=1, pady=5) # 添加打开密钥窗口的按钮 Button(btns_frame, text="设置API密钥", command=openKey).pack() window.mainloop()
关键修改点说明
- Entry对象正确赋值:将
Entry().grid()拆分为两行,先创建Entry实例赋值给变量,再调用.grid()布局,确保变量能引用到输入框对象。 - 获取输入内容的方法:用Tkinter Entry的
.get()方法替代控制台的input()函数,正确获取GUI输入框的内容。 - 按钮command绑定修复:直接将
command=saveEntry绑定,确保点击按钮时执行保存函数。 - 增加输入验证:保存前检查所有字段是否为空,避免写入无效内容。
- 优化文件操作:用
'\n'.join(keys)简化写入逻辑,同时添加异常捕获,处理文件读写时的错误并给出提示。 - 补充读取功能:新增
loadEntry()函数,从文件读取密钥并自动填充到输入框,满足后续读取需求。
读取文件的单独实现(程序其他部分调用)
如果你需要在程序其他地方读取密钥,可使用以下函数:
def load_api_keys(): try: with open('api_keys.txt', 'r', encoding='utf-8') as f: keys = [line.strip() for line in f.readlines() if line.strip()] if len(keys) == 5: return { 'api_key': keys[0], 'api_secret_key': keys[1], 'bearer_token': keys[2], 'access_token': keys[3], 'access_token_secret': keys[4] } else: return None except FileNotFoundError: return None except Exception as e: print(f"读取密钥失败:{str(e)}") return None # 使用示例 keys = load_api_keys() if keys: # 初始化tweepy客户端 client = tweepy.Client( bearer_token=keys['bearer_token'], consumer_key=keys['api_key'], consumer_secret=keys['api_secret_key'], access_token=keys['access_token'], access_token_secret=keys['access_token_secret'] )
内容的提问来源于stack exchange,提问作者XFactorRazz
相关产品推荐
相关产品推荐

