Я пытаюсь отобразить переменное напряжение аккумулятора на заднем плане, пока код командной строки продолжает работать во время выполнения программы.
Сюжет начинается, когда пользователь нажимает график, и заканчивается, когда нажимается выход.
from threading import Thread
import cmd
import matplotlib.pyplot as plt
import sys
from drawnow import *
plt.ion()
count=0
class myThreadPlot (Thread):
def __init__(self):
Thread.__init__(self)
self.state = test()
self.battVoltagePlot= []
self.flag = True
def run(self):
global count
while self.flag:
self.battVoltagePlot.append(self.state.batteryVoltage)
drawnow(self.plot_var,stop_on_close=True)
count+=1
if count>50: self.battVoltagePlot.pop(0) # to plot 50 values at
a time
plt.pause(1e-4)
plt.close()
def plot_var(self):
x =min(self.battVoltagePlot)
y = max(self.battVoltagePlot)
if x<0: plt.ylim(2*x,2*y)
else: plt.ylim(x/2,2*y)
plt.grid(True)
plt.ylabel('V')
plt.plot(self.battVoltagePlot, 'ro-', label='V')
class test(object):
def __init__(self):
self.batteryVoltage =30
class CLI(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = ">> "
self.intro = ("Welcome\n Press help to see the options.\n press
plot to plot battery voltage and press exit to exit ")
def do_plot(self,arg):
"calling myThreadPLot to plot a variable 'batteryVoltage' from
class 'test' in the background"
self.my = myThreadPlot()
self.my.start()
def do_exit(self, arg):
'''Exit this application'''
print("Bye")
self.my.flag = False
return True
if __name__ == '__main__':
CLI().cmdloop()
Я получаю следующую ошибку, когда нажимаю выход.
Exception RuntimeError: RuntimeError('main thread is not in main loop',) in
<bound method PhotoImage.__del__ of <Tkinter.PhotoImage instance at
0x7f38f5412320>> ignored
Tcl_AsyncDelete: async handler deleted by the wrong thread
Любое предложение о том, как я могу использовать, может предотвратить это. Другая проблема заключается в том, что
в drawnow (self.plot_var, stop_on_close = True) я разрешаю пользователю закрыть фигуру, нажав кнопку отмены. но когда я попробовал снова, выскакивают ошибки.