可以在GUI线程外部调用哪些matplotlib方法?

时间:2018-01-24 09:05:59

标签: python multithreading matplotlib wxpython wxpython-phoenix

我已经读过matplotlib通常不是线程安全的。因此,让我们假设正确的同步。我在matplotlib-users讨论中也遇到了以下声明:

  

所有GUI内容必须发生在主线程上(如果你做线程),但是   对于某些后端draw_idle()可能是线程安全的。

(感谢@tacaswell)

但是考虑了哪些方法" GUI的东西"哪个后端对draw_idle()的线程安全?

考虑一个简单的matplotlib + wxpython phoenix示例:

#!/usr/bin/env python3

from threading import Thread

import numpy as np
import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas
from matplotlib.figure import Figure


app = wx.App()
frame = wx.Frame(None)
panel = wx.Panel(frame)

figure = Figure()
canvas = Canvas(panel, wx.ID_ANY, figure)

def slow():
    figure.gca().imshow(np.random.randn(5_000, 5_000))
    canvas.draw_idle()

button = wx.Button(panel, label='Go')
button.Bind(wx.EVT_BUTTON, lambda event: Thread(target=slow).start())

sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(canvas, 1, wx.EXPAND)
sizer.Add(button, 0, wx.ALIGN_RIGHT)
panel.SetSizer(sizer)

frame.Show()
app.MainLoop()

我从GUI线程外部调用imshow()draw_idle(),它似乎工作正常。

如果我在整个实际应用程序中重复这种方法,我会遇到麻烦吗?是否有必要将这些方法调用中的任何一个移入GUI线程?如果不是,draw_idle()在wxpython下实际上是线程安全还是需要同步?

0 个答案:

没有答案