簡體   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