wxpython textctrlをCRまたはTABに応答する
質問
これはかなり基本的な質問でなければならないと思いますが、私はここではここに進む:私はtextctrlを持っていて、私はかなり基本的なイベントのシーケンスを持っています:1)ユーザーはフォーカスを移動しますフックまたはクルックによるコントロール。2)ユーザーはtextctrlに何かを入力します。3)ユーザーは戻り値またはタブを押します。4)この時点で、コードはTextCtrlのテキストをつかみます。
誰かがこれを行う方法を教えてもらえますか?それは私にとって非常に基本的なようですが、私はどこにでも答えを見つけることができません。私が明らかな何かを逃したらすみません。
解決
これを正しく機能させるには、キーイベントをキャッチして、ユーザーがEnterキーまたはTabキーを押したかどうかを確認する必要があります。既に述べたように、タブがすべてのプラットフォームで正しく機能するようになるために、ウィジェットはパネルの子である必要があります。これがかなり簡単な例です:
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
にバインドし、押されたキーコードを抽出しています。その後、KeyCodeがEnterキーまたはTabキーのかどうかを確認します。そうであれば、それはテキストを処理してからevent.EventObject.Navigate()
を呼び出します。これにより、wxpythonがタブ順で次のウィジェットにフォーカスを移動させます。
その主題について次のように読むことができます。
- http:// wxpython-users。 1045709.n5.nabble.com/textctrl-processing-enter-key-td5075499.html
- http://www.wxpython.org/docs/api/ wx.navigationKeyevent-class.html
wxpythonのキーとCHARイベントの詳細については、次の項目を参照してください。
他のヒント
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)コントロールが設定された後に、ここで少しDemofor設定タブ注文があります。
order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
order[i+1].MoveAfterInTabOrder(order[i])
.