tkinter中将GUI变量写入带键名文本文件并实现无序读取恢复的问题
实现方案
第一步:提前定义配置项与Text控件的映射关系
这张映射表是核心,读写配置都复用这份规则,后续新增配置项只需在表中追加即可。
# 配置键名 对应 GUI中的Text控件,全局定义即可 CONFIG_FIELD_MAP = { "input_file_name": inputtxt1, "num_of_compare_points": inputtxt2, "VER": inputtxt3, "mode": inputtxt4, "executionMode": inputtxt5, "numOfWorkers": inputtxt6, "sessionFile": inputtxt7 }
第二步:调整配置写入逻辑
改成键值对格式写入,支持用户直接编辑文件修改参数:
# 写入配置文件代码替换为以下逻辑 with open("file_1.setup", "w", encoding="utf-8") as f: for config_key, text_widget in CONFIG_FIELD_MAP.items(): # 读取控件值,input_file_name保留原有去空格的特殊处理 if config_key == "input_file_name": val = text_widget.get('1.0', 'end-1c').replace(" ","") else: val = text_widget.get('1.0', 'end-1c') # 写入 键 = 值 格式的内容 f.write(f"{config_key} = {val}\n")
生成的配置文件示例如下,用户可直接修改等号右侧的值,调整空格、调换行顺序都不影响读取:
input_file_name = test.txt num_of_compare_points = 10 VER = v2.1.0 mode = debug executionMode = auto numOfWorkers = 4 sessionFile = session.dat
第三步:重写配置回填函数
实现按键名匹配回填,不依赖行顺序,自动忽略多余空格:
def restore_info(): import os # 配置文件不存在/为空直接跳过 if not os.path.exists('file_1.setup') or os.stat('file_1.setup').st_size == 0: print("配置文件为空,跳过回填") return # 存储读取到的配置键值对 config_dict = {} with open('file_1.setup','r', encoding="utf-8") as f: for line in f: line = line.strip() # 跳过空行、#开头的注释行,支持用户在配置文件加备注 if not line or line.startswith('#'): continue # 只分割第一个等号,避免值本身包含等号时解析错误 if '=' not in line: continue key, value = line.split('=', 1) # 去除键和值两侧的所有空白字符,满足任意空格的要求 key = key.strip() value = value.strip() config_dict[key] = value # 按键名匹配控件回填 for config_key, val in config_dict.items(): # 只处理已定义的配置项,忽略文件中非法的额外字段 if config_key in CONFIG_FIELD_MAP: target_widget = CONFIG_FIELD_MAP[config_key] # 先清空控件原有内容再插入新值 target_widget.delete('1.0', 'end') target_widget.insert('end', val)
注意事项
- 用
split('=', 1)只分割第一个等号,可兼容值本身包含等号的场景 - 指定
encoding="utf-8"可避免中文值乱码问题 - 支持用户在配置文件加
#开头的注释行,不会影响解析
内容的提问来源于stack exchange,提问作者Rawan Ghanem
相关产品推荐
相关产品推荐

