2012-11-18 3 views
0

ObjectListView 1.2 (Python)를 사용하고 있는데 이상한 행동으로 인해 혼란 스럽습니다. 이중 필드가있는 개체가 있습니다. OLV는 0이 아닌 값 (int 또는 double 여부)을 표시하지만 값이 0 일 때마다 해당 열의 해당 객체에 대해 아무 것도 표시하지 않습니다.ObjectListView가 0을 표시하지 않습니다.

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이없는 열을 설정할 때마다 모든 "거짓"값 (0 포함)은 무시됩니다. 코드의 주석은 None을 무시한다고 가정하지만 다른 모든 거짓 값도 catch합니다.

나는 일반적으로이 버그를 업스트림에보고하는 것이 좋지만 프로젝트가 거의 4 년 내에 업데이트되지 않은 것 같으면 매우 생산적이라고 확신하지 못합니다.

대신 ObjectListView.py 사본을 수정하여 문제를 해결할 수 있습니다. 관련 방법은 ColumnDefn 클래스에 있습니다 Blckknght의 대답은 언급으로 당신이 stringConverter를 설정하지 않는 경우

if not converter and value is None: 
+0

완벽하게 일했다! 누가 짐작 했겠습니까? 답변 주셔서 감사합니다! –

+0

@Fuzzy 대답은 OLV의 버그가 아니지만 http://objectlistview.sourceforge.net/python/majorClasses.html에 문서화되어 있습니다. – Werner

+0

@Werner : 오랜 시간이 지났습니다. 하지만 여전히 버그라고 생각합니다. 링크 된 문서 (내가 볼 수있는 한)와 코드의 주석 모두는 기본적으로 빈 문자열 (모든 거짓 값이 아닌)으로 대체되어야하는 것은 '없음'임을 제안합니다. 이제 다른 대답은 완벽하게 좋은 해결 방법을 제공하지만 OLV가 의도 한대로 작동한다는 것을 의미하지는 않습니다. – Blckknght

1

, 이런 일이 발생 :

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 

수정 프로그램에 표시된 선을 변경하는 것입니다.

lib를 편집하는 대신 int를 나열 할 열의 끝에 stringConverter="%.0f"을 사용합니다.

예 :

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