我认为这一定是一个非常基本的问题,但我已经用谷歌搜索了它没有明确的答案,所以这里是:我有一个 TextCtrl,我想要一个非常基本的事件序列:1)用户将焦点移到控件上不择手段。2) 用户在 TextCtrl 中键入内容。3)用户点击返回或标签。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 将焦点移动到 Tab 键顺序中的下一个小部件。
您可能想阅读有关该主题的以下内容:
有关 wxPython 的 key 和 char 事件的更多信息,请参阅以下内容:
1.要使标签完全起作用,您在其上安装控件/wigits 的窗口或单个面板必须具有以下样式标志的一部分: wxTAB_TRAVERSAL 即;
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 号。添加到 sizers/panels 的顺序似乎对我没有帮助。
4)这里有一个小演示,一旦你设置了控件,就可以设置标签顺序:
order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
order[i+1].MoveAfterInTabOrder(order[i])