如何在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
之前绘制(渲染)图形吗?
如果我注释掉失败的行并取消注释了最后一行,我没有得到运行时错误,但是光标没有出现在任何地方,更不用说在文本末尾了。
答案 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()
运行此命令,您可以在打开数字后直接开始输入文字。