在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) 如果d1d2:返回1 其他:返回0 类CSettingsTree(wx.Dialog): 定义初始化(自身、父项、设置): 尺寸=宽x.尺寸(200150) 对话框。\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu bSizer_main=wx.BoxSizer(wx.VERTICAL) self.m_treeCtrl=CTreeCtrl(self) b发生器主添加(self.m_treeCtrl,0,wx.ALL | wx.EXPAND,5) 自我设定设定器(主设定器) B主配套件(自配) root=self.m_treeCtrl.AddRoot(‘设置’) 对于键,请在“设置”中指定名称: 如果sys.version\u info.major<3:sort\u key=wx.TreeItemData(名称) else:sort_key=name self.m_treeCtrl.AppendItem(根“{}:{}”。格式(键,名称),数据=排序键) self.m_treeCtrl.ExpandAll() self.m_treeCtrl.SortChildren(根) #--------------------------------------------------------------------------- 如果名称=“\uuuuu main\uuuuuuuu”: app=wx.app(重定向=False) 设置=[(50,'Taylor'),(200,'Mueller'),(101,'Baker'),(102,'Smith')] dlg=CSettingsTree(wx.Frame(无),设置) dlg.ShowModal()
编辑(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