Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython插入符号移动事件_Python_Events_Wxpython_Wxwidgets - Fatal编程技术网

wxPython插入符号移动事件

wxPython插入符号移动事件,python,events,wxpython,wxwidgets,Python,Events,Wxpython,Wxwidgets,当TextCtrl/Styled TextCtrl中的插入符号的位置发生更改时,将调用什么事件?我需要绑定事件以在状态栏中显示插入符号的当前位置。我认为没有这样的事件,但您可以尝试wx.EVT\u SET\u游标。或者,您可以捕获wx.EVT_CHAR或一个EVT_KEY_*事件,并使用TextCtrl的GetInsertionPoint()方法知道光标在哪里。在文本控件中单击鼠标事件时,可能需要调用该方法。尝试将wx.EVT\u KEY\u UP事件与wx.TextCtrl对象绑定,如下所示:

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

我认为没有这样的事件,但您可以尝试wx.EVT\u SET\u游标。或者,您可以捕获wx.EVT_CHAR或一个EVT_KEY_*事件,并使用TextCtrl的GetInsertionPoint()方法知道光标在哪里。在文本控件中单击鼠标事件时,可能需要调用该方法。

尝试将
wx.EVT\u KEY\u UP
事件与
wx.TextCtrl
对象绑定,如下所示:

我已经在
windows7
环境下用
python2.7
+
wxpython2.8
进行了测试


为了知道鼠标何时放置在任何窗口中,您可以绑定wx.EVT\u ENTER\u窗口(请参见)

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

尝试了wx.stc.EVT_stc_CHANGE,当我更改内容时很好,但当我只是移动插入符号时就不好。是的,它与键盘配合得很好,非常感谢。但是当我用鼠标改变插入符号的位置时,它就不能正常工作了。哦,我忘了为
TextCtrl
添加
MouseEvent
,只需在行self.TextCtrl.Bind,self.onTextKeyEvent(wx.EVT\u LEFT\u UP,self.onTextKeyEvent)”之后添加行
self.TextCtrl.Bind(wx.EVT\u KEY\u-UP,self.onTextKeyEvent)”。在我的安装中,这不起作用(如果我正确阅读了文档,也不应该起作用)
OnKeyUp
在光标移动之前被调用,因此
GetInsertPoint
将始终返回光标在移动之前而不是之后的位置。这可以通过一些代码来解决,但是wxWidgets.wx.EVT_SET_游标确实有一个改进的地方,它使我的指针没有转换成类似“I”字母的东西。有没有其他方法可以在不阻止鼠标变换的情况下使用?我可能应该说您可以使用wx.EVT_LEFT_DOWN而不是游标方法。试试看。它没有成功地停止我的鼠标指针的转换,但现在需要双击鼠标来移动插入符号…有趣的是,现在状态栏延迟了1圈。假设我按顺序选择,第1行第2列,第3行第2列,第1行第8列。它显示第一个2插入符号位置更改的第1列第2列,当我执行第三个时,它显示第3列第2列。然而,如果我用键盘移动插入符号,它会显示右边的行和列数。部分相关:只要一个键按下,向下事件就会重复发生。所有活动都是一次性的。一旦你释放了一把钥匙,你就不会一直为没有按下的每把钥匙获取钥匙启动事件。
# 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())