Python Tkinter和Matplotlib-RuntimeError

时间:2018-08-17 07:46:44

标签: python multithreading matplotlib tkinter python-multithreading

好的,所以我写了这段代码...

#!/usr/bin/env

import sys
import time
import subprocess
from Tkinter import *
import numpy
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib
import matplotlib.pyplot as plt
import threading

CDatei = subprocess.Popen("/home/pi/meinc++/Spi")
print("Hallo")

i = 0
x = 0


def GetValue():
        with open("/home/pi/meinc++/BeispielDatei.txt","r") as Datei:
                for line in Datei:
                    time.sleep(0.01)
                    return line

def WithoutNull(input):
    ReturnValue = input
    while ReturnValue is None:
            ReturnValue = GetValue()
    return ReturnValue

def UebergabeWert():
    while x == 0:
        WholeString = WithoutNull(GetValue())
        StringVar, DatumVar = WholeString.strip().split(' - ')
        IntStringVar = [int(v) for v in StringVar.split()]
        return IntStringVar, DatumVar


def MinutenWert():
    Maximum = 0
    Minimum = 0
    i = 0
    LaengeArray = 0
    Multiplikator = 10000
    ArrayValue = [-999999]*Multiplikator
    AlteZeit = time.time()

    while 1:
        CompleteValue, Trash = UebergabeWert()
        ArrayValue[i] = CompleteValue[0]
        i = i + 1

        ArrayFilter = filter(lambda c: c != -999999,ArrayValue)
        ArraySumme = numpy.sum(ArrayFilter)
        LaengeArray = len(ArrayFilter)
        Mittelwert = ArraySumme/LaengeArray

        ArraySortierung = sorted(ArrayFilter)
        Maximum = ArraySortierung[LaengeArray-1]
        Minimum = ArraySortierung[0]
        NeueZeit = time.time()

        if NeueZeit-AlteZeit >= 60:
            AlteZeit = time.time()
            ArrayValue[i:Multiplikator] = [-999999]*(Multiplikator-i)
            i = 0

        yield Mittelwert
        yield Maximum
        yield Minimum
        yield LaengeArray
        yield ArrayFilter



def UebergabeTkinter():
    while 1:

        Mittelwert = next(MinutenWertYield)
        Maximum = next(MinutenWertYield)
        Minimum = next(MinutenWertYield)
        LaengeArray = next(MinutenWertYield)
        ArrayFilter = next(MinutenWertYield)

        CompleteValue, DatumVar = UebergabeWert()
        Variable1.set(CompleteValue[0])
        Variable2.set(CompleteValue[1])
        Variable3.set(CompleteValue[2])
        Variable4.set(CompleteValue[3])
        VariableMittelwert.set(Mittelwert)
        VariableMaximum.set(Maximum)
        VariableMinimum.set(Minimum)
        t = threading.Thread(target = Grafik)
        t.start()

        root.update()

def Grafik():
    GrafikAnfang = time.time()
    Array = 0
    ArrayGrafik = [0]*20
    GrafikEnde = 1
    while 1:
        CompleteValue, DatumVar = UebergabeWert()
        ArrayGrafik[Array] = CompleteValue[0]
        LaengeArrayGrafik = len(ArrayGrafik)


        fig = Figure(figsize = (3, 3))
        axis = fig.add_subplot(111)
        axis.legend()
        axis.grid()
        canvas = FigureCanvasTkAgg(fig, master = root)
        canvas.get_tk_widget().grid(row=10,column=0,rowspan=2,columnspan=2)
        LinienBreite = numpy.linspace(1,LaengeArrayGrafik,LaengeArrayGrafik)
        axis.plot(LinienBreite,ArrayGrafik,'b-')
        axis.set_xticks(LinienBreite)
        DatumArray = [DatumVar]
        axis.set_xticklabels(DatumArray)
        canvas.draw()
        fig.clear()
        print Array
        if GrafikEnde-GrafikAnfang < 600:

            Array = Array + 1   
            GrafikEnde = time.time()

        if GrafikEnde-GrafikAnfang >= 600:
            del ArrayGrafik[0]




def Exit():
    root.destroy()
    return


try:

    MinutenWertYield = MinutenWert()

    root = Tk()

    Leiste = Menu(root)
    root.config(menu = Leiste)

    DateiMenu = Menu(Leiste)
    Leiste.add_cascade(label = "datei", menu = DateiMenu)
    DateiMenu.add_command(label = "Exit", command = Exit)

    EditMenu = Menu(Leiste)
    Leiste.add_cascade(label = "edit", menu = EditMenu)


    Variable1 = IntVar()
    Variable2 = IntVar()
    Variable3 = IntVar()
    Variable4 = IntVar()
    VariableMittelwert = IntVar()
    VariableMaximum = IntVar()
    VariableMinimum = IntVar()

    Ausgang = 0
    for column in range(0,8,2):
        String1 = "Ausgang "
        String1 += `Ausgang`
        Ausgang = Ausgang + 1
        Label(text = String1).grid(row=0,column=column)

    Ausgang = 0
    for column in range(0,8,2):
        String1 = "Der Wert von "
        String2 = " ist: "
        String1 += `Ausgang`
        Ausgang = Ausgang + 1
        String3 = String1+String2
        Label(text = String3).grid(row=2,column=column)

    Label(text = "Der Mittelwert ist: ").grid(row=4,column=0)
    Label(text = "Das Maximum ist: ").grid(row=5,column=0)
    Label(text = "Das Mimimum ist: ").grid(row=6,column=0)

    Label1 = Label(root, textvariable = Variable1)
    Label1.grid(row = 2, column = 1)

    Label2 = Label(root, textvariable = Variable2)
    Label2.grid(row = 2, column = 3)

    Label3 = Label(root, textvariable = Variable3)
    Label3.grid(row = 2, column = 5)

    Label4 = Label(root, textvariable = Variable4)
    Label4.grid(row = 2, column = 7)

    LabelMittelwert = Label(root, textvariable = VariableMittelwert)
    LabelMittelwert.grid(row = 4, column = 1)

    LabelMaximum = Label(root, textvariable = VariableMaximum)
    LabelMaximum.grid(row = 5, column = 1)

    LabelMinimum = Label(root, textvariable = VariableMinimum)
    LabelMinimum.grid(row = 6, column = 1)

    UebergabeTkinter()


    print "Hallo"
    root.mainloop()



except KeyboardInterrupt:
    CDatei.kill()
    root.quit()
    root.destroy()

当我运行它时,它说“ RuntimeError:主线程不在主循环中”。

代码的简短说明:这是一个从文本文件中读取传感器数据的代码-  GetValue()。

如果数据为Null,它将再次读出-WithoutNull()。

然后将数据拆分为数据和时间戳(因为其格式为val1,val2,val3,val4,time)-UebergabeWert。

然后将测量数据的最大值,最小值和平均值-MinutenWert()

此后,将值设置为标签,并进入Tkinter-UebergabeTkinter()

Tkinter版本主要在Try中:

我想在那里做的是为Tkinter实现一个图形,但是由于值的快速变化,它变得非常慢,所以我决定将图形构建放在线程中并与Tkinter并行运行。不幸的是,它似乎不起作用,我也不知道为什么

有什么建议吗?

0 个答案:

没有答案