2012-01-01 27 views
1

我有很多小部件一樣複選框,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

回答

2

正如我在評論中說,不要使用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