Tkinter自生成按钮重启GUI后不持久化问题咨询
实现方案
我们用Python内置的SQLite做轻量持久化存储,无需额外依赖,修改后的完整代码如下:
from tkinter import * import sqlite3 # 数据库初始化 def init_db(): conn = sqlite3.connect('buttons.db') c = conn.cursor() # 表不存在就创建,仅存储按钮文本即可 c.execute('''CREATE TABLE IF NOT EXISTS buttons (id INTEGER PRIMARY KEY AUTOINCREMENT, f_name TEXT)''') conn.commit() conn.close() # 加载历史按钮 def load_history_buttons(frame): conn = sqlite3.connect('buttons.db') c = conn.cursor() c.execute('SELECT f_name FROM buttons ORDER BY id ASC') records = c.fetchall() conn.close() # 遍历所有历史记录生成按钮 for record in records: auto_button = Button(frame, text=record[0]) auto_button.pack(side="top") # 主程序部分 root = Tk() root.title('Button') root.geometry('400x400') # 启动先初始化数据库 init_db() #Entry & Label f_name = Entry(root, width=30) f_name.grid(row=0, column=1) f_name_lbl = Label(root, text="First Name:") f_name_lbl.grid(row=0, column=0) # 修改生成按钮函数,新增写入数据库逻辑 def gen_button(): btn_text = f_name.get().strip() if btn_text: # 空内容不生成按钮 # 生成UI按钮 auto_button = Button(button_frame, text=btn_text) auto_button.pack(side="top") # 写入数据库持久化存储 conn = sqlite3.connect('buttons.db') c = conn.cursor() c.execute('INSERT INTO buttons (f_name) VALUES (?)', (btn_text,)) conn.commit() conn.close() # 清空输入框方便下次输入 f_name.delete(0, END) submit_btn = Button(root, text="Submit:", command=gen_button) submit_btn.grid(row=1, column=0, columnspan=2, ipadx=100) button_frame = Frame(root) button_frame.grid(row=2, column=0, columnspan=2, sticky="nsew") # 启动时加载所有历史按钮 load_history_buttons(button_frame) root.mainloop()
核心逻辑说明
- 数据库初始化:程序启动时先创建存储按钮数据的表,重复启动不会重复建表报错
- 历史按钮加载:单独封装按钮加载函数,启动时从数据库按生成顺序读取所有历史按钮文本,逐个生成UI按钮
- 提交逻辑优化:点击提交时先校验输入非空,生成按钮的同时把按钮文本写入数据库,保证重启后可读取
- 所有依赖都是Python标准库,无需额外安装第三方包
内容的提问来源于stack exchange,提问作者EvlSmasher
相关产品推荐
相关产品推荐

