Вопрос

Я думаю, что это, должно быть, довольно простой вопрос, но я загуглил его до смерти, но не нашел четкого ответа, поэтому вот:У меня есть TextCtrl, и мне нужна довольно простая последовательность событий:1) Пользователь всеми правдами и неправдами перемещает фокус на элемент управления.2) Пользователь вводит что-то в TextCtrl.3) Пользователь нажимает Enter или Tab.4) На этом этапе код захватывает текст в TextCtrl, выполняет простую обработку, а затем перемещает фокус на любой элемент управления, следующий в порядке табуляции.

Может ли кто-нибудь сказать мне, как это сделать?Мне это кажется таким простым, но я нигде не могу найти ответ.Извините, если я пропустил что-то очевидное.

Это было полезно?

Решение

Чтобы это работало правильно, вам нужно будет перехватить ключевые события и проверить, нажал ли пользователь клавиши Enter или Tab.Как уже упоминалось @sundar, чтобы вкладка работала правильно на всех платформах, виджеты должны быть дочерними элементами панели.Вот довольно простой пример:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        self.text = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
        self.text.Bind(wx.EVT_KEY_DOWN, self.onEnter)
        btn = wx.Button(self, label="Do something")
        self.text.SetFocus()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text, 0, wx.EXPAND|wx.ALL, 5)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

    #----------------------------------------------------------------------
    def onEnter(self, event):
        """"""
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER or keycode == wx.WXK_TAB:
            self.process_text(event=None)
            event.EventObject.Navigate()
        event.Skip()

    #----------------------------------------------------------------------
    def process_text(self, event):
        """
        Do something with the text
        """
        text = self.text.GetValue()
        print text.upper()
        for word in text.split():
            print word

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="TextCtrl Demo")
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

Здесь мы привязываемся к wx.EVT_KEY_DOWN и попросите его извлечь код клавиши, который был нажат.Затем он проверяет, является ли код клавиши клавишей Enter или Tab.Если это так, он вызывает функцию для обработки текста, а затем вызывает event.EventObject.Navigate(), что заставит wxPython переместить фокус на следующий виджет в порядке табуляции.

Возможно, вам будет интересно прочитать следующее по этой теме:

Для получения дополнительной информации о событиях key и char wxPython см. следующее:

Другие советы

1. Для табл. Для работы вообще работают, окно или отдельная панель, которую вы Plonk элементы управления / FOGITS должны иметь в качестве части своего стиля Flag следующее: WXTAB_TRAVERSAL IE;

class MyPanel(wx.Panel):
    def __init__(self, parent,id):
        wx.Panel.__init__(self, parent, id, wx.DefaultPosition,wx.DefaultSize,
                         wx.RAISED_BORDER|wx.TAB_TRAVERSAL)
.

2.Заказ TAB устанавливается заказ, который вы добавляете элементы управления на панель или кадр.

3) Заказ в вкладках также, по-видимому, зависит от создания виджетов заказа.Я предполагаю, что это связано с идентификаторами виджета.Порядок дополнения к суставам / панелям, казалось, не помогал мне.

4) Вот небольшое заказать вкладку на настройку демофа, как только у вас есть элементы управления, установленные:

order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
   order[i+1].MoveAfterInTabOrder(order[i])
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top