3

これはかなり基本的な質問に違いないと思いますが、明確な答えがないままグーグルで検索したので、次のようになります: TextCtrl があり、イベントのかなり基本的なシーケンスが必要です: 1) ユーザーは、フックまたはクルックで。2) ユーザーが TextCtrl に何かを入力します。3) ユーザーがリターンまたはタブを押します。4) この時点で、コードは TextCtrl 内のテキストを取得し、簡単な処理を行ってから、タブ順で次のコントロールにフォーカスを移動します。

誰でもこれを行う方法を教えてもらえますか? 私にはとても基本的なように思えますが、どこにも答えが見つかりません。明らかな何かを見逃していたらごめんなさい。

4

2 に答える 2

3

これを適切に機能させるには、キー イベントをキャッチし、ユーザーが 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 はフォーカスをタブ オーダーの次のウィジェットに移動します。

この件については、次の記事を読むとよいでしょう。

wxPython の key および char イベントの詳細については、以下を参照してください。

于 2014-08-04T14:05:04.403 に答える
1

1.タブ移動が機能するためには、コントロール/ウィジットを配置するウィンドウまたは個々のパネルが、そのスタイル フラグの一部として次のものを持っている必要があります: 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. タブ オーダーは、パネルまたはフレームにコントロールを追加する順序によって設定されます。

3) タブの順序も、ウィジェットが作成される順序に依存しているようです。これはウィジェットの ID 番号によるものだと思います。サイザー/パネルへの追加の順序は、私には役に立たないようでした.

4) コントロールを設定したら、タブ オーダーを設定するデモ用の小さなデモを次に示します。

order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
   order[i+1].MoveAfterInTabOrder(order[i])
于 2014-08-02T03:03:18.613 に答える