Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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
Python 如何更改事件处理程序中wxRichTextCtrl的光标位置?_Python_Events_Wxpython_Wxwidgets - Fatal编程技术网

Python 如何更改事件处理程序中wxRichTextCtrl的光标位置?

Python 如何更改事件处理程序中wxRichTextCtrl的光标位置?,python,events,wxpython,wxwidgets,Python,Events,Wxpython,Wxwidgets,我的应用程序中有一个RichTextCtrl,它有一个处理程序,用于EVT\u KEY\u DOWN。执行的代码如下所示: def move_caret(self): pdb.set_trace() self.rich.GetCaret().Move((0,0)) self.Refresh() def onClick(self,event): self.move_caret() event.Skip() rich是我的RichTextCtrl 以下

我的应用程序中有一个RichTextCtrl,它有一个处理程序,用于
EVT\u KEY\u DOWN
。执行的代码如下所示:


def move_caret(self):
    pdb.set_trace()
    self.rich.GetCaret().Move((0,0))
    self.Refresh()


def onClick(self,event):
    self.move_caret()
    event.Skip()
rich是我的RichTextCtrl

以下是我希望它能做的:

  • 每次按键时,将按键添加到控件(这是默认行为)

  • 将光标移动到控件开头的第一个位置

以下是它的实际功能:

  • 它将键添加到控件中

  • 我检查了插入符号位置,调试器报告它位于0,0,但在控件上,它在当前位置闪烁(这是我按下键+1之前的位置)


你看到这里有什么不对劲吗?一定是我做错了什么。

显然,您的代码有两个问题:

  • 您可以在
    EVT_KEY_DOWN
    上收听,这可能是在
    EVT_TEXT
    之前处理的,其默认处理程序设置光标位置

  • 您可以修改
    插入符号
    对象,而不是使用
    SetInsertionPoint
    方法,该方法可以移动插入符号并使下一个字符显示在给定位置

  • 因此,工作示例(我对其进行了测试,并按照您的要求工作)是:

    # Somewhere in __init__:
        self.rich.Bind(wx.EVT_TEXT, self.onClick)
    
    def onClick(self, event):
        self.rich.SetInsertionPoint(0) # No refresh necessary.
        event.Skip()
    

    编辑:如果希望文本添加到末尾,但光标保留在开头(请参见注释),可以利用这样一个事实,即
    EVT\u KEY\u DOWN
    EVT\u text
    之前处理(这反过来又在添加字符之后处理)。因此,事件的顺序是:

  • 手柄
    EVT\u键向下
  • 在当前插入点添加字符
  • 句柄
    EVT\u文本
  • 添加一个
    EVT_KEY_DOWN
    处理程序,在实际添加角色之前将插入点移动到末尾,这样做非常好。因此,除了前面提到的代码外,还要编写:

    # Somewhere in __init__:
        self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
    
    def onKeyDown(self, event):
        self.rich.SetInsertionPointEnd()
        event.Skip()
    

    顺便说一下,
    event.Skip()
    不会立即调用下一个事件处理程序,它只是在
    event
    对象中设置一个标志,以便事件处理程序知道是否在该处理程序之后停止传播事件。

    如果在onClick()中注释掉event.Skip(),会发生什么?或者,我会将一个小的工作示例发布到邮件列表中,让那些专家查看。如果我注释event.Skip(),则该字符不会附加到控件中。我希望该字符正常显示,而不是在位置0。之后,我想将插入符号移动到位置0。你能告诉我怎么做吗?我尝试先放置event.Skip,然后调用SetInsertionPoint,但我得到了相同的行为。