在Python 3-wxPython 4中未调用重写的TreeCtrl.OnCompareItems()
我有一个在Python 3-wxPython 4中未调用重写的TreeCtrl.OnCompareItems(),python,python-3.x,python-2.7,sorting,wxpython,Python,Python 3.x,Python 2.7,Sorting,Wxpython,我有一个wx.TreeCtrl结构,用户可以根据不同的标准(日期、名称、id、降序、升序等)对项目进行排序。这在Python2中工作得很好,但是Python3(带有WxPython4)拒绝排序。方法CTreeCtrl.OnCompareItems()在Python2中调用,但在Python3中从未调用过 在functools.cmp_to_key文档()中,我发现了一个提示:Python 3 不支持比较函数。混淆:在wx.TreeCtrl(wxpython4)的描述中有一个比较 方法OnComp
wx.TreeCtrl
结构,用户可以根据不同的标准(日期、名称、id、降序、升序等)对项目进行排序。这在Python2中工作得很好,但是Python3(带有WxPython4)拒绝排序。方法CTreeCtrl.OnCompareItems()
在Python2中调用,但在Python3中从未调用过
在functools.cmp_to_key文档()中,我发现了一个提示:Python 3
不支持比较函数。混淆:在wx.TreeCtrl(wxpython4)的描述中有一个比较
方法OnCompareItems()()。描述说,,
与此方法一起,我必须使用RTTI宏DECLARE_DYNAMIC_CLASS
和IMPLEMENT_DYNAMIC_CLASS
,因为
基类不知道我重写了OnCompareItems()
。我只发现了如何在C++中使用宏,但对Python没有任何说明。
我不知道如何让我的程序调用Python3/wxpython4中的OnCompareItems()
方法
有人能帮忙吗
你好,亨巴兰
下面是一个反映问题的小示例程序。它也与Python2和Python3一起运行。打印('in CTreeCtrl.OnCompareItems()')
显示此方法被调用(在py2中)或未被调用(在py3中):
导入系统
导入wx
类CTreeCtrl(wx.TreeCtrl):
定义初始化(自身,父级):
super(CTreeCtrl,self)。\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuu(父级=父级,样式=wx.TR\u隐藏\u根)
def OnCompareItems(自身、项目1、项目2):
打印('in CTreeCtrl.OnCompareItems()')
如果sys.version_info.major<3:
d1=self.GetItemData(item1.Data)
d2=self.GetItemData(item2.Data)
其他:
d1=self.GetItemData(item1)
d2=self.GetItemData(item2)
如果d1编辑(2018-03-08,下午2:52)
这似乎是WxPython(参见)的C++部分中的一个bug,修复程序仍然不可用。p> 我在尝试根据任意字段(而不是最初实现的字母顺序)对customtreectrl项进行排序时遇到了相同的问题。我不想重复上面的评论,只是想说现在存在一个修复(正如@Humbalan对他们自己问题的编辑中所给出的)
也许不值得提供一个完整的例子,因为@Humbalan的问题有很多细节,但在我的例子中,我创建的树项目如下所示:ctc_item = self.tree_ctc.AppendItem(ctc_parent, text = ctc_text, data = {'id_': ctc_id})
其中self.tree\u ctc=MyCustomTreeCtrl(self,style=some\u style)
。My tree控件和(重写的)OnCompareItems()方法是:
class MyCustomTreeCtrl(ctc.CustomTreeCtrl):
def __init__(self, parent, style):
ctc.CustomTreeCtrl.__init__(self, parent, agwStyle = style)
def OnCompareItems(self, item1, item2):
t1 = self.GetPyData(item1)['id_']
t2 = self.GetPyData(item2)['id_']
if t1 < t2: return -1
if t1 == t2: return 0
return 1
类MyCustomTreeCtrl(ctc.CustomTreeCtrl):
定义初始化(自、父、样式):
ctc.CustomTreeCtrl.\uuuuu init\uuuuuu(self,parent,agwStyle=style)
def OnCompareItems(自身、项目1、项目2):
t1=self.GetPyData(item1)['id_u']
t2=self.GetPyData(项目2)['id_u']
如果t1
我意识到这个问题已经问了好几年了,但希望这是有用的。非常好的帖子,很好-希望我知道如何帮助:)@PatrickArtner:谢谢你的评论,我想投票是你的。怪不得你帮不上忙,我发现这是WxPython4中的一个bug(见我上面的编辑)。如果你发现了发生了什么,写一个简短的自我回答,你可以在2天内接受它,如果他们在你的问题上绊倒,他们可能会帮助其他有同样问题的人。
class MyCustomTreeCtrl(ctc.CustomTreeCtrl):
def __init__(self, parent, style):
ctc.CustomTreeCtrl.__init__(self, parent, agwStyle = style)
def OnCompareItems(self, item1, item2):
t1 = self.GetPyData(item1)['id_']
t2 = self.GetPyData(item2)['id_']
if t1 < t2: return -1
if t1 == t2: return 0
return 1