首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySide6 QThread仍然冻结主图形用户界面

PySide6 QThread仍然冻结主图形用户界面
EN

Stack Overflow用户
提问于 2022-06-23 23:16:04
回答 1查看 255关注 0票数 1

目前,我正试图在我的PySide6 GUI应用程序中实现一些线程功能。我遵循了一个教程来尝试入门(链接是这里),但我似乎无法让它开始工作。尽管该教程使用的是PyQt而不是PySide,但类和结构仍然相似,而且它似乎是在另一个线程上启动的。尽管如此,它还是冻结了主GUI,这在用户实际面临的情况下是不理想的。

下面是我的代码示例:

代码语言:javascript
复制
class Worker(QObject):
    finished = Signal(str)
    progress = Signal(int)

    def run(self, file):
        """Long-running task." that calls a separate class for computation""
        b = SeparateClass()
        b.doComputation()
        
        self.finished.emit()
class DataPlotting(QMainWindow):
    def __init__(self):
        self.thread = QThread()
        self.worker = Worker()
        self.report_builder = QPushButton('Call class that threads')
        self.report_builder.setEnabled(False)
        self.report_builder.clicked.connect(self.qthread_test)
    
    def qthread_test(self):
        file = 'some_file.txt'

        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.run(file))
        self.worker.finished.connect(self.thread.quit)
        self.worker.finished.connect(self.worker.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)
        self.thread.start()
        return

这确实完成了在Worker类中的工作,并提供了所需的结果,但它冻结了GUI。我不太清楚我做错了什么,因为有人建议用这种方法来防止冻结GUI,以便进行大量的计算。

有什么东西我直接丢了吗?还是我走错路了?欢迎任何帮助或指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-24 00:26:58

我假设您在__init__期间为QMainWindowQObject的子类进行适当的超类调用。

当您的代码执行self.thread.started.connect(self.worker.run(file))行时,它立即运行函数self.worker.run(file),并将该函数的结果(即None )指定为连接到thread.started信号的插槽。您可以将文件路径作为参数传递给worker实例,并让run方法在执行过程中从self获取路径。

例如,您可以尝试这样的方法:

代码语言:javascript
复制
class Worker(QObject):
    finished = Signal(str)
    progress = Signal(int)

    def run(self):
        """Long-running task." that calls a separate class for computation"""
        file = self.some_file
        b = SeparateClass()
        b.doComputation()
        
        self.finished.emit()
class DataPlotting(QMainWindow):
    def __init__(self):
        self.report_builder = QPushButton('Call class that threads')
        self.report_builder.setEnabled(False)
        self.report_builder.clicked.connect(self.qthread_test)
        self.threads = []
    
    def qthread_test(self):
        worker = Worker()
        thread = QThread()
        worker.some_file = 'some_file.txt'
        worker.moveToThread(thread)
        thread.started.connect(worker.run)
        worker.finished.connect(thread.quit)
        worker.finished.connect(worker.deleteLater)
        thread.finished.connect(thread.deleteLater)
        thread.start()
        self.threads.append(thread)
        return
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72737506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档