我使用的是Python1.2( ObjectListView ),我对这种奇怪的行为感到非常困惑。我有一个对象,它有一个双精度字段。如果值为非零值(无论是整型还是双精度型),则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()发布于 2012-11-19 09:26:23
这似乎是ObjectListView中的一个错误。当您设置一个没有stringConverter的列时,它将忽略所有“Falsey值”(包括零)。代码中的注释表明它应该忽略None,但它也会捕获所有其他false值。
我通常会建议上报这个bug,但考虑到该项目似乎在近四年内没有更新,我不确定这是否会很有成效。
相反,您可以通过编辑您的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:发布于 2014-11-19 01:08:51
正如布莱克奈特的回答所提到的,当你没有设置一个stringConverter时,就会发生这种情况。
我并没有编辑库,而只是在要列出int的任何列的末尾使用stringConverter="%.0f"。
示例:
self.myOlv.SetColumns([
ColumnDefn("Title", "left", 120, "name"),
ColumnDefn("ID", "left", 120, "id", stringConverter="%.0f")
])https://stackoverflow.com/questions/13445657
复制相似问题