繁体   English   中英

如何在pyqt gui中将测试输出打印到标签

[英]How to print test output to a label in pyqt gui

我想用 python 脚本做什么:使用 pytest 测试方法将文本行打印到 pyqt GUI 中的标签。

运行主 python 文件时,GUI 启动,单击“测试”按钮运行测试而不会阻塞 GUI(请参阅下面的完整代码示例)。 但我现在不知道如何进行。

代码:

import sys

import pytest
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget


class Window(QtWidgets.QMainWindow):
    signal_start_background_job = QtCore.pyqtSignal()

    def __init__(self):
        super(Window, self).__init__()

        layout = QVBoxLayout()
        self.button = QtWidgets.QPushButton("test", self)
        self.label = QtWidgets.QLabel("console output")
        layout.addWidget(self.button)
        layout.addWidget(self.label)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.worker = WorkerObject()
        self.thread = QtCore.QThread()
        self.worker.moveToThread(self.thread)

        self.signal_start_background_job.connect(self.worker.background_job)
        self.button.clicked.connect(self.start_background_job)

    def start_background_job(self):
        self.thread.start()
        self.signal_start_background_job.emit()


class WorkerObject(QtCore.QObject):
    @QtCore.pyqtSlot()
    def background_job(self):
        pytest.main(["-s", "-k test_something"])


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())


def test_something():
    print("unit test some stuff")
    assert 0 == 0

您可以使用 QProcess 启动它,然后捕获输出,而不是直接使用 pytest:

import os
import sys

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()

        self.button = QtWidgets.QPushButton("test", self)
        self.label = QtWidgets.QLabel("console output")
        self.textedit = QtWidgets.QTextEdit(readOnly=True)

        widget = QWidget()
        layout = QVBoxLayout(widget)
        layout.addWidget(self.button)
        layout.addWidget(self.label)
        layout.addWidget(self.textedit)
        self.setCentralWidget(widget)

        self.process = QtCore.QProcess()
        self.process.setProgram(sys.executable)
        self.process.readyReadStandardError.connect(self.on_readyReadStandardError)
        self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)

        self.button.clicked.connect(self.on_clicked)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        self.process.setWorkingDirectory(CURRENT_DIR)
        self.process.setArguments(["-m", "pytest", "-s", "-k", "test_something"])
        self.process.start()

    @QtCore.pyqtSlot()
    def on_readyReadStandardError(self):
        err = self.process.readAllStandardError().data().decode()
        self.textedit.append(err)

    @QtCore.pyqtSlot()
    def on_readyReadStandardOutput(self):
        out = self.process.readAllStandardOutput().data().decode()
        self.textedit.append(out)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

我认为您需要检查 sys.stdout,并将其路由到一个 io 对象,您可以将其路由到小部件中的标签。 然后我会设置一个计时器,每隔 0.1 秒左右将标签的文本设置为该对象。 或者,您可以实现一个在 qt 中获取标准输出文本的小部件,例如: https : //stackoverflow.com/a/1220002/6615517我还没有尝试过,但该问题的其他答案应该会有所帮助。 您可能希望清除每个测试上的标签,以防止它变得太长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM