代码之家  ›  专栏  ›  技术社区  ›  snark

如何在matplotlib文本框小部件中设置光标位置?

  •  1
  • snark  · 技术社区  · 6 年前

    如何强制光标出现在 TextBox 小装置?我希望能够创建一个 文本框 小部件,让它立即聚焦,并将光标设置为显示在其中文本的末尾。

    以下代码…

    import matplotlib.pyplot as plt    
    from matplotlib.widgets import TextBox
    
    axbox = plt.axes([0.4, 0.5, 0.2, 0.075])
    
    initial_text = "Change me"
    text_box = TextBox(axbox, '', initial=initial_text)
    text_box.position_cursor(len(initial_text)) # RuntimeError!
    
    plt.show()
    #text_box.position_cursor(len(initial_text))
    

    …在呼叫时失败 position_cursor 用:

    RuntimeError: Cannot get window extent w/o renderer
    

    这是因为在调用 位置光标 ?

    如果我注释掉失败的行并取消最后一行的注释,我不会得到运行时错误,但光标不会出现在任何地方,更不用说在我想要的文本末尾了。

    2 回复  |  直到 6 年前
        1
  •  0
  •   ImportanceOfBeingErnest    6 年前

    为了在显示图形时执行一些代码,可以使用单次放炮计时器。该计时器的回调可能包含用于 TextBox 对焦并相应地放置光标。

    import matplotlib.pyplot as plt    
    from matplotlib.widgets import TextBox
    
    axbox = plt.axes([0.4, 0.5, 0.2, 0.075])
    
    initial_text = "Change me"
    text_box = TextBox(axbox, '', initial=initial_text)
    
    def autofocus():
        text_box.cursor_index = len(initial_text)
        text_box._rendercursor()
        text_box.begin_typing(None)
    
    
    timer = plt.gcf().canvas.new_timer()
    timer.single_shot = True
    timer.add_callback(autofocus)
    timer.start()
    
    plt.show()
    

    运行这个程序,您可以在图形打开后直接开始键入。

        2
  •  1
  •   tmdavison    6 年前

    所以,看起来 position_cursor 函数接受 x 从图形左侧开始的像素数位置。对您的用例不有用。

    但是,我们可以从这个函数中获取一些部分并使用它们。

    如果我在ipython会话中运行,并使图形交互( plt.ion() 在模块导入之后),并使用

    text_box.cursor_index = len(initial_text)
    text_box._rendercursor()
    

    它对我有用。