如何将Tkinter GUI多控件表单数据保存至文本文件?
Tkinter表单数据保存为指定格式文本文件的实现
问题背景
作为Tkinter新手,已开发包含Entry、Spinbox、OptionMenu、Radiobutton的表单,需要点击Save按钮将所有控件数据保存为指定格式的文本文件,现有on_save函数未完成,仅找到CSV保存示例,无对应文本格式保存方案。
目标文本格式
Generic Data Scenario ID = Scenario 1 Integer Value = 51 Options = The Other Thing Choice = T
现有代码(含语法错误)
import tkinter as tk from tkinter import ttk variables = dict() root = tk.Tk() root.title('Generic Form') root.columnconfigure(0, weight=1) ttk.Label(root, text='Generic Form', font=("TkDefaultFont", 16)).grid() drf = ttk.Frame(root) drf.grid(padx=10, sticky=(tk.N + tk.S)) drf.columnconfigure(0, weight=1) g_info = ttk.LabelFrame(drf, text='Generic Data') g_info.grid(row=0, column=0, sticky=(tk.W + tk.E)) variables['Scenario ID'] = tk.StringVar() ttk.Label(g_info, text='Scenario ID').grid(row=0, column=0) ttk.Entry(g_info, textvariable=variables['Scenario ID']).grid(row=1, column=0, sticky=(tk.W + tk.E)) variables['Integer Value'] = tk.IntVar() ttk.Label(g_info, text='Integer Value').grid(row=2, column=0) ttk.Spinbox(g_info, textvariable=variables['Integer Value'], from_=0, to=100, increment = 1).grid(row=3, column=0, sticky=(tk.W + tk.E)) variables['OPTIONS'] = tk.StringVar() option_var = tk.StringVar(value='Choose') choices = ('This', 'That', 'The Other Thing') ttk.Label(g_info, text='OPTIONS').grid(row=4, column=0, sticky=(tk.W + tk.E)) ttk.OptionMenu(g_info, option_var, *choices).grid(row=5, column=0, sticky=(tk.W + tk.E)) choice_default = tk.StringVar(value=F) variables['CHOICE'] = tk.StringVar() choice_frame = ttk.Frame(g_info) ttk.Label(g_info, text='CHOICE').grid(row=6, column=0, sticky=(tk.W + tk.E)) choice_frame.grid(row=7, column=0, sticky=(tk.W + tk.E)) for choice in ('T', 'F'): ttk.Radiobutton(choice_frame, value=choice, test=choice, variable=choice_default.pack() buttons = tk.Frame(drf) buttons.grid(column=1, pady=20, sticky=(tk.W + tk.E)) save_button = ttk.Button(buttons, test='Save') save_button.pack(side=tk.RIGHT) def on_save(): filename = f'C:/test.txt' data = dict() with open(filename, 'w', newline='' as fh: fh.write("\n") save_button.configure(command=on_save) root.mainloop()
实现方案
1. 修正原代码语法错误
原代码存在多处语法问题,需先修正:
- Radiobutton参数
test改为text - Radiobutton的
variable=choice_default.pack()拆分:先设置variable=choice_default,再单独调用.pack(side=tk.LEFT) choice_default = tk.StringVar(value=F)改为choice_default = tk.StringVar(value='F')(字符串需加引号)with open(filename, 'w', newline='' as fh:补全右括号为with open(filename, 'w', newline='') as fh:- 将OptionMenu、Radiobutton的变量统一存入
variables字典,键名与目标格式一致(如OPTIONS改为Options)
2. 完善on_save函数实现
通过统一管理控件变量,按目标格式拼接内容后写入文件,完整代码如下:
import tkinter as tk from tkinter import ttk, messagebox variables = dict() root = tk.Tk() root.title('Generic Form') root.columnconfigure(0, weight=1) ttk.Label(root, text='Generic Form', font=("TkDefaultFont", 16)).grid() drf = ttk.Frame(root) drf.grid(padx=10, sticky=(tk.N + tk.S)) drf.columnconfigure(0, weight=1) g_info = ttk.LabelFrame(drf, text='Generic Data') g_info.grid(row=0, column=0, sticky=(tk.W + tk.E)) # Scenario ID variables['Scenario ID'] = tk.StringVar() ttk.Label(g_info, text='Scenario ID').grid(row=0, column=0) ttk.Entry(g_info, textvariable=variables['Scenario ID']).grid(row=1, column=0, sticky=(tk.W + tk.E)) # Integer Value variables['Integer Value'] = tk.IntVar() ttk.Label(g_info, text='Integer Value').grid(row=2, column=0) ttk.Spinbox(g_info, textvariable=variables['Integer Value'], from_=0, to=100, increment=1).grid(row=3, column=0, sticky=(tk.W + tk.E)) # Options variables['Options'] = tk.StringVar(value='Choose') choices = ('This', 'That', 'The Other Thing') ttk.Label(g_info, text='OPTIONS').grid(row=4, column=0, sticky=(tk.W + tk.E)) ttk.OptionMenu(g_info, variables['Options'], *choices).grid(row=5, column=0, sticky=(tk.W + tk.E)) # Choice variables['Choice'] = tk.StringVar(value='F') choice_frame = ttk.Frame(g_info) ttk.Label(g_info, text='CHOICE').grid(row=6, column=0, sticky=(tk.W + tk.E)) choice_frame.grid(row=7, column=0, sticky=(tk.W + tk.E)) for choice in ('T', 'F'): ttk.Radiobutton(choice_frame, value=choice, text=choice, variable=variables['Choice']).pack(side=tk.LEFT) buttons = tk.Frame(drf) buttons.grid(column=1, pady=20, sticky=(tk.W + tk.E)) save_button = ttk.Button(buttons, text='Save') save_button.pack(side=tk.RIGHT) def on_save(): filename = 'C:/test.txt' # 按目标格式构建内容列表 content = ["Generic Data"] # 遍历变量字典生成每行内容 for key, var in variables.items(): value = var.get() # 处理整数类型变量的转字符串 if isinstance(var, tk.IntVar): value = str(value) content.append(f" {key} = {value}") # 拼接为完整文本 full_content = '\n'.join(content) # 写入文件 with open(filename, 'w', encoding='utf-8') as fh: fh.write(full_content) # 提示保存成功 messagebox.showinfo("保存成功", "表单数据已保存到指定文件!") save_button.configure(command=on_save) root.mainloop()
关键说明
- 统一使用
variables字典管理所有控件的变量,键名与目标文本中的名称一致,便于后续格式生成 on_save函数中先构建内容列表,再通过'\n'.join()拼接为符合要求的文本,避免手动拼接换行符的麻烦- 针对
IntVar类型的变量做了字符串转换,确保写入文件的内容格式统一 - 添加了保存成功的提示框,提升用户体验
内容的提问来源于stack exchange,提问作者cat_herder
相关产品推荐
相关产品推荐

