如何在Matplotlib TextBox小部件中设置光标位置?

时间:2018-07-19 13:47:45

标签: python matplotlib widget

如何在TextBox小部件中强制光标显示在文本的结尾?我希望能够创建一个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

这是因为需要在调用position_cursor之前绘制(渲染)图形吗?

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

2 个答案:

答案 0 :(得分:1)

因此,似乎position_cursor函数在图的左侧占像素数的x位置。对您的用例无用。

但是,我们可以从该函数中抓取几个部分并使用它们。

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

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

对我有用。

答案 1 :(得分:0)

为了在显示图形时执行一些代码,您可以使用单次计时器。该计时器的回调可能包含赋予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()

运行此命令,您可以在打开数字后直接开始输入文字。