まず私の英語でごめんなさい。
で測定を行いますAgilent
。簡単に実行できるように、いくつかの高レベル関数を作成しました。そして今、測定の進行中に結果をプロットしたいと思います。と を使用wxPython
しmatplotlib
ます。
私のコード(簡略化):
class MyInstr():
def __measurement(self, start, step, stop, plt, result):
if plt:
app = wx.PySimpleApp()
app.f = MeasGraph(result)
app.f.Show()
def st(app):
app.MainLoop()
th = threading.Thread(target=st, args=(app,))
th.start()
for ...
get_data():
...
result.append(new_data)
app.f.redraw_plot(result)
def bsweep(self, start, step, stop, plt=True):
result = {'info': {}, 'prim': [], 'sec': [], 'swp:' []}
self.__measurement(start, step, stop, plt, result)
class MeasGraph(wx.Frame):
def __init__(self, result):
self.data = result
wx.Frame.__init__(self, None, -1, 'Measurement Result')
self.create_main_panel()
def create_main_panel(self):
self.panel = wx.Panel(self)
self.init_plot()
self.canvas = FigureCanvas(self.panel, -1, self.fig)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.vbox.Add(self.canvas, 1, flag=wx.LEFT | wx.TOP | wx.GROW)
self.panel.SetSizer(self.vbox)
self.vbox.Fit(self)
def init_plot(self):
self.fig = Figure()
self.axes = self.fig.add_subplot(111)
self.primary = self.axes.plot([0], [0])[0]
def redraw_plot(self, result):
self.data = result
self.primary.set_xdata(self.data['swp'])
self.primary.set_ydata(self.data['prim'])
self.canvas.draw()
def main():
instr = MyInstr()
instr.bsweep(0, -0.1, -5, plt=True)
プロット付きのウィンドウを除いて、正常に動作します。ビジーで、クリックするとアプリがクラッシュします。
ありがとうございました。
UPD 1:わかりましたが、測定を数回実行できるようにしたいのですが、以前のすべてのプロットと現在のプロットを同時に表示したいと考えています。例えば:
instr.bsweep(0, -0.1, -5, plt=True) # measurement (up to 5 Volts) and plot
そして今、この測定を 10 ボルトまで行う必要があることがわかりました。したがって:
instr.bsweep(0, -0.1, -10, plt=True)
そして、あるプロットを別のプロットと比較したいと思います。
しかし、前のプロット (メイン スレッドにある場合) がシェルまたはアプリをブロックするため、実行できません。