我正在为某些激光切割机软件(https://github.com/meerk40t/meerk40t)写代码,并且使用wxPython 4.0+在“多选”模式下有一个wx.TreeCtrl。对于某些特定的树项目,我希望选择还选择同一棵树中的其他项目,只是为了表明它们虽然没有集中精力却链接到相同的数据。尽管在Windows中可以正常工作,但GTK,OSX素材的选择事件代码却出错。选择其他项目后,它将调用类似于EnsureVisibile()的代码,并尝试滚动到其他那些选择的项目。如果可以将其关闭,则可以,但是似乎无法将其关闭。它滚动到其他选定的项目,因此无法进行拖放。
是否有某种方式可以选择没有SelectItem()代码的项目?无论如何,有没有针对OSX和Linux禁用该功能?
我曾尝试过核对SecureVisible()函数,再次选择项目,然后再次选择焦点项目以撤消滚动,并在所有可能的修复位置进行搜索。有什么想法吗?
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中,它会选择所有内容并正常工作。在MacOSX,Linux或RPi中,它会滚动,从而使代码无法使用。
我同意,如果不是新选择的项目不是唯一选择的项目,则不幸的是,目前似乎无法从控件外部禁用此行为。这可能应该是固定的,但是与此同时,我只能推荐其他方式来指示项目已链接,因为恕我直言,在任何情况下选择它们都不是特别用户友好的,因为这应该被认为是不正确的。用户控制。例如,您可以将其字体更改为斜体,或使用一些特殊的颜色,甚至可以(临时)更改其标签。
P.S。碰巧的是,a patch确切地解决了您要报告的问题是在几天前提交的,应尽快应用,因此应在下一wxWidgets / wxPython版本中进行解决。