gpt4 book ai didi

python - Python 3 中未调用覆盖的 TreeCtrl.OnCompareItems() - wxPython 4

转载 作者:行者123 更新时间:2023-12-03 21:24:43 24 4
gpt4 key购买 nike

我有一个 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) 的描述中有 一个对比
方法 OnCompareItems() ( https://docs.wxpython.org/wx.TreeCtrl.html#wx.TreeCtrl.OnCompareItems )。描述说,
与此方法一起,我必须使用 RTTI 宏 DECLARE_DYNAMIC_CLASSIMPLEMENT_DYNAMIC_CLASS自从
基类不知道我覆盖了 OnCompareItems() .我只找到了关于如何在 C++ 中使用这个宏的描述,但没有找到关于 python 的描述。

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

有人可以帮忙吗?

问候, 洪巴兰

下面是一个反射(reflect)问题的小示例程序。它也可以与 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:52pm)

似乎这是 wxPython 的 c++ 部分中的错误(请参阅 https://github.com/wxWidgets/Phoenix/issues/774 )并且该修复程序仍然不可用。

最佳答案

我在尝试根据任意字段对 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

我意识到这个问题已经有几年了,但希望这是有用的。

关于python - Python 3 中未调用覆盖的 TreeCtrl.OnCompareItems() - wxPython 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com