首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectListView不显示零

ObjectListView不显示零
EN

Stack Overflow用户
提问于 2012-11-19 07:18:36
回答 2查看 359关注 0票数 0

我使用的是Python1.2( ObjectListView ),我对这种奇怪的行为感到非常困惑。我有一个对象,它有一个双精度字段。如果值为非零值(无论是整型还是双精度型),则OLV将显示该值,但只要该值为零,它就不会在该列中显示该对象的任何内容。

SSCCE:

代码语言:javascript
复制
# -*- 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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-19 09:26:23

这似乎是ObjectListView中的一个错误。当您设置一个没有stringConverter的列时,它将忽略所有“Falsey值”(包括零)。代码中的注释表明它应该忽略None,但它也会捕获所有其他false值。

我通常会建议上报这个bug,但考虑到该项目似乎在近四年内没有更新,我不确定这是否会很有成效。

相反,您可以通过编辑您的ObjectListView.py副本来修复此问题。相关的方法在ColumnDefn类中:

代码语言:javascript
复制
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

修复方法是将所指示的行更改为:

代码语言:javascript
复制
if not converter and value is None:
票数 2
EN

Stack Overflow用户

发布于 2014-11-19 01:08:51

正如布莱克奈特的回答所提到的,当你没有设置一个stringConverter时,就会发生这种情况。

我并没有编辑库,而只是在要列出int的任何列的末尾使用stringConverter="%.0f"

示例:

代码语言:javascript
复制
self.myOlv.SetColumns([
  ColumnDefn("Title", "left", 120, "name"),
  ColumnDefn("ID", "left", 120, "id", stringConverter="%.0f")
])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13445657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档