我正在尝试使用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
我认为您需要检出sys.stdout,并将其路由到io对象,然后可以将其路由到小部件中的标签。然后,我将设置一个计时器,并每隔0.1秒左右将标签文本设置为该对象。另外,您也可以实现一个小部件来捕获qt中的stdout文本,例如:https://stackoverflow.com/a/1220002/6615517我没有尝试过,但是对该问题的其他答案应该有所帮助。您可能需要清除每个测试上的标签,以防止其过长。