Ниже приведено небольшое приложение с двумя кнопками.
Желаемый результат Когда я нажимаю кнопку запуска, я хочу запустить генератор случайных чисел, который будет генерировать новое целое число каждую секунду, пока я не нажму кнопку остановки.
Я продолжаю получать ошибки о моих параметрах потока во время метода инициализации 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