0

私はObjectListView1.2(Python)を使用していますが、奇妙な動作にかなり混乱しています。ダブルフィールドを持つオブジェクトがあります。OLVは、ゼロ以外の場合(intまたはdoubleの場合)に値を表示しますが、値がゼロの場合は常に、その列にそのオブジェクトの値を表示しません。

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()
4

2 に答える 2

3

Blckknghtの回答が述べているように、これはstringConverterを設定しない場合に発生します。

libを編集するのではなく、stringConverter="%.0f"intをリストする列の最後で使用します。

例:

self.myOlv.SetColumns([
  ColumnDefn("Title", "left", 120, "name"),
  ColumnDefn("ID", "left", 120, "id", stringConverter="%.0f")
])
于 2014-11-18T17:08:51.140 に答える
2

これはのバグのようObjectListViewです。がない列を設定すると、stringConverterすべての「偽の」値(ゼロを含む)が無視されます。コード内のコメントは、を無視することになっていることを示していますがNone、他のすべてのfalse値もキャッチします。

通常、このバグをアップストリームで報告することをお勧めしますが、プロジェクトがほぼ4年間更新されていないように思われることを考えると、それが非常に生産的であるかどうかはわかりません。

代わりに、のコピーを編集することでこれを修正できます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:
于 2012-11-19T01:26:22.617 に答える