【问题标题】:ObjectListView does not display zeroObjectListView 不显示零
【发布时间】:2012-11-18 23:18:35
【问题描述】:

我正在使用 ObjectListView 1.2 (Python),并且对奇怪的行为感到非常困惑。 我有一个具有双字段的对象。如果该值非零(无论是 int 还是 double),OLV 将显示该值,但只要该值为零,它就不会在该列中显示该对象的任何内容。

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

【问题讨论】:

    标签: python wxpython integer objectlistview


    【解决方案1】:

    正如 Blckknght 的回答所提到的,当您没有设置 stringConverter 时会发生这种情况。

    我没有编辑库,而是在我将列出整数的任何列的末尾使用stringConverter="%.0f"

    例子:

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

    【讨论】:

    • 我喜欢这个。一个合理的方法。如果 OLV 更新了,但 bug 没有修复,那么问题就来了。
    【解决方案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:
    

    【讨论】:

    • 完美运行!谁会猜到:) 感谢您的回答!
    • 我会使用@Fuzzy 答案,因为它不是OLV 的错误,而是objectlistview.sourceforge.net/python/majorClasses.html 中记录的功能
    • @Werner:我已经很久没有看到这个了,但我仍然认为这是一个错误。您链接到的文档(据我所知)和代码中的注释都表明只有 None 应该默认替换为空字符串,而不是所有错误值。现在,另一个答案确实提供了一个非常好的解决方法,但这并不意味着 OLV 正在按预期工作。
    • @Blckknght:好的。这可能也是个人喜好,我大部分时间都喜欢 None, False, 0 显示为空白,它使列表不那么“拥挤”,所以当前的 OLV 行为对我来说很好。 'stringconverter' 提供了一种简单的方法来覆盖标准行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多