【发布时间】:2012-01-01 18:56:28
【问题描述】:
我有一个小程序,其中包含许多小部件,例如复选框、textctrls、statictexts...
我所有小部件的值都存储在字典中。我正在保存设置,例如这本字典在 csv 文件中。当我从这个文件导入设置并更新我的字典时,我的所有小部件都应该通过调用“def enable_controls”根据字典中的值启用或禁用。但小部件始终处于启用状态,即使值为“False”。
这里是sn-p的代码:
def enable_controls(self):
self.Checkbox1.SetValue(bool(config.StartValues['Checkbox1']))
self.Checkbox1TextCtrl.Enable(bool(config.StartValues['Checkbox1']))
self.Checkbox1StaticText.Enable(bool(config.StartValues['Checkbox1']))
self.Checkbox2.SetValue(bool(config.StartValues['Checkbox2']))
self.Checkbox2TextCtrl.Enable(bool(config.StartValues['Checkbox2']))
self.Checkbox2StaticText.Enable(bool(config.StartValues['Checkbox2']))
当我不动态分配值时,它可以工作:
def enable_controls(self):
self.Checkbox1.SetValue(False)
self.Checkbox1TextCtrl.Enable(False)
self.Checkbox1StaticText.Enable(False)
self.Checkbox2.SetValue(False)
self.Checkbox2TextCtrl.Enable(False)
self.Checkbox2StaticText.Enable(False)
我是否将类型转换为正确的布尔值?
编辑:这就是我从 csv 文件中写入和读取的方式:
def onButtonSave(self, event):
import csv
getValues(self, StartValues)
writer = csv.writer(open('Test.csv', 'wb'))
for key, value in sorted(config.StartValues.items()):
writer.writerow([key, value])
def onButtonLoad(self, event):
import csv
reader = csv.reader(open('Test.csv', 'rb'))
config.StartValues = dict(x for x in reader)
enable_controls(self)
【问题讨论】:
-
StartValues 字典中存储了哪些数据。以什么方式?
-
如果它们都被启用,看起来你不是在传递布尔值,而是其他类型。我猜这与我回答的上一个问题有关。在这种情况下,如果您直接从 CSV 文件中获取值,它们很可能是字符串,并且任何非空字符串的计算结果为
True。请注意,这意味着bool("False")是True!使用cb2 = "true" == config.StartValues['Checkbox2'].lower()之类的东西会更好。lower用于捕捉单词的所有可能大小写,但要注意拼写错误... -
如果您不需要专门为人类可读的 csv 格式,使用 cPickle 会更有效,因为它可以维护您的所有对象类型。您将避免必须将字符串值转换回去。
标签: python dictionary casting widget wxpython