Использование потоков для отображения данных другого класса на фоне интерфейса командной строки (CLI) - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь отобразить переменное напряжение аккумулятора на заднем плане, пока код командной строки продолжает работать во время выполнения программы. Сюжет начинается, когда пользователь нажимает график, и заканчивается, когда нажимается выход.

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) я разрешаю пользователю закрыть фигуру, нажав кнопку отмены. но когда я попробовал снова, выскакивают ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...