Python Pyplot图形不';在节目结束之前,不要打开
我正在用不同的模块和组件制作一个程序,用OpenCV执行文件/文件夹管理、数据采集、模型计算和在线采集反馈。该程序使用一个非常简单的命令行界面,其核心是一个菜单,用户可以在其中输入一个从1到X的数字来启动所描述的任务Python Pyplot图形不';在节目结束之前,不要打开,python,matplotlib,spyder,Python,Matplotlib,Spyder,我正在用不同的模块和组件制作一个程序,用OpenCV执行文件/文件夹管理、数据采集、模型计算和在线采集反馈。该程序使用一个非常简单的命令行界面,其核心是一个菜单,用户可以在其中输入一个从1到X的数字来启动所描述的任务 [IN] Available options: | 1 - Do something | 2 - Run acquisition | 3 - Compute model | 4 - Start something else | 5
[IN] Available options:
| 1 - Do something
| 2 - Run acquisition
| 3 - Compute model
| 4 - Start something else
| 5 - Open cv2 windows
| 6 - Quit
当用户输入3
以matplotlib
绘图结束时调用的计算模型函数,使用户可以评估模型的正确性
我的问题是,绘图仅在程序结束时显示,即在用户输入退出6
之后。绘图之前不会显示,即使我添加plt.show()
或f.show()
带或不带block=False
有没有办法让matplotlib
尽快显示图形,或者甚至等到matplotlib
显示图形,而不必在单独的线程/进程中执行此绘图/模型计算
可复制示例:
from matplotlib import pyplot as plt
def input_menu(options, retries=3):
print ('Available options:')
for key, value in options.items():
print (f" {key} - {value}")
selection = int(input('[IN] What do you want to do ? '))
return selection
while True:
selection = input_menu(options={1: 'Plot',
2: 'Quit'})
if selection == 1:
f, ax = plt.subplots(1, 1, figsize=(10, 10))
ax.plot([1, 2, 3])
elif selection == 2:
break
else:
break
按1;菜单将再次提示,并显示绘图。直到按下2且程序完成,才会显示绘图。
我正在使用spyder作为IDE。在spyder中,选择后端PyQT5。
正如您所建议的,我还尝试了另一个后端,即在终端中使用了
python test.py
。这一次,按下1后,绘图确实按预期显示。无需等待程序完成。有些后端需要添加plt.ion()
以打开交互功能,有些后端需要将plt.wait(0.01)
插入更新循环。取决于环境,什么有效,什么无效。@T先生我已经用过plt.ion()一次了,在本例中有点不同。也没有更新循环。在按下“3”键调用的函数“compute model”的末尾,将生成一个绘图。没有向该绘图添加任何更新,我只想让它显示。很难理解为什么函数3不会显示生成的图形,特别是因为任何SO用户都无法再现此问题。如果用简单的ax.plot([1,3,2])
替换绘图例程,问题是否仍然存在?如果是这样的话,你能把你的问题归结为输入例程和这个简单的绘图,并将其作为MCVE提供吗?现在看来,你的问题似乎信息太多而不够。另一件值得尝试的事情是测试问题是否与后端相关。@T先生用MCVE编辑。正如您所建议的,这似乎是一个后端问题,好像从终端运行一样。一些后端需要添加plt.ion()
以打开交互功能,一些后端需要将plt.wait(0.01)
插入更新循环。取决于环境,什么有效,什么无效。@T先生我已经用过plt.ion()一次了,在本例中有点不同。也没有更新循环。在按下“3”键调用的函数“compute model”的末尾,将生成一个绘图。没有向该绘图添加任何更新,我只想让它显示。很难理解为什么函数3不会显示生成的图形,特别是因为任何SO用户都无法再现此问题。如果用简单的ax.plot([1,3,2])
替换绘图例程,问题是否仍然存在?如果是这样的话,你能把你的问题归结为输入例程和这个简单的绘图,并将其作为MCVE提供吗?现在看来,你的问题似乎信息太多而不够。另一件值得尝试的事情是测试问题是否与后端相关。@T先生用MCVE编辑。正如您所建议的,这似乎是一个后端问题,好像从终端运行一样,它工作正常。