首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用QTextBrowser改变QThread

用QTextBrowser改变QThread
EN

Stack Overflow用户
提问于 2020-11-01 18:33:13
回答 2查看 360关注 0票数 0

我试图使用QTextBrowser显示一些数据。然而,它冻结了,因为我没有正确地使用线程。我搜索了一些关于堆栈溢出的QThread问题,但不知道为什么我的代码不能工作.

我想打印五次“你好”,每次都有1秒的睡眠。

我还想获得QLineEdit的输入,以设置time.sleep(冷却时间),但是在解决了Q线程问题之后,我可以这样做。

我搜索并试图实现到我的代码的解决方案是;

PyQt5:在运行时更新标签

PyQt5:更新标签?

可能,我使用了错误的实现方法。但是我是个新手,请帮我

代码语言:javascript
复制
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'denn.ui'
#
# Created by: PyQt5 UI code generator 5.12.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
from time import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setStyleSheet("")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.lineEdit.setFont(font)
        self.lineEdit.setAlignment(QtCore.Qt.AlignCenter)
        self.lineEdit.setObjectName("lineEdit")
        self.verticalLayout.addWidget(self.lineEdit)
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.textBrowser.setFont(font)
        self.textBrowser.setObjectName("textBrowser")
        self.verticalLayout.addWidget(self.textBrowser)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("QPushButton {\n"
"    color: white;\n"
"    border: 2px solid #46963f;\n"
"    border-radius: 20px;\n"
"    border-style: outset;\n"
"    /*background: qradialgradient(\n"
"        cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,\n"
"        radius: 1.35, stop: 0 #fff, stop: 1 #46963f\n"
"        );*/\n"
"    background:#46963f;\n"
"    padding: 5px;\n"
"    }\n"
"\n"
"QPushButton:hover {\n"
"    border: 2px solid #07121b;\n"
"    /*background: qradialgradient(\n"
"        cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,\n"
"        radius: 1.35, stop: 0 #fff, stop: 1 #1b486d\n"
"        );*/\n"
"    background: #1b486d;\n"
"    }\n"
"\n"
"QPushButton:pressed {\n"
"    border: 2px solid #07121b;\n"
"    border-style: inset;\n"
"    /*background: qradialgradient(\n"
"        cx: 0.4, cy: -0.1, fx: 0.4, fy: -0.1,\n"
"        radius: 1.35, stop: 0 #fff, stop: 1 #1b486d\n"
"        );*/\n"
"    background: #1b486d;\n"
"\n"
"    }")
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        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", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Deneme Programı"))
        self.lineEdit.setPlaceholderText(_translate("MainWindow", "Bekleme Süresi"))
        self.pushButton.setText(_translate("MainWindow", "Başlat"))

        try:
            self.pushButton.clicked.connect(self.x)
        except Exception as e:
            print(e)

    def x(self):
        cd = int(self.lineEdit.text())
        for i in range(5):
            self.thread = DummyThread(self, cd)
            self.thread.start()
            self.thread.finished.connect(self.a)

    def a(self):
        self.textBrowser.setText(self.textBrowser.toPlainText() + "\nHello")

class DummyThread(QThread):
    finished = pyqtSignal()
    def __init__(self,cd):
        super(DummyThread, self).__init__()
        self.cd = cd
    def run(self):
        time.sleep(self.cd)
        self.finished.emit()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
EN

回答 2

Stack Overflow用户

发布于 2020-11-01 18:54:11

DummyThread不接受任何参数,在创建实例时删除self。既然是from time import *,就需要从time.sleep(1)中删除time.。这将产生以下代码:

代码语言:javascript
复制
    def x(self):
        self.thread = DummyThread()
        self.thread.start()
        self.thread.finished.connect(self.a)
    def a(self):
        self.textBrowser.setText(self.textBrowser.toPlainText() + "\nHello")

class DummyThread(QThread):
    finished = pyqtSignal()
    def run(self):
        sleep(1)
        self.finished.emit()

附注:正如文件介绍所示,不建议将代码添加到PyUIC生成的文件中。

票数 0
EN

Stack Overflow用户

发布于 2020-11-01 18:58:23

您的代码之所以失败,是因为它不是从QObject继承的。要使QThreads工作,父类必须继承QObject或派生类,而不是object

代码语言:javascript
复制
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'denn.ui'
#
# Created by: PyQt5 UI code generator 5.12.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
import time


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setStyleSheet("")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.lineEdit.setFont(font)
        self.lineEdit.setAlignment(QtCore.Qt.AlignCenter)
        self.lineEdit.setObjectName("lineEdit")
        self.verticalLayout.addWidget(self.lineEdit)
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.textBrowser.setFont(font)
        self.textBrowser.setObjectName("textBrowser")
        self.verticalLayout.addWidget(self.textBrowser)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Open Sans")
        font.setPointSize(20)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("QPushButton {\n"
"    color: white;\n"
"    border: 2px solid #46963f;\n"
"    border-radius: 20px;\n"
"    border-style: outset;\n"
"    /*background: qradialgradient(\n"
"        cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,\n"
"        radius: 1.35, stop: 0 #fff, stop: 1 #46963f\n"
"        );*/\n"
"    background:#46963f;\n"
"    padding: 5px;\n"
"    }\n"
"\n"
"QPushButton:hover {\n"
"    border: 2px solid #07121b;\n"
"    /*background: qradialgradient(\n"
"        cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4,\n"
"        radius: 1.35, stop: 0 #fff, stop: 1 #1b486d\n"
"        );*/\n"
"    background: #1b486d;\n"
"    }\n"
"\n"
"QPushButton:pressed {\n"
"    border: 2px solid #07121b;\n"
"    border-style: inset;\n"
"    /*background: qradialgradient(\n"
"        cx: 0.4, cy: -0.1, fx: 0.4, fy: -0.1,\n"
"        radius: 1.35, stop: 0 #fff, stop: 1 #1b486d\n"
"        );*/\n"
"    background: #1b486d;\n"
"\n"
"    }")
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        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", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Deneme Programı"))
        self.lineEdit.setPlaceholderText(_translate("MainWindow", "Bekleme Süresi"))
        self.pushButton.setText(_translate("MainWindow", "Başlat"))

        

class Window(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.x)
    def x(self):
        cd = int(self.ui.lineEdit.text())
        for i in range(5):
            self.thread = DummyThread(self, cd)
            self.thread.finished.connect(self.a)
            self.thread.start()

    def a(self):
        self.ui.textBrowser.setText(self.ui.textBrowser.toPlainText() + "\nHello")

class DummyThread(QThread):
    finished = pyqtSignal()
    def __init__(self, parent, cd):
        super(DummyThread, self).__init__(parent)
        self.cd = cd

    def run(self):
        time.sleep(self.cd)
        self.finished.emit()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64635510

复制
相关文章

相似问题

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