@AnniHayes

Как вызвать асинхронную функцию по нажатию кнопки pyQT?

При попытке вызвать асинхронно функции mouse.mouseMenegement() и self.showCam() из функции start() возникает ошибка вызова корутины. Вставить асинхронный вызов функции start() по нажатию кнопки так же не получается.
Если идти с самого верха асинхронным вызовом, программа ложиться на моменте инициализации.
class Ui_MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(718, 558)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.loadProgressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.loadProgressBar.setGeometry(QtCore.QRect(160, 420, 371, 21))
        self.loadProgressBar.setProperty("value", 0)
        self.loadProgressBar.setObjectName("loadProgressBar")
        self.startButton = QtWidgets.QPushButton(self.centralwidget)
        self.startButton.setGeometry(QtCore.QRect(490, 460, 171, 21))
        self.startButton.setObjectName("startButton")
        self.startButton.clicked.connect(self.start)
        '''self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(20, 20, 671, 381))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.graphicsView = QtWidgets.QGraphicsView(self.frame)
        self.graphicsView.setGeometry(QtCore.QRect(0, 0, 671, 411))
        self.graphicsView.setObjectName("graphicsView")'''
        self.lbl = QtWidgets.QLabel(self)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Главная"))
        self.startButton.setText(_translate("MainWindow", "Запуск программы управления"))

    async def start(self):
        print('нажатие прошло')
        mouse.mouseMenegement()
        self.showCam()

    def showCam(self):
        print('вызов картинки')
        name=f'{mouse.indexImg}.jpg'
        print(name)
        self.pix = QtGui.QPixmap(name)
        print(45)
        self.lbl.setPixmap(self.pix)

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = Ui_MainWindow()
    application.show()
    sys.exit(app.exec())
  • Вопрос задан
  • 323 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Асинхронное программирование
Седой и строгий
Во-первых, мало поставить async перед функцией, чтобы она стала асинхронной. Не знаю, что делает mouse.mouseManagement(), но если она асинхронная, то перед ней должен быть await, если не блокирующая, то async не имеет смысла, а если блокирующая, то она поставит колом цикл событий. Во-вторых, https://qna.habr.com/q/623104
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы