wxPython:如何在多行TextCtrl上监听EVT_CHAR事件?

时间:2015-07-24 21:28:52

标签: python wxpython

我能够在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事件?

2 个答案:

答案 0 :(得分:1)

问题中显示的代码应该工作,如果你不在Mac上, 。它在Mac上不起作用的事实是一个错误 - 我在https://github.com/wxWidgets/Phoenix/issues/804报告了它,并且得到了维护者的证实。

该错误将在wxPython 4.1中修复,在撰写本文时尚未发布。

如果您必须使用没有此修复程序的wxPython版本,那么根据您的目标,可能足以绑定到wx.EVT_TEXTwx.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()