1

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

4

4 回答 4

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

这是它的样子

于 2012-04-30T19:29:19.170 回答
1

@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 中获得的插入点是正确的。

于 2019-11-30T12:18:36.043 回答
0

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

于 2012-04-30T14:50:04.853 回答
0

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

于 2017-03-29T11:36:01.267 回答