python - 保持 PyQt UI 对线程的响应

标签 python multithreading user-interface crash python-multithreading

我创建了一个相对复杂的 PyQt 程序并尝试实现线程,以便当程序遇到程序的一部分特别占用 CPU 时,GUI 将始终保持刷新和响应。可悲的是,我在线程方面遇到了一些困难。

我使用 Python 2.7 的原因我认为不相关。

无论如何,整个程序在一个类中运行并调用 PyQt 设计器 .ui 文件以显示实际的 GUI。当按下特定按钮时,为了切碎文件,它会调用该类中的一个函数,然后使用“线程”模块启动一个线程,是的,过时了,我知道。然后从这里调用的粉碎函数开始粉碎文件。在整个文件的粉碎过程中,实际的粉碎功能与 GUI 交互并向 GUI 添加位,以使用户随时了解正在发生的事情。

在执行该功能期间,GUI 会继续刷新,但是它确实变得有点滞后,我可以应付。但是,当该功能完成时,程序不会顺利继续并允许用户继续使用该程序,而是会抛出一个完全的嘶嘶声,只是停止工作并不得不关闭。

希望有人可以在这里帮助我。我将非常感谢尽可能多的细节,因为我一直在寻找一种方法来解决这个问题已经好几个星期了。

我正在使用 PyQt4。

最佳答案

这是pyqt5中线程的简单演示。 Qt 有它自己的线程类,效果很好。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSignal
import sys
import time

class TheBoss(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(TheBoss, self).__init__(parent)
        self.resize(300,200)
        self.VL = QtWidgets.QVBoxLayout(self)
        self.label = QtWidgets.QLabel()
        self.VL.addWidget(self.label)
        self.logger = Logger()
        self.logger.sec_signal.connect(self.label.setText)
        self.logger.start()

    def closeEvent(self,event):
        self.logger.terminate()

class Logger(QtCore.QThread):
    sec_signal = pyqtSignal(str)
    def __init__(self, parent=None):
        super(Logger, self).__init__(parent)
        self.current_time = 0
        self.go = True
    def run(self):
        #this is a special fxn that's called with the start() fxn
        while self.go:
            time.sleep(1)
            self.sec_signal.emit(str(self.current_time))
            self.current_time += 1

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setApplicationName("Thread Example")
    window = TheBoss()
    window.show()
    sys.exit(app.exec_())

关于python - 保持 PyQt UI 对线程的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39669556/

相关文章:

python - 将使用 JSON 数组创建的文件合并到单个文件中

python - 导入任意数量的 python 文件

python - 使用 python matplotlib 获得正值和负值的堆叠条形图

swift - 双重检查锁优化以在 Swift 中实现线程安全的延迟加载

c++ - GUI 开发 - 语言和构建器

python - 导入错误 : No module named comtypes in Python 3. 6

multithreading - Clojure - 使用代理会大大减慢执行速度

c++将udp数据流式传输到队列中?

java - 调用时 GUI 无法正确显示

python - 如何在 (Py)Qt 中以统一的纵横比进行缩放?