【发布时间】:2021-07-24 07:11:44
【问题描述】:
我正在编写一个使用 Qt GUI 的应用程序,现在正在尝试对其进行多线程处理(第一次学习)。更长的任务最终将包含在工作线程中,但输出日志将需要在执行过程中写入。 GUI 类具有将这些日志输出到纯文本小部件的方法。到目前为止,一切都在 GUI 类中运行。
我目前有以下代码(为简洁起见,包括重要部分):
class Worker(QRunnable):
@pyqtSlot()
def run(self):
Ui.logentry(self, "Test")
class Ui(QtWidgets.QMainWindow):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi(resourcepath('./pycdra.ui'), self)
self.outputlog = self.findChild(QtWidgets.QPlainTextEdit, 'outputlog')
self.button = self.findChild(QtWidgets.QPushButton, 'button')
self.button.clicked.connect(self.Button)
self.threadpool = QThreadPool()
self.logentry("Available threads: %d" % self.threadpool.maxThreadCount())
def Button(self):
worker = Worker()
self.threadpool.start(worker)
def logentry(self, returntext):
self.outputlog.appendPlainText(self.timestamp() + " " + str(returntext))
self.outputlog.repaint()
def timestamp(self):
import datetime
ts = datetime.datetime.now(tz=None).strftime("%Y-%m-%d %H:%M:%S"))
return ts
def applic():
app = QApplication(sys.argv)
window = Ui()
window.show()
sys.exit(app.exec_())
applic()
当我尝试运行它时,GUI 加载完美,但在推送 button 时,Worker 的 Ui.logentry 部分返回错误:AttributeError: 'Worker' object has no attribute 'outputlog'
我尝试将 logentry() 和 timestamp() 设为全局,以便它们可以访问并被两个类访问,但我最接近 Ui.self.outputlog.appendPlainText(self.timestamp() + " " + str(returntext)) 行的是 'Ui' object has no attribute 'self'。
我错过了什么?我是否正确地使它们全球化或有其他方法可以做到这一点?
【问题讨论】:
-
在此期间可能发生了一些变化,但至少在 Python 3.7 上,上述代码会导致第一个装饰器出现语法错误。而且,无论如何,
pyqtSlot装饰器仅适用于 QObject 子类,而 QRunnable 则不然。 -
我正试图回答你,但是当我浏览你的代码时,我发现越来越多的问题。请确保您提供可靠的代码,该代码应为minimal and reproducible。
-
糟糕,这是我的事。代码在一个封闭的网络上,所以我不得不手动重新输入它并在 Worker 类中忘记了
def run(self):。编辑问题以包括它。关于装饰器,它在我正在关注的教程示例中,我认为它很重要。如果不是,它就消失了。 -
不要删除属于您的问题的部分。只需确保您的代码正确且准确地重现它即可。
标签: python python-3.x pyqt5 qthread