wxPython插入移动事件

时间:2012-04-28 15:25:56

标签: python events wxpython wxwidgets

当TextCtrl / Styled TextCtrl中的插入符号的位置发生变化时,会调用什么事件?我需要绑定事件以在状态栏中显示插入符号的当前位置。

4 个答案:

答案 0 :(得分:2)

尝试将wx.EVT_KEY_UP事件与wx.TextCtrl对象绑定,如下所示:

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Show Caret Position", size=(400, 140))
        panel = wx.Panel(self, wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)
        text = wx.StaticText(panel, -1, "Text:", (10, 22))
        self.textCtrl = wx.TextCtrl(
                panel,
                -1, "",
                (50,5),
                size=(250, 50),
                style=wx.TE_MULTILINE
            )
        self.textCtrl.SetInsertionPoint(0)
        self.textCtrl.Bind(wx.EVT_KEY_UP,self.onTextKeyEvent)
        self.textCtrl.Bind(wx.EVT_LEFT_UP,self.onTextKeyEvent)
        self.statusbar = self.CreateStatusBar(1)
        panel.SetSizerAndFit(sizer, wx.VERTICAL)

    def onTextKeyEvent(self, event):
        statusText = "Caret Position: "+str(self.textCtrl.GetInsertionPoint())
        self.SetStatusText(statusText,0)
        event.Skip()


#Run application
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm()
    frame.Show()
    app.MainLoop()

我已使用Windows 7 + Python 2.7wxPython 2.8环境中进行了测试。

Here is how it should look like

答案 1 :(得分:0)

我认为没有这样的事件,但你可以试试wx.EVT_SET_CURSOR。或者,您可以捕获wx.EVT_CHAR或其中一个EVT_KEY_ *事件,并使用TextCtrl的GetInsertionPoint()方法来了解光标的位置。当您使用鼠标事件在文本控件中单击时,可能需要调用该方法。

答案 2 :(得分:0)

为了知道何时将鼠标放在任何窗口内,您可以绑定wx.EVT_ENTER_WINDOW(参见here

答案 3 :(得分:0)

@Tariq M Nasim代码的问题在于它实际上给了您最后的位置而不是当前的插入符号位置。我发现的最简单的方法是在事件链已经存在时发布新事件,以便将新事件作为队列中的最后一个事件进行处理:

# create event class as global
import wx.lib.newevent
SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent()

# then bind the events in the constructor or somewhere
self.text_ctrl.Bind(wx.EVT_CHAR, self.onKeyDownHandler)
self.text_ctrl.Bind(wx.EVT_LEFT_DOWN, self.onKeyDownHandler)
self.text_ctrl.Bind(wx.EVT_RIGHT_UP, self.onKeyDownHandler)
# bind also new event handler but 
self.text_ctrl.Bind(EVT_SOME_NEW_EVENT , self.onKeyDownAction)

# then define the handlers
def onKeyDownAction(self, evt):
    print("Insertion point {}".format(self.text_ctrl.GetInsertionPoint()))
    evt.Skip()

def onKeyDownHandler(self, evt):
    evt.Skip()
    # post the new event so it will be handled later
    wx.PostEvent(self.text_ctrl, SomeNewEvent())

这样,您在onKeyDownAction中获得的插入点是正确的。