【发布时间】:2020-03-10 08:05:48
【问题描述】:
我正在为某个激光切割机软件 (https://github.com/meerk40t/meerk40t) 编写代码,并且使用 wxPython 4.0+ 在多选模式下有一个 wx.TreeCtrl。对于某些特定的树项目,我想要一个选择来选择同一树中的其他项目,这只是表明它们链接到相同的数据,尽管它们没有聚焦。虽然这在 Windows 中运行良好,但对于 GTK、OSX 的东西,选择事件的代码出错了。当其他项目被选中时,它调用类似于 EnsureVisibile() 的代码并尝试滚动到其他选定的项目。如果我可以关闭它会很好,但我似乎无法关闭它。它会滚动到其他选定的项目,因此无法拖放。
有没有办法在没有 SelectItem() 代码的情况下选择一个项目?无论如何要禁用 OSX 和 Linux 的该功能?
我尝试使用 EnsureVisible() 函数,再次选择项目,再次选择焦点项目以撤消滚动并在所有可能的地方搜索以进行修复。有什么想法吗?
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 中,它会滚动导致代码无法使用。
【问题讨论】:
-
你的意思是在 GTKOSX 上它只会滚动而不选择任何东西?
-
不,它会选择我想要选择的东西。它也会滚动到它们。如果我想拖动刚刚单击的对象,滚动到它们就是死亡。
标签: treeview wxwidgets wxpython