У меня есть графический интерфейс, написанный на wxPython (дополнительную информацию можно найти в другом вопросе). В графическом интерфейсе есть индикаторы (диаграммы, текст и т. д.) И элементы управления (кнопки, переключатели и т. д.). Время от времени я получаю новые данные для построения. В зависимости от размера этого набора данных он может создание и построение графика займет до 20. В это время элементы управления графического интерфейса не реагируют, поскольку поток графического интерфейса занят построением графиков.
Как сделать так, чтобы элементы управления графическим интерфейсом всегда реагировали независимо от того, какой размер набора данных я рисую?
Вот решение этой проблемы. Вкратце,
См. Код ниже.
frame = wx.Frame.__init__(self, None, wx.ID_ANY, "", size = (1200,800))#, style= wx.SYSTEM_MENU | wx.CAPTION)
self.panel = wx.Panel(self, wx.ID_ANY, style=wx.BORDER_THEME, size = (1200,800))
#bmp1 = wx.Bitmap.FromRGBA(100, 100, red=255, alpha=0)
self.bitmap1 = wx.StaticBitmap(self.panel)
self.bitmap2 = wx.StaticBitmap(self.panel)
sizer = wx.GridBagSizer(hgap = 0, vgap = 0)#(13, 11)
sizer.Add(self.bitmap1, pos=(0,0), flag = wx.ALL)#, flag=wx.TOP|wx.RIGHT) FIXIT so the sidebar is closer to the graph
sizer.Add(self.bitmap2, pos=(1,0), flag = wx.ALL)#,flag=wx.TOP|wx.RIGHT)
def buf2wx (buf):
import PIL
image = PIL.Image.open(buf)
width, height = image.size
return wx.Bitmap.FromBuffer(width, height, image.tobytes())
#access the buffer which was created in a different thread
#or use socket to retrieve it from a remote server or
#whatever you might want to do.
buf = get_buf_from_somewhere()
self.bitmap1.SetBitmap(buf2wx(buf))
self.bitmap2.SetBitmap(buf2wx(buf))
self.panel.SetSizer(sizer)
self.Layout()
self.panel.Layout()
self.Fit()
Часть кода, выполняемая в другом потоке или даже на удаленном сервере. Этот код сгенерирует график и сохранит его в файле, который может быть прочитан графическим интерфейсом пользователя или перенесен в другое место.
def plot():
from matplotlib import pyplot as plt
import io
from numpy import random
plt.figure()
b = random.rand(100,)
plt.subplot(311)
plt.plot(b)
b = random.rand(100,)
plt.subplot(312)
plt.plot(b)
b = random.rand(100,)
plt.subplot(313)
plt.plot(b)
plt.title("test")
buf = io.BytesIO()
plt.savefig(buf, format='jpg')
buf.seek(0)
return buf