wx Python TreeCtrl SelectItem без EnsureVisible в Ma c и Linux - PullRequest
0 голосов
/ 10 марта 2020

Я пишу код для некоторого программного обеспечения для лазерной резки (https://github.com/meerk40t/meerk40t), и в режиме множественного выбора есть wx.TreeCtrl с использованием wx Python 4.0+. Для некоторых определенных элементов дерева я хочу, чтобы выбор также выбирал другие элементы в том же дереве просто в качестве указания на то, что они связаны с одними и теми же данными, хотя и не сфокусированы. Хотя это прекрасно работает в 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()

Basi c Приложение с проблемой. В windows он выбирает все вещи и работает нормально. В MacOSX, Linux или RPi он прокручивается, что делает код непригодным для использования.

1 Ответ

1 голос
/ 11 марта 2020

Я согласен с тем, что новый выбранный элемент не следует выбирать, если это не единственный выбранный элемент, но, к сожалению, в настоящее время невозможно отключить это поведение за пределами элемента управления. Это было только что исправлено в самом wxWidgets, поэтому у вас не должно быть этой проблемы, если вы используете следующий релиз wxWidgets / wx Python (или перестраиваете их из основных источников прямо сейчас), но в то же время я Я могу только рекомендовать какой-то другой способ указать, что элементы связаны, потому что, IMHO, их выбор не особенно удобен для пользователя в любом случае, так как это то, что должно быть под контролем пользователя в любом случае. Например, вы можете изменить их шрифт на itali c, или использовать какой-то специальный цвет, или даже (временно) изменить их метку.

...