You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:20:24