QTimer с лямбда-функцией Python работает с предыдущими даннымиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 QTimer с лямбда-функцией Python работает с предыдущими данными

Сообщение Anonymous »

У меня есть проект с графическим интерфейсом, который использует PySide2 с Python 3.8 и выполняет некоторые фоновые задачи в QThread. Внутри этого QThread у меня есть объект-член QTimer, который должен периодически запускать функцию, каждый раз передавая ей разные данные. Я не использую статическую функцию QTimer.singleShot, потому что мне нужно остановить/сбросить таймер, если это необходимо для какого-то конкретного сценария.
Как только целевая функция запускается успешно, она вызывает еще одна функция, которая отвечает за передачу новых данных таймеру и их повторный запуск. Функция связана с timer.timeout.connect(lambda: function_name(data)) и перед передачей ей новых данных я останавливаю и отключаю предыдущий слот и останавливаю таймер, если таймер был активен. При втором запуске таймера, когда я передаю ему новые данные, целевая функция каким-то образом все еще работает со старыми данными.
Следующий код представляет собой проблему, воспроизведенную изолированно:
Следующий код представляет собой проблему, воспроизведенную изолированно:
р>

from PySide2.QtCore import QTimer
from PySide2 import QtWidgets
import time
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
FORMAT = "[%(asctime)s] %(funcName)s: %(message)s"
logging.basicConfig(format=FORMAT)

class QtTest(QtWidgets.QWidget):

def __init__(self):
super(QtTest, self).__init__()
logger.info("Class initialized")
self.timer = QTimer()
self.timer.setSingleShot(True)
self.timer.setInterval(1000)
self.timer.timeout.connect(lambda: self.target_func(0))
self.timer.start()

def target_func(self, data):
logger.info("Target function called with data: {}".format(data))
time.sleep(1.5)
if self.timer.isActive():
logger.info("Timer reset")
self.timer.stop()
self.timer.timeout.disconnect()

self.func_done(data)

def func_done(self, data):
logger.info("Tasks completed for data: {}".format(data))

if data == 0:
logger.info("Setting next timer with data 1")
#I have tried the following as well
#self.timer.timeout.disconnect()
#self.timer.stop()

self.timer.setInterval(1000)
self.timer.timeout.connect(lambda: self.target_func(1))
self.timer.start()

def init_app():
app = QtWidgets.QApplication([])

gui = QtTest()
gui.show()
app.exec_()

if __name__ == "__main__":
print("QT app running")
init_app()
test = QtTest()

Это результат тестового кода:
QT app running
[2024-07-30 22:44:53,204] __init__: Class initialized
[2024-07-30 22:44:54,255] target_func: Target function called with data: 0
[2024-07-30 22:44:55,757] func_done: Tasks completed for data: 0
[2024-07-30 22:44:55,757] func_done: Setting next timer with data 1
[2024-07-30 22:44:56,808] target_func: Target function called with data: 0
[2024-07-30 22:44:58,309] func_done: Tasks completed for data: 0
[2024-07-30 22:44:58,309] func_done: Setting next timer with data 1
[2024-07-30 22:44:58,309] target_func: Target function called with data: 1
[2024-07-30 22:44:59,810] target_func: Timer reset
[2024-07-30 22:44:59,811] func_done: Tasks completed for data: 1

Чего я ожидаю
[2024-07-30 22:44:55,757] func_done: Setting next timer with data 1
[2024-07-30 22:44:56,808] target_func: Target function called with data: 0

следующее:
[2024-07-30 22:44:55,757] func_done: Setting next timer with data 1
[2024-07-30 22:44:56,808] target_func: Target function called with data: 1


Подробнее здесь: https://stackoverflow.com/questions/788 ... vious-data
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»