- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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_CLASS
和 IMPLEMENT_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()
最佳答案
我在尝试根据任意字段对 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/
我想要一个树控件,我可以右键单击以创建弹出菜单。单击项目菜单时,会发送一个事件,其中包含树中的 ItemData。我不知道该怎么做。到目前为止我所拥有的只是一个简单的弹出菜单生成 # Panel de
我正在使用以下方法遍历 wxpython treectrl 的所有节点。 def get_desired_parent(self, name, selectednode = None): i
我正在使用 wxPython 并得到了一棵包含一些项目的树。现在我需要一个函数,它按名称给我树项对象。 例如:item = self.GetItemByName("我的故事") 我在文档中找不到这样的
下面是一个非常简单的 wxPython 代码,创建一个笔记本,其中有几个包含 TreeCtrl 对象的面板。 使用它,我得到了我想避免的行为: 当我在树中单击时,如果不先在树外单击,则无法直接切换到笔
我正在使用 wxPython 制作一个 python 树可视化工具。它会像这样使用: show_tree([ 'A node with no children', ('A node with chil
我使用 TVN_SELCHANGED 消息来找出用户在项目树(菜单)中选择的内容。 但是,如果用户连续点击同一个项目,则不会出现该消息。 我希望 treeCtrl 在发生 TVN_SELCHANGED
wx.TreeCtrl 的首选大小似乎是当树完全折叠时所有元素适合的最小大小。是否有一种好的(即跨平台兼容)方法来计算树的宽度并展开所有内容?我目前的解决方案是这样的: def max_width(s
我正在尝试在 wx.TreeCtrl 上实现拖放操作,我需要同时处理这两个问题“复制”和“移动”操作(如果用户按住 CTRL)。 首先,我搜索了 wiki举个例子,我很困惑使用哪种方法.. 我应该使用
如何向下面名为 fileTree 的 wx.TreeCtrl 中的附加树项添加额外数据。我将文本文件中的数据读入数组以构建树。树中的附加项是图像的文件名,但我想知道如何将完整的文件路径添加到每个项目。
我尝试在 Windows7 上安装 TkTreectrl 没有成功。 我下载了 2.0.1 版本的包解压并尝试运行 setup.py。那个人总是首先提示文件夹 TkTreectrl 不存在,这是错误的
我正在创建具有数百万个节点的树,但是当我切换到在树控件 (wx.TR_MULTIPLE) 上使用多选时,树上的操作变得更慢,我只单击以选择一个节点,这需要我几秒钟的时间。当我使用单选样式 (wx.TR
我有一个 wx.TreeCtrl用户可以按不同标准(日期、名称、ID、降序、升序等)对项目进行排序的结构。这在 Python 2 中运行良好,但 Python 3(使用 wxPython 4)拒绝排序
当鼠标右键单击事件发生时,有没有办法在类 MSComctlLib.TreeCtrl.2 树 View 中单击节点? 可用的方法包括 TV_nodeClick(ByVal 节点作为对象) 它清楚地提供了
我是一名优秀的程序员,十分优秀!