Правильная настройка потоков python с помощью tkinter - PullRequest
0 голосов
/ 03 мая 2020

Ниже приведено небольшое приложение с двумя кнопками.

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

Я продолжаю получать ошибки о моих параметрах потока во время метода инициализации DataGenerator. Я пытался сделать несколько вещей, но ничто не улучшило ситуацию. Вещи, которые я пробовал:

super().__init__(...,verbose=None) ошибка отладки в том, что многословно в неожиданном ключевом слове?
super().__init__(...) группа должна быть равна ни одной ошибке (показано ниже)
super(DataGenerator,self).__init__(...) без изменений ошибка
Даже если я явно установлю группу в None:
self.plotThread = thread.Thread(target=DataGenerator, group=None, args=(0,100,1,self.plotting,self.plotBuffer))

На данный момент, я думаю, я не понимаю некоторую базовую c концепцию для наследования класса потребителя потока .. . Как можно исправить приведенный ниже код для достижения желаемого результата?

import threading as thread
import tkinter as tk
from tkinter import ttk
import time

from random import seed
from random import random

import numpy as np

np.random.seed(1)

import queue


root = tk.Tk()
root.title('Test')


class DataGenerator(thread.Thread):

    def __init__(self,group=None,target=None,name=None,args=(),kwargs=None,verbose=None):
        super().__init__(group=group,target=target,name=name)

        self.args = {
            'minValue' : args[0],
            'maxValue' : args[1],
            'seconds'  : args[2],
            'run'      : args[3],
            'buffer'   : args[4]
        }
        self.kwargs = kwargs

        self.dataBuffer = generateRandomData(self.args.minValue,self.args.maxValue,100) #Let's just generate 100 values at a time and call use as necessary, refill when needed.
        self.index = 0


    def run(self):    

        while self.args.run.isSet():
            if self.index > len(self.dataBuffer):
                self.dataBuffer = self.generateRandomData(100)
                self.index = 0

            self.args.buffer.put(self.dataBuffer[self.index])
            print(self.dataBuffer[self.index])

            self.index = self.index + 1
            time.sleep(self.seconds*1000)


    def generateRandomData(self,cnt):
        x = np.random.uniform(self.minValue,self.maxvalue,size=(cnt,))
        return x


class App:
    def __init__(self,root):

        self.plotBuffer = queue.Queue()
        self.plotting   = thread.Event()


        self.mainFrame  = ttk.Frame(root)

        self.titleFrame = ttk.Frame(self.mainFrame, padding="5 5 5 5")
        self.titleFrame.grid(row=0,column=0)

        self.titleLabel = ttk.Label(self.titleFrame,text="Real Time MVA")
        self.titleLabel.pack()


        self.commandFrame = ttk.Frame(self.mainFrame)
        self.commandFrame.grid(row=1,column=0)

        self.buttons = [
                ttk.Button(self.commandFrame,text='start',command=self.startPlotter),
                ttk.Button(self.commandFrame,text='stop',command=self.stopPlotter),
        ]

        for x in range(0,len(self.buttons)):
            self.buttons[x].grid(row=0,column=x)

        self.mainFrame.pack()

    def startPlotter(self):

        if self.plotting.isSet():
            print("plotting started foo")
        else:
            self.plotThread = thread.Thread(target=DataGenerator, group=None, args=(0,100,1,self.plotting,self.plotBuffer))
            self.plotThread.start()
            self.plotting.set()


        #Start thread to generate 1 random data point per second.
        #Let's use a class called NumberGenerator
        return


    def stopPlotter(self):
        if not self.plotting.isSet():
            print("not plotting")
        else:
            self.plotting.clear()
            self.plotThread.join()
        return

thisapp = App(root)
root.mainloop()

Исключение в потоке Thread-14: Traceback (последний последний вызов):
Файл "D: \ Programs \ Anaconda \ lib \ threading.py", строка 917, в _bootstrap_inner self.run () Файл "D: \ Programs \ Anaconda \ lib \ threading.py", строка 865, в запуске self._target (* self._args, ** self._kwargs) Файл "", строка 23, в init super (). init (группа = группа, цель = цель, имя = имя ) Файл "D: \ Programs \ Anaconda \ lib \ threading.py", строка 781, в init группа утверждений - Нет, на данный момент "аргумент группы должен быть Нет" AssertionError: аргумент группы сейчас должно быть None

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