Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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 如何在Matplotlib文本框小部件中设置光标位置?_Python_Matplotlib_Widget - Fatal编程技术网

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()