Python Pyplot图形不';在节目结束之前,不要打开

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

我正在用不同的模块和组件制作一个程序,用OpenCV执行文件/文件夹管理、数据采集、模型计算和在线采集反馈。该程序使用一个非常简单的命令行界面,其核心是一个菜单,用户可以在其中输入一个从1到X的数字来启动所描述的任务

[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编辑。正如您所建议的,这似乎是一个后端问题,好像从终端运行一样,它工作正常。