Mac 和 Linux 中没有 EnsureVisible 的 wxPython TreeCtrl SelectItem

wxPython TreeCtrl SelectItem without EnsureVisible in Mac and Linux

我正在为一些激光切割软件 (https://github.com/meerk40t/meerk40t) 编写代码,并且在使用 wxPython 4.0+ 的多选模式下有一个 wx.TreeCtrl。对于某些特定的树项目,我希望 selection 也可以 select 同一树中的其他项目,只是为了表明它们链接到相同的数据,尽管它们没有聚焦。虽然这在 Windows 中工作正常,但 selection 事件的代码在 GTK 中出错,OSX 东西。当其他项目被 selected 时,它调用类似于 EnsureVisibile() 的代码并尝试滚动到那些其他 selected 项目。如果我能把它关掉就好了,但我似乎无法关掉它。它滚动到其他 selected 项目,使拖放变得不可能。

有没有办法 select 没有 SelectItem() 代码的项目?无论如何要为 OSX 和 Linux 禁用该功能?

我尝试核对 EnsureVisible() 函数,select再次对项目进行 select第二次对焦点项目进行撤消滚动并在所有可能的地方进行搜索以寻求修复。有什么想法吗?

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.tree = wx.TreeCtrl(self, wx.ID_ANY, style=wx.TR_MULTIPLE)
        self.root = self.tree.AddRoot("My Tree")
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_1.Add(self.tree, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.on_tree_selection, self.tree)
        for j in range(20):
            for k in range(5):
                self.tree.AppendItem(self.root, str(k))
        self.tree.ExpandAll()

    def on_tree_selection(self, event):
        label = self.tree.GetItemText(self.tree.GetFocusedItem())
        h = self.tree.GetFirstChild(self.root)[0]
        while h.IsOk():
            if label == self.tree.GetItemText(h):
                self.tree.SelectItem(h, True)
            h = self.tree.GetNextSibling(h)

class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

有问题的基本应用程序。在 windows 中,它 select 包含所有内容并且工作正常。在 MacOSX 或 Linux 或 RPi 中它滚动使代码无法使用。

我同意,如果新选择的项目不是唯一选择的项目,则不应选择它,但不幸的是,目前似乎无法从控件外部禁用此行为。这是 wxWidgets 本身的 just fixed,所以如果你使用下一个 wxWidgets/wxPython 版本(或者现在从主源重建它们),你不应该有这个问题,但与此同时我只能推荐一些指示项目已链接的其他方式,因为恕我直言,在任何情况下选择它们都不是特别用户友好,因为无论如何这应该在用户控制之下。例如,您可以将他们的字体更改为斜体,或者使用一些特殊的颜色,或者甚至(暂时)更改他们的标签。