覆盖TreeCtrl.OnCompareItems公司()在Python 3 wxPython 4中未调用

2024-09-30 18:13:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个wx.TreeCtrl结构,用户可以根据不同的条件(日期、名称、id、降序、升序等)对项目进行排序。这在python2中运行得很好,但是python3(带有wxpython4)拒绝排序。方法CTreeCtrl.OnCompareItems()在python2中调用,但在python3中从未调用过。你知道吗

在functools.cmp\u到\u键文档(https://docs.python.org/3/library/functools.html)我发现了一个提示:python3 不支持比较函数。混淆:在描述宽x.TreeCtrl(wxPython 4)有一个比较 方法OnCompareItems()https://docs.wxpython.org/wx.TreeCtrl.html#wx.TreeCtrl.OnCompareItems)。描述说, 与此方法一起,我必须使用RTTI宏DECLARE_DYNAMIC_CLASSIMPLEMENT_DYNAMIC_CLASS,因为 基类不知道我重写了OnCompareItems()。我只发现了如何在C++中使用宏,但对Python没有任何描述。你知道吗

我不知道如何让我的程序在Python3/wxpython4中调用我的OnCompareItems()方法。你知道吗

有人能帮忙吗?你知道吗

你好,亨巴伦

下面是一个反映问题的小示例程序。它也可以与python2和python3一起运行。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)

这似乎是wxPython的c++部分中的一个bug(请参见https://github.com/wxWidgets/Phoenix/issues/774),而且修复程序仍然不可用。你知道吗


Tags: 方法keynameselfifsettingsinitmain