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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:18:09