#python #charts #live
#python #Диаграммы #ЖИВЫЕ КОНЦЕРТЫ
Вопрос:
Я пытаюсь обновлять данные временных рядов каждую секунду, используя matplotlib.animation. Это будет использоваться для сбора данных из нескольких каналов. Однако, когда я использую анимацию в функции update(), время интервала не достигается (функции выполняются быстрее). Пожалуйста, помогите мне уточнить, как вызвать функцию обновления более правильным способом. Спасибо.
-
В большинстве примеров показан вызов update() извне функции. Однако в этом случае обновление многих каналов одновременно становится проблемой.
def update(self,start): x = np.random.normal(size=1) y = np.random.normal(size=1) deneme=self.graphicsView.plot(x,y,pen=None,symbol=' ') time.sleep(0.2) animation.FuncAnimation(self.graphicsView,ui.update(),interval =1000)
Комментарии:
1. Возможно, используйте time.sleep(1) вместо time.sleep(0.2)
2. К сожалению, time.sleep(x) на самом деле не предпочтителен в этом случае, потому что он также будет удерживать все другие процессы на удержании. Поэтому я попытался вызвать функцию обновления с помощью потоков. Таймер (в данном случае, вероятно, time.sleep (x) не испортит другие процессы). Однако я не мог запускать ее повторно (каждую секунду).
3. Вы могли бы попробовать модуль datetime, и каждый раз, когда происходит второе изменение, вы могли бы вызывать функцию.
Ответ №1:
Попробуйте это:
from datetime import time
second = datetime.now().strftime("%S")
while True:
do some things your code should do (no time.sleep in there)
second_before = datetime.now().strftime("%S")
if second != second_before:
second = second_before
call the function
Комментарии:
1. большое спасибо .. возможно ли использовать что-то другое вместо while True, я бы предположил, что это будет держать систему занятой?
2. Возможно, устанавливая переменную true после каждой итерации другого кода, а затем устанавливая ее false в конце этого кода
Ответ №2:
Я нашел один метод следующим образом. Кажется, что она отлично работает при использовании торговли.Таймер. Теперь я пытаюсь убедиться, что интервалы точны, проверяя длительность процесса.
def callfunc(self,val):
process_delta=time.time()-val
t=threading.Timer(1-process_delta,Ui_Dialog.update,args=(self,))
t.daemon=True
t.start()
def update(self):
process_start=time.time()
value1=[]
deltatime1=[]
deltatime1.append(time.time()-start)
y = np.random.normal(size=1)
deneme=self.graphicsView.plot(deltatime1,y,pen=None,symbol=' ')
QtCore.QCoreApplication.processEvents()
self.callfunc(process_start)
start=time.time()
ui.callfunc(0)