You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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,提问作者Максим Голубятников

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:33:25