wxPython:如何在多行 TextCtrl 上收听 EVT_CHAR 事件?
wxPython: How can I listen to EVT_CHAR events on a multiline TextCtrl?
我能够在 TextCtrl 上成功监听 EVT_CHAR 事件,但是当我将 TextCtrl 更改为使用 TE_MULTILINE 时,绑定似乎停止工作。
self.input = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.input.Bind(wx.EVT_CHAR, self.OnChar)
我正在使用 3.0.3.dev1820+49a8884 osx-cocoa (phoenix).
如何在多行 TextCtrl 上收听 EVT_CHAR 事件?
我无法重现您的问题。这是我从 the Mouse vs the Python blog 修改的工作代码。我只是将文本控件的样式更改为 wx.TE_MULTILINE,它仍然适用于 Windows7 (wxPython2.8.12.1)。难道是凤凰虫?
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Char Event Tutorial")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
btn = wx.TextCtrl(panel, value="", style=wx.TE_MULTILINE)
btn.Bind(wx.EVT_CHAR, self.onCharEvent)
def onCharEvent(self, event):
keycode = event.GetKeyCode()
controlDown = event.CmdDown()
altDown = event.AltDown()
shiftDown = event.ShiftDown()
print keycode
if keycode == wx.WXK_SPACE:
print "you pressed the spacebar!"
elif controlDown and altDown:
print keycode
event.Skip()
# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm()
frame.Show()
app.MainLoop()
问题中显示的代码 应该 有效,如果您不在 Mac 上, 可以。它在 Macs 上不起作用的事实是一个错误 - 我在 https://github.com/wxWidgets/Phoenix/issues/804 上报告了它并得到了维护者的确认。
该错误将在 wxPython 4.1 中修复,在撰写本文时 wxPython 4.1 尚未发布。
如果您必须使用没有修复的 wxPython 版本,那么根据您的目标,可能 足以绑定到 wx.EVT_TEXT
或wx.EVT_KEY_DOWN
而不是,尽管两者都没有与 wx.EVT_CHAR
.
完全相同的行为
我能够在 TextCtrl 上成功监听 EVT_CHAR 事件,但是当我将 TextCtrl 更改为使用 TE_MULTILINE 时,绑定似乎停止工作。
self.input = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.input.Bind(wx.EVT_CHAR, self.OnChar)
我正在使用 3.0.3.dev1820+49a8884 osx-cocoa (phoenix).
如何在多行 TextCtrl 上收听 EVT_CHAR 事件?
我无法重现您的问题。这是我从 the Mouse vs the Python blog 修改的工作代码。我只是将文本控件的样式更改为 wx.TE_MULTILINE,它仍然适用于 Windows7 (wxPython2.8.12.1)。难道是凤凰虫?
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Char Event Tutorial")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
btn = wx.TextCtrl(panel, value="", style=wx.TE_MULTILINE)
btn.Bind(wx.EVT_CHAR, self.onCharEvent)
def onCharEvent(self, event):
keycode = event.GetKeyCode()
controlDown = event.CmdDown()
altDown = event.AltDown()
shiftDown = event.ShiftDown()
print keycode
if keycode == wx.WXK_SPACE:
print "you pressed the spacebar!"
elif controlDown and altDown:
print keycode
event.Skip()
# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm()
frame.Show()
app.MainLoop()
问题中显示的代码 应该 有效,如果您不在 Mac 上, 可以。它在 Macs 上不起作用的事实是一个错误 - 我在 https://github.com/wxWidgets/Phoenix/issues/804 上报告了它并得到了维护者的确认。
该错误将在 wxPython 4.1 中修复,在撰写本文时 wxPython 4.1 尚未发布。
如果您必须使用没有修复的 wxPython 版本,那么根据您的目标,可能 足以绑定到 wx.EVT_TEXT
或wx.EVT_KEY_DOWN
而不是,尽管两者都没有与 wx.EVT_CHAR
.