2012-11-18 94 views
0

我正在使用ObjectListView 1.2(Python),並且很奇怪的行爲感到困惑。 我有一個雙重字段的對象。 OLV將顯示該值,如果它不是零(無論是int還是double),但是隻要該值爲零,它就不會顯示該列中該對象的任何內容。ObjectListView不顯示零

SSCCE:

# -*- coding: utf-8 -*- 
#!/usr/bin/env python 

import wx 

from ObjectListView import ObjectListView, ColumnDefn 

class MyObj: 
    def __init__(self, name, id): 
     self.name = name 
     self.id = id 

    @staticmethod 
    def getObjects(): 
     objList = [] 
     for i in range(0,5): 
      objList.append(MyObj("item" + str(i), i)) 
     return objList 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.Init() 

    def Init(self): 
     self.InitModel() 
     self.InitWidgets() 
     self.InitObjectListView() 

    def InitModel(self): 
     self.songs = MyObj.getObjects() 

    def InitWidgets(self): 
     panel = wx.Panel(self, -1) 
     sizer_1 = wx.BoxSizer(wx.VERTICAL) 
     sizer_1.Add(panel, 1, wx.ALL|wx.EXPAND) 
     self.SetSizer(sizer_1) 

     self.myOlv = ObjectListView(panel, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
     sizer_2 = wx.BoxSizer(wx.VERTICAL) 
     sizer_2.Add(self.myOlv, 1, wx.ALL|wx.EXPAND, 4) 
     panel.SetSizer(sizer_2) 

     self.Layout() 

    def InitObjectListView(self): 
     self.myOlv.SetColumns([ 
      ColumnDefn("Title", "left", 120, "name"), 
      ColumnDefn("ID", "left", 120, "id") 
     ]) 
     self.myOlv.SetObjects(self.songs) 

if __name__ == '__main__': 
    app = wx.PySimpleApp(1) 
    wx.InitAllImageHandlers() 
    frame_1 = MyFrame(None, -1, "ObjectListView Simple Example1") 
    app.SetTopWindow(frame_1) 
    frame_1.Show() 
    app.MainLoop() 

回答

2

這似乎是一個錯誤ObjectListView。無論何時設置沒有stringConverter的列,它都將忽略所有「錯誤」值(包括零)。代碼中的註釋表明它應該忽略None,但它也捕獲所有其他錯誤值。

我通常會建議上游報告這個錯誤,但鑑於該項目似乎在近四年內沒有更新,我不確定這將會非常有效。

相反,您可以通過修改ObjectListView.py的副本來解決此問題。相關的方法是在ColumnDefn類:

def _StringToValue(self, value, converter): 
    """ 
    Convert the given value to a string, using the given converter 
    """ 
    try: 
     return converter(value) 
    except TypeError: 
     pass 

    if converter and isinstance(value, (datetime.datetime, datetime.date, datetime.time)): 
     return value.strftime(self.stringConverter) 

    # By default, None is changed to an empty string. 
    if not converter and not value:    # THE ERROR IS HERE!!!! 
     return "" 

    fmt = converter or "%s" 
    try: 
     return fmt % value 
    except UnicodeError: 
     return unicode(fmt) % value 

的修復方法是指出行:

if not converter and value is None: 
+0

完美無缺!誰會猜到:)謝謝你的答案! –

+0

我會使用@Fuzzy答案,因爲它不是OLV的一個bug,但是http://objectlistview.sourceforge.net/python/majorClasses.html中記錄的一個功能 – Werner

+0

@Werner:我看了很久,但我仍然認爲這是一個錯誤。你鏈接到的文檔(據我所見)和代碼中的註釋都表明它只是'None',默認情況下應該用空字符串替換,而不是所有的falsey值。現在,另一個答案確實提供了一個非常好的解決方法,但這並不意味着OLV按預期工作。 – Blckknght

1

由於Blckknght的回答中提到,這種情況發生的時候,你沒有設置字符串轉換。

與其編輯li​​b,我只是在任何需要列表整數的列的末尾使用stringConverter="%.0f"

例子:

self.myOlv.SetColumns([ 
    ColumnDefn("Title", "left", 120, "name"), 
    ColumnDefn("ID", "left", 120, "id", stringConverter="%.0f") 
])