问题描述
在项目中需要一个简单的参数配置工具,逻辑比较简单,但是有个需求:希望之前设置的参数能在下次打开的时候能记住之前的参数
问题解决
既然要保存数据 那就要使用ConfigParser,于是建立一个配置数据的字典,然后实时将字典的值保存到配置文件中
# -*- coding: utf-8 -*-
'''
# -*- coding: utf-8 -*-
'''
* File Name : setting.py
* Description : 解析配置文件模块
* Input : None
# '''
import ConfigParser
from collections import OrderedDict
# 研发TAB 配置参数配置值选项
save_conf_dict = {"com": "COM4",
"ntc0": 0,
"pwr": 0,
"pwr_val" : 2500,
"ntc1_c1r1": 0,
"ntc1_c1r2": 0,
"ntc1_c2r1": 103,
"ntc1_c2r2": 10175,
"ntc1_c3r1": 155,
"ntc1_c3r2": 10229,
"ntc1_c4r1": 203,
"ntc1_c4r2": 10168,
"ntc1_c5r1": 252,
"ntc1_c5r2": 10140,
"ntc1_c6r1": 302,
"ntc1_c6r2": 10094,
"ntc1_c7r1": 351,
"ntc1_c7r2": 9981,
"ntc1_c8r1": 403,
"ntc1_c8r2": 9987,
}
# 当前页操作记录函数
tab_dict = {"tab_idx": 0}
# 生产TAB
fac_conf_dict = {"com": "COM4",
"usb": "USB0::0x0957::0x0618::MY52120051::INSTR",
}
class setting_decode():
def __init__(self, file_path):
self.dtb = OrderedDict({"CONF": save_conf_dict,
"TAB": tab_dict,
"FAC": fac_conf_dict,
})
self.is_file = False
self.config = ConfigParser.ConfigParser()
try:
self.config.readfp(open(file_path, "r"))
self.is_file = True
except:
pass
# 解析需要读取的配置文件的所有选项
for title in self.dtb.keys():
if not self.config.has_section(title):
self.config.add_section(title)
for item in self.dtb[title].keys():
if not self.config.has_option(title, item):
self.config.set(title, item, self.dtb[title][item])
else:
self.dtb[title][item] = self.config.get(title, item)
# 保存配置数据
if not self.is_file:
with open(file_path, 'w') as configfile:
self.config.write(configfile)
def write_item(self, fun, item, value):
self.dtb[fun][item] = value
self.config.set(fun, item, value)
self.config.write(open('default_setting.inf', "r+"))
用法的话只要在参数修改的地方调用对应的参数修改地方,就能实现数据的实时保存
# 类的实例化
self.setting = setting_decode('default_setting.inf')
# 启动的时候加载配置数据
def set_ui_init(self, conf_dict):
self.ntc_edit.setText(str(conf_dict["ntc0"]))
self.pwr_edit.setText(str(conf_dict["pwr"]))
self.val_edit.setText(str(conf_dict["pwr_val"]))
self.ntc_c1r1_edit.setText(str(conf_dict["ntc1_c1r1"]))
self.ntc_c1r2_edit.setText(str(conf_dict["ntc1_c1r2"]))
self.ntc_c2r1_edit.setText(str(conf_dict["ntc1_c2r1"]))
self.ntc_c2r2_edit.setText(str(conf_dict["ntc1_c2r2"]))
self.ntc_c3r1_edit.setText(str(conf_dict["ntc1_c3r1"]))
self.ntc_c3r2_edit.setText(str(conf_dict["ntc1_c3r2"]))
self.ntc_c4r1_edit.setText(str(conf_dict["ntc1_c4r1"]))
self.ntc_c4r2_edit.setText(str(conf_dict["ntc1_c4r2"]))
self.ntc_c5r1_edit.setText(str(conf_dict["ntc1_c5r1"]))
self.ntc_c5r2_edit.setText(str(conf_dict["ntc1_c5r2"]))
self.ntc_c6r1_edit.setText(str(conf_dict["ntc1_c6r1"]))
self.ntc_c6r2_edit.setText(str(conf_dict["ntc1_c6r2"]))
self.ntc_c7r1_edit.setText(str(conf_dict["ntc1_c7r1"]))
self.ntc_c7r2_edit.setText(str(conf_dict["ntc1_c7r2"]))
self.ntc_c8r1_edit.setText(str(conf_dict["ntc1_c8r1"]))
self.ntc_c8r2_edit.setText(str(conf_dict["ntc1_c8r2"]))
# 程序中UI空间触发修改的地方
def set_ntc0_cb(self):
ntc0 = self.get_edit_num(self.ntc_edit)
self.setting.write_item("CONF", "ntc0", ntc0)
scmd = UART_CMD.cmd_0x01(ntc0)
self.uart_send(scmd)
总结
将字典作为配置参数,并实时保存到配置文件,在上电读取数据,是一个很好的实现数据防丢失的方式,在小工具上实现,能减少很多重复性的输入
后记(库BUG)
在使用 visa 库的是否发现,如果保存的数据中包含 “::” , 在下次启动的启动的时候,就会无法读取数据,并且强行关闭软件之后,保存的内容都变成了列表,出现异常之后修改的,存储数据,
- 解决方式,在存储于读取包含这类字字符的地方,使用 其他符号转换一下,可以在内饰规避这个问题
读取匹配:
usb_str = self.setting.dtb["FAC"]["usb"].replace("_", "::")
if usb_str == self.usbs_dict[item]:
return usb_pos
存储数据:
usb_str = str(self.usb_com.currentText())
self.dyb_hw = self.rm.open_resource(usb_str)
self.usb_com_btn.setText(u"关闭")
usb_str = usb_str.replace("::", "_")
self.setting.write_item("FAC", "usb", usb_str)
最终的数据存储格式:
[FAC]
com = COM4
usb = ASRL5_INSTR
如此修改之后,就没有再次发现这个配置文件出现异常了