在Python 3中未调用的Overwrite TreeCtrl.OnCompareItems()-wxPython 4

问题描述 投票:4回答:1

我有一个wx.TreeCtrl结构,用户可以在其中按不同的标准(日期,名称,ID,降序,升序,...)对项目进行排序。这在Python 2中很好用,但是Python 3(带有wxPython 4)拒绝排序。方法CTreeCtrl.OnCompareItems()在Python 2中被调用,但在Python 3中从未被调用。

在functools.cmp_to_key文档(https://docs.python.org/3/library/functools.html)中,我发现了一个提示:Python 3不支持比较功能。令人困惑:在wx.TreeCtrl(wxPython 4)的描述中,有一个[[is比较方法OnCompareItems()https://docs.wxpython.org/wx.TreeCtrl.html#wx.TreeCtrl.OnCompareItems)。描述说,与该方法一起,我必须使用RTTI宏DECLARE_DYNAMIC_CLASSIMPLEMENT_DYNAMIC_CLASS,因为基类不知道我重写了OnCompareItems()。我只找到了有关如何在C ++中使用此宏的描述,但对于python没有任何描述。

我不知道如何使我的程序在Python3 / wxPython 4中调用我的OnCompareItems()方法。

有人可以帮忙吗?

问候,Humbalan

下面有一个小的示例程序可以反映该问题。它也与Python 2和Python 3一起运行。 print( 'in CTreeCtrl.OnCompareItems()' )显示此方法被调用(在py2中)或未被调用(在py3中):

import sys import wx class CTreeCtrl( wx.TreeCtrl ): def __init__( self, parent ): super( CTreeCtrl, self ).__init__( parent=parent, style=wx.TR_HIDE_ROOT ) def OnCompareItems( self, item1, item2 ): print( 'in CTreeCtrl.OnCompareItems()' ) if sys.version_info.major < 3: d1 = self.GetItemData( item1 ).Data d2 = self.GetItemData( item2 ).Data else: d1 = self.GetItemData( item1 ) d2 = self.GetItemData( item2 ) if d1 < d2: return -1 elif d1 > d2: return 1 else : return 0 class CSettingsTree( wx.Dialog ): def __init__( self, parent, settings ) : size = wx.Size(200,150) wx.Dialog.__init__( self, parent, title='all settings', size=size ) bSizer_main = wx.BoxSizer( wx.VERTICAL ) self.m_treeCtrl = CTreeCtrl( self ) bSizer_main.Add( self.m_treeCtrl, 0, wx.ALL|wx.EXPAND, 5 ) self.SetSizer( bSizer_main ) bSizer_main.Fit( self ) root = self.m_treeCtrl.AddRoot( 'Settings' ) for key, name in settings : if sys.version_info.major < 3 : sort_key = wx.TreeItemData( name ) else : sort_key = name self.m_treeCtrl.AppendItem( root, '{}: {}'.format(key, name), data=sort_key ) self.m_treeCtrl.ExpandAll() self.m_treeCtrl.SortChildren( root ) #--------------------------------------------------------------------------- if __name__=="__main__": app = wx.App( redirect=False ) settings = [(50,'Taylor'),(200,'Mueller'),(101,'Baker'),(102,'Smith')] dlg = CSettingsTree( wx.Frame( None ), settings ) dlg.ShowModal()


编辑(2018-03-08,2:52 pm)

似乎这是wxPython的c ++部分中的错误(请参见https://github.com/wxWidgets/Phoenix/issues/774),并且该修复程序仍然不可用。
python python-3.x python-2.7 sorting wxpython
1个回答
0
投票
尝试根据任意字段而不是最初实现的字母顺序对customtreectrl项进行排序时,我遇到了相同的问题。我不想重复上面的评论,只是说现在存在一个修复程序(here,如@Humbalan对自己的问题的编辑中所述)。

可能不值得提供完整的示例,因为@Humbalan的问题有很多细节,但是在我的情况下,我使用以下内容创建树项:

ctc_item = self.tree_ctc.AppendItem(ctc_parent, text = ctc_text, data = {'id_': ctc_id})

其中self.tree_ctc = MyCustomTreeCtrl(self, style = some_style)。我的树控件和(重写的)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

我知道这个问题已经有几年历史了,但这很有用。
© www.soinside.com 2019 - 2024. All rights reserved.