0

我正在编写一个程序,该程序在 QT5 驱动的窗口中显示了一个标签/文本浏览器。我想要做的是拥有多个线程,如果其中一个线程想要将新字符串写入标签或 textBrowser,它将自动更新显示。

基本代码:(裸例)

所以在这里我启动了基本的 gui,但是sys.exit(app.exec_())在这种情况下调用之后,“单线程应用程序”会卡住,直到我按下 X 按钮关闭窗口。

#!python3
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(977, 777)
        Dialog.setAutoFillBackground(False)

        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(70, 50, 67, 19))
        self.label.setObjectName("label")

        self.textBrowser = QtWidgets.QTextBrowser(Dialog)
        self.textBrowser.setGeometry(QtCore.QRect(70, 90, 256, 192))
        self.textBrowser.setObjectName("textBrowser")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "TextLabel"))

    def test_update_text(self, text):
        self.label.setText(text)
        self.textBrowser.setText(text)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    ui.test_update_text("hi there")

    sys.exit(app.exec_())

然后我尝试做的是在另一个线程中更新 ui 并使用对话框更新窗口,但这根本不起作用(见评论),因为如果我将 ui 传递给另一个线程,QT 不喜欢它。

#!python3
import sys
import logging
import threading
import time
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(977, 777)
        Dialog.setAutoFillBackground(False)

        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(70, 50, 67, 19))
        self.label.setObjectName("label")

        self.textBrowser = QtWidgets.QTextBrowser(Dialog)
        self.textBrowser.setGeometry(QtCore.QRect(70, 90, 256, 192))
        self.textBrowser.setObjectName("textBrowser")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "TextLabel"))

    def test_update_text(self, text):
        self.label.setText(text)
        self.textBrowser.setText(text)

def thread_function_text(name,dialog,ui):
    num = 1
    while 1:
        ui.test_update_text("hi") # <-- Error: QObject: Cannot create children for a parent that is in a different thread.
        dialog.show() # <-- runnable but does nothing
        print("thread exe!", num)
        num = num + 1
        time.sleep(2)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(dialog)
    dialog.show()

    x = threading.Thread(target=thread_function_text, args=(1,dialog,ui,))
    x.start()

    app.exec_()
    sys.exit()

    x.join()

我知道“通常”您想使用信号/插槽来处理事件(例如,我按下窗口内的按钮)。但是当我基本上不想在窗口中进行用户交互但让程序控制窗口中显示的内容并随着程序进行更新时,像我这样的情况呢?

4

0 回答 0