我能够在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(凤凰)。
如何在多行TextCtrl上收听EVT_CHAR事件?
答案 0 :(得分:1)
问题中显示的代码应该工作,如果你不在Mac上, 。它在Mac上不起作用的事实是一个错误 - 我在https://github.com/wxWidgets/Phoenix/issues/804报告了它,并且得到了维护者的证实。
该错误将在wxPython 4.1中修复,在撰写本文时尚未发布。
如果您必须使用没有此修复程序的wxPython版本,那么根据您的目标,可能足以绑定到wx.EVT_TEXT
或wx.EVT_KEY_DOWN
相反,虽然它们与wx.EVT_CHAR
没有完全相同的行为。
答案 1 :(得分:0)
我无法重现你的问题。这是我从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()