的wxPython:启用和禁用动态小工具,从CSV文件

问题描述:

我有很多小部件一样复选框,textctrls,statictexts,一个小程序,让设置...的wxPython:启用和禁用动态小工具,从CSV文件

我的所有控件的值存储在一个字典。我正在保存设置,例如这个词典在一个csv文件中。当我从这个文件导入设置并更新我的字典时,应根据字典中的值通过调用“def enable_controls”来启用或禁用所有的窗口小部件。但是小部件始终处于启用状态,即使该值为“False”。

这里是代码片段:

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) 

我做类型转换到正确bool的?

编辑:这是我怎么写的和我的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) 
+0

哪些数据存储在StartValues词典。以什么方式? – jknupp 2012-01-01 19:01:27

+0

如果它们全部启用,它看起来好像不是通过布尔值,而是其他类型。我觉得这个与我回答的前一个问题有关。在这种情况下,如果您直接从CSV文件获取值,则很可能它们是字符串,而任何非空字符串的计算结果都是“真”。请注意,这意味着'bool(“False”)'是'True'!你可能会更喜欢'cb2 =“true”== config.StartValues ['Checkbox2']。lower()'。 'lower'在那里可以捕捉单词的所有可能的大写字母,但是要小心错别字... – 2012-01-01 19:02:22

+0

如果您不需要专门用于人类可读的csv格式,那么使用cPickle会更有效,因为它会保留所有对象类型。您将避免必须将字符串值转换回来。 – jdi 2012-01-01 19:13:58

正如我在评论中说,不要使用bool(config.StartValues['Checkbox2'])做数据转换。 bool返回True对于任何事情不是评估为0,0.0或空序列或映射。在这种情况下,像"True""False"字符串都将计算为True

使用字符串比较或类似的效果会更好,但用户推出错别字的提防,如果你让他们编辑的文件!

编辑:使用例如...

def evalBooleans(value): 
    """Assumes we're getting either booleans or strings!""" 
    return (value if isinstance(value, bool) 
       else value.lower() == "true") 

cb2 = evalBooleans(config.StartValues['Checkbox2']) 
self.Checkbox2.SetValue(cb2) 
self.Checkbox2TextCtrl.Enable(cb2) 
self.Checkbox2StaticText.Enable(cb2) 
+0

谢谢你的回答,里卡多!这就是我猜测的结果,所有的值都被评估为“真”。但我真的不知道如何在代码 – user1106770 2012-01-01 20:34:12

+0

中使用'cb2 =“true”== config.StartValues ['Checkbox2']。lower()'部分编辑以包含示例。 'cb2'部分只是为了减少你转换数值的次数! :D – 2012-01-01 20:56:49

+0

您也可以在读取它们时转换这些值,然后在代码中的其他任何地方正常使用它们。 – 2012-01-01 20:57:29