【问题标题】:PyQt5 terminate application from workerPyQt5 从工作人员终止应用程序
【发布时间】:2021-08-05 20:11:03
【问题描述】:

这是启动QApp -> Worker -> Something that causes sys.exit() inside the worker的应用程序示例

import sys
from PyQt5.QtCore import QRunnable, pyqtSlot, QThreadPool
from PyQt5.QtWidgets import QWidget, QApplication


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()
        self.threadpool = QThreadPool()
        worker = Worker()
        self.threadpool.start(worker)

    def init_ui(self):
        self.setFixedSize(600, 300)
        self.show()


class Worker(QRunnable):
    def __init__(self):
        super(Worker, self).__init__()

    @pyqtSlot()
    def run(self):
        print("Running worker...")
        run_application()


def run_window():
    app = QApplication([])
    ex = App()
    sys.exit(app.exec_())


def run_application():
    print('Running application...')
    sys.exit(10)

if __name__ == '__main__':
    run_window()

我运行它时有几种情况:
退出代码 0
退出代码 10
窗户一直挂着

感觉就像一场赛车。
那么在sys.exit()或worker内部异常的情况下终止窗口的正确方法是什么?

编辑:忘了说我需要返回退出代码并跟踪它,因为我通过subprocess/Popen 运行窗口。

【问题讨论】:

    标签: python python-3.x pyqt5


    【解决方案1】:

    如果您想关闭窗口,一个可能的解决方案是使用QCoreApplication::quit() 终止事件循环:

    def run_application():
        print("Running application...")
        QCoreApplication.quit()
    

    QCoreApplication::exit():

    def run_application():
        print("Running application...")
        QCoreApplication.exit(10)
    

    【讨论】:

    • 对不起,忘了说我需要返回退出代码并跟踪它,因为我通过子进程/Popen 运行窗口。
    • 似乎QCoreApplication.exit(10) 有效。非常感谢你。顺便说一句,有一种方法是在 try-catch 中调用应用程序以捕获 sys.exit,然后将 worker.signal 扔到窗口中,然后再次执行 sys.exit。
    猜你喜欢
    • 2016-08-01
    • 2023-03-25
    • 2023-03-21
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多