@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())
  • Вопрос задан
  • 312 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Асинхронное программирование
Седой и строгий
Во-первых, мало поставить async перед функцией, чтобы она стала асинхронной. Не знаю, что делает mouse.mouseManagement(), но если она асинхронная, то перед ней должен быть await, если не блокирующая, то async не имеет смысла, а если блокирующая, то она поставит колом цикл событий. Во-вторых, https://qna.habr.com/q/623104
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 400 000 до 700 000 ₽
Idea Platform Москва
от 120 000 до 200 000 ₽
Leningrad Media Москва
от 150 000 до 170 000 ₽
16 апр. 2024, в 10:47
80000 руб./за проект
16 апр. 2024, в 10:41
1000 руб./за проект
16 апр. 2024, в 10:39
2000 руб./за проект