У меня есть проект с графическим интерфейсом, который использует 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
QTimer с лямбда-функцией Python работает с предыдущими данными ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Оцените точки в соответствии с предыдущими точками, используя фильтр Калмана
Anonymous » » в форуме C++ - 0 Ответы
- 34 Просмотры
-
Последнее сообщение Anonymous
-