Octave:如何防止绘图窗口自动关闭?

14

使用Octave CLI或Octave GUI,如果我运行

plot([1,2,3],[1,4,9])

它会显示一个绘图窗口,我可以查看并与之交互。但如果我使用相同的命令创建名为myPlot.m的文件,则会出现内容

Translated:

它将显示一个绘图窗口,我可以查看并与之交互。但如果我使用相同的命令创建名为 myPlot.m 的文件,则会显示相同的内容。

plot([1,2,3],[1,4,9])

而且我是用它运行的

octave myPlot.m

然后我会短暂地看到绘图窗口出现,但很快就会自动关闭。如何防止这个窗口自动关闭?

Octave 4.2.2 Ubuntu 18.04


我的问题不是关于如何禁用交互模式,而是关于拥有一个不会自动关闭的绘图窗口。话虽如此,其中一些答案可能对我有帮助。 - Gael Lorieul
是的,重复指向回答您问题的答案,而不一定是相同的问题。这些重复帮助人们找到正确的答案,而无需我们多次输入相同的答案。 :) - Cris Luengo
1
是的,答案是在绘图后使用waitfor命令。这将等待直到绘图关闭,如果它是脚本中的最后一个命令,则会适当地退出Octave。 - Tasos Papastylianou
@TasosPapastylianou 感谢您的提示!这也在重复的问题中提到过,但不幸的是给出答案的人没有展示完整的脚本示例,即在waitfor(h)中,你从哪里获取h - Gael Lorieul
2个回答

12

这里是一个完整的示例,考虑到评论中的混淆。

假设您创建了一个名为plotWithoutExiting.m的脚本,旨在直接从Linux shell调用,而不是在Octave解释器内部调用:

#!/opt/octave-4.4.1/bin/octave

h = plot(1:10, 1:10);
waitfor(h)
disp('Now that Figure Object has been destroyed I can exit')
在Linux中,第一行对应于“shebang”语法;这个特殊的注释告诉bash shell运行哪个解释器来执行下面的脚本。我在这里使用了我的Octave可执行文件的位置,你的位置可能不同,需要相应地进行调整。
然后,我在Bash shell中更改权限,使该文件可执行。
chmod +x ./plotWithoutExiting.m

那么我可以通过运行该文件来运行它:

./plotWithoutExiting.m

或者,您可以跳过"shebang"和可执行权限,尝试通过显式调用Octave解释器来运行此文件,例如:

octave ./plotWithoutExiting.m

甚至更多

octave --eval "plotWithoutExiting"

如果需要的话,您还可以添加--no-gui选项,以防Octave GUI短暂弹出。

然后,上述脚本应该运行,并捕获绘图到一个图形对象句柄h中。 waitfor(h)将暂停程序流程,直到图形对象被销毁(例如通过手动关闭窗口)。

理论上,如果您不关心收集图形句柄,只需使用waitfor(gcf)来暂停执行,直到销毁最后一个活动的图形对象。

一旦发生这种情况,程序会正常继续运行,直到退出。如果您没有以交互模式运行Octave解释器,则通常也会退出Octave环境(如果这不是您想要的,请使用--persist选项防止此情况发生)。

希望这可以帮助您。


有点奇怪:窗口打开后不会自动关闭,所以 waitfor(h) 指令在这个意义上是有效的。然而,(1:10,1:10) 行直到我关闭窗口之前都不会显示!在此之前,我只能看到一对坐标轴和一个空白图形!使用 waitfor(gcf) 时也会出现相同的行为。 - Gael Lorieul
@GaelLorieul 不可能!也许这是你使用的旧版本的一个错误?否则就没有道理了,因为在我的示例中我没有单独创建轴。另外,你使用的操作系统是什么? - Tasos Papastylianou
对于一个带有hold on的图形,我必须在waitfor语句上方添加一个pause(1)。如果没有这个暂停,图例就不会显示出来。似乎是在图例实际绘制之前就开始了该块。 - guru
@guru 这听起来更像是一个 bug(如果你使用的是最新版本的 octave,可能是一个回归 bug)。我鼓励你在 octave 的 bug 追踪器上报告它。 - Tasos Papastylianou
更新:如果您遇到与@GaelLorieul相同的“空白图”问题,请在waitfor之前使用drawnow命令。这将强制立即绘制图形,而不是等待“好机会”将内容刷新到图形中。似乎Octave并不一定认为waitfor事件是这样的机会...然后冻结任何会在下一行创建这样机会的内部工作。 - Tasos Papastylianou

9

运行@终端(稍后需要退出octave)

octave --persist myscript.m

或者在脚本结尾添加

waitfor(gcf)

以防止图形窗口关闭


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接