解决Matplotlib中Event loop already running弹窗报错问题
问题解决:Matplotlib事件循环冲突报错及窗口功能实现
报错原因
第一次执行plt.show()启动了Matplotlib的GUI事件循环,点击按钮后再次调用plt.show()会尝试重复启动事件循环,触发QCoreApplication::exec: The event loop is already running.报错。另外Matplotlib绘图操作必须在主线程执行,因此线程方案无法解决该问题。
修正后的代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Button from PIL import Image from mpl_point_clicker import clicker def link(val): # 关闭已存在的目标窗口(避免重复创建) if plt.fignum_exists(2): plt.close(2) # 创建新窗口与绘图区域 fig1 = plt.figure(2, figsize=(8, 6)) axes1 = fig1.subplots() # 创建空白图片并转换为Matplotlib可识别的数组格式 width = 400 height = 300 img = Image.new(mode="RGB", size=(width, height), color=(255, 255, 255)) img_array = np.array(img) axes1.imshow(img_array) # 将图片渲染到绘图区域 # 初始化点击器模块 klicker = clicker(axes1, ["1", "2", "3", "4"], markers=["x", "o", "*", "+"], colors=['red','blue','yellow','green']) # 刷新窗口显示 fig1.canvas.draw_idle() if __name__ == "__main__": fig = plt.figure(figsize=(8, 5)) ax = fig.subplots() plt.subplots_adjust(left=0.35, bottom=0.1) # 创建启动按钮 ax_start_button = plt.axes([0.5, 0.01, 0.3, 0.05]) start_button = Button(ax_start_button, 'Начать работу', color='white', hovercolor='grey') start_button.on_clicked(link) # 启动主事件循环(仅调用一次) plt.show()
关键修改点
- 移除
link函数内的plt.show()调用,依托主窗口已启动的事件循环管理新窗口 - 将PIL创建的图片转换为numpy数组,通过
axes1.imshow()渲染到绘图区域(原代码未完成图片显示逻辑) - 添加窗口存在性检查,重复点击按钮时会先关闭旧窗口再创建新窗口,避免窗口堆积
- 调用
fig1.canvas.draw_idle()确保新窗口内容及时刷新显示
内容的提问来源于stack exchange,提问作者Максим Голубятников
相关产品推荐
相关产品推荐

