Как переопределить поиск ключа в treectrl? - PullRequest
0 голосов
/ 12 января 2012

Я хочу знать, как переопределить поиск ключей по умолчанию в treectrl.

Когда я связываю метод с событием EVT_TREE_KEY_DOWN и вызываю метод selectItem в treectrl, он не имеет никакого эффекта.

Это моё дерево:

Тест <- root </p>

-Aero Orea (EI)

-Blub (BL)

-Test (AX)

-123 (45)

-Blib (LOL)

Мое намерение: с событием keydown я объединяю строку поиска.при переборе элементов дерева я разделяю имена, чтобы получить содержимое скобок (например: «EI», «BL» ...).Затем я проверяю, начинается ли содержимое скобок с моей строки поиска.если это правда, вызывается selectItem (TreeItemId).Но это не сработает.Похоже, что поиск по умолчанию все еще работает и вызывает проблемы в моем поиске ключей.

class MeinTreeCtrl(wx.TreeCtrl):

def __init__(self, parent):
    wx.TreeCtrl.__init__(self, parent, -1)
    root = self.AddRoot("test")
    self.AppendItem(root, "Aero orea(EI)")
    self.AppendItem(root, "Blub(BL)")
    self.AppendItem(root, "Test(AX)")
    self.AppendItem(root, "123(45)")
    self.AppendItem(root, "Blib(LOL)")
    self.searchString = ""
    self.lastKeyDown = time.time()

    parent.Bind(wx.EVT_TREE_KEY_DOWN, self.OnTreeKeySearch, self)

def GetItem(self, match, root):
    item = self.GetFirstChild(root)
    while item.IsOk():
        tmp = self.GetItemText(item)
        tmp = tmp.split(")")
        tmp = tmp[len(tmp) - 2]
        tmp = tmp.split("(")
        tmp = tmp[len(tmp) - 1]
        if tmp.startswith(match):
            self.SelectItem(item)
            break
        item = self.GetNextChild(root, item)
    return False

def OnTreeKeySearch(self, event):         
    now = time.time()
    if self.searchString == "":
        self.searchString = chr(event.GetKeyCode())
    if (now - self.lastKeyDown) < 3:
        self.searchString += str(chr(event.GetKeyCode()))
    else:
        self.searchString = str(chr(event.GetKeyCode()))
    self.lastKeyDown = now
    self.GetItem(self.searchString, self.GetRootItem()) 

У вас есть какие-либо подсказки?

Спасибо и с наилучшими пожеланиями Томас

1 Ответ

0 голосов
/ 13 января 2012

После нескольких дней поиска я нашел свою ошибку. В этой строке была проблема:

parent.Bind(wx.EVT_TREE_KEY_DOWN, self.OnTreeKeySearch, self)

Сначала мне нужно только EVT_KEY_DOWN, а не событие дерева для нажатия клавиши. Во-вторых, я связал метод с родителем, а не с самим собой (потому что я скопировал и вставил :()

Это утверждение было действительно полезным для меня:

Типичным примером не распространяемого события является wx.EVT_KEY_DOWN. Он отправляется только на элемент управления, имеющий фокус, и не будет размножить его родителю.

- Распространение событий

...