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_TEXTwx.EVT_KEY_DOWN 而不是,尽管两者都没有与 wx.EVT_CHAR.

完全相同的行为