Python 如何在Matplotlib文本框小部件中设置光标位置?
如何强制小部件中的文本末尾出现光标?我希望能够创建一个Python 如何在Matplotlib文本框小部件中设置光标位置?,python,matplotlib,widget,Python,Matplotlib,Widget,如何强制小部件中的文本末尾出现光标?我希望能够创建一个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, '', initi
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))
…调用位置\u游标时失败,原因是:
RuntimeError: Cannot get window extent w/o renderer
这是因为在调用position\u cursor
之前需要绘制(渲染)图形吗
如果我注释掉失败的行并取消注释最后一行,我不会得到运行时错误,但光标不会出现在任何地方,更不用说在我想要的文本末尾了,似乎position\u cursor
函数从图的左侧以像素为单位获取一个x
位置。这对您的用例不有用
但是,我们可以从该函数中获取几个部分并使用它们
如果我在ipython会话中运行,并使图形具有交互性(plt.ion()
它对我有用 为了在显示图形时执行某些代码,您可以使用单次触发计时器。该计时器的回调可能包含赋予文本框
焦点并相应放置光标的代码
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()
运行此操作时,您可以在图形打开后直接开始键入。位置\u光标
不接受字符数的输入。它是文本框
所在的轴
实例的x位置。查看源代码了解它的功能。因此,即使这没有给您一个运行时错误
,将其与len(初始文本)
一起使用也不是正确的使用方式……这是一个遗憾,因为在我看来,使用大量字符似乎是文本输入小部件更直观的用例。无论如何,即使是text\u box.position\u cursor(0)
也不会导致光标出现。基于对源代码的快速查看,我认为该函数在单击框时使用-它将单击事件的x位置提供给该函数,以将光标移动到单击的位置。所以我不知道它是否真的是为你描述的用途而设计的-因此不是最“直观的”,你可能是对的。在这种情况下,它可能应该被称为\u position\u cursor()
。在查看源代码时,我还尝试了对text\u box.cursor\u index=len(初始文本)
的破解,然后是text\u box.\u rendercursor()
,但也没有让光标出现。嗯,我只是用这个技巧添加了一个答案。它适用于交互式ipython图形。不幸的是,我没有使用ipython,如果我尝试plt.ion()
应用程序会立即退出。在我的大型代码库中,我没有使用交互模式。这很有效-谢谢!但是,天哪,做一个简单的任务需要做很多工作。我尝试过不使用计时器直接调用您的autofocus()
方法,但我想您需要计时器来告诉Matplotlib要使用哪个画布?是这样吗?不,关键是您希望在创建图形时调用autofocus
,即一旦启动事件循环。如果你事先打电话给它,它就没有任何用处了。
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()