PyQT:在窗口中获取实时打印输出

马努

我正在使用GUI来在按下按钮“ my_button”时调用函数“ my_function”。

此函数迭代处理数据。它包含一个“ for”循环,并且在每次迭代时都会打印出一条消息,显示我的函数进度。我希望此打印可以实时显示在我的GUI中(在此示例中为textEdit小部件)我该怎么办?

我想明确表示我需要实时显示。我在网上找到了一些解决方案,但是所有打印仅在函数完成执行后出现。我需要实时显示照片以欣赏功能进度。在此先感谢您的提示!

这是一个最小的可复制示例(我是通过qt设计器获得的模板):

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(163, 225)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.formLayout = QtWidgets.QFormLayout(self.centralwidget)
        self.formLayout.setObjectName("formLayout")
        self.my_button = QtWidgets.QPushButton(self.centralwidget)
        self.my_button.setObjectName("my_button")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.my_button)
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setObjectName("textEdit")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.SpanningRole, self.textEdit)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 163, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.my_button.clicked.connect(self.my_function)

    def my_function(self):
        for idx in range(10):
            print('Executing iteration '+str(idx)+' ...')
            time.sleep(1) # replaces time-consuming task
        print('Finished!')

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.my_button.setText(_translate("MainWindow", "Execute"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
永乐

Qt的黄金法则:您不应在GUI主线程中执行消耗大量时间的任务,因为它们会阻塞Qt的事件循环。

考虑到上述情况,您必须在另一个线程中执行耗时的任务,并通过信号将信息发送到GUI线程。

另一方面,您不应修改Qt Designer生成的类,而应创建另一个类,该类继承自适当的小部件并用初始类填充。

import threading
import time

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(163, 225)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.formLayout = QtWidgets.QFormLayout(self.centralwidget)
        self.formLayout.setObjectName("formLayout")
        self.my_button = QtWidgets.QPushButton(self.centralwidget)
        self.my_button.setObjectName("my_button")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.my_button)
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setObjectName("textEdit")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.SpanningRole, self.textEdit)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 163, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.my_button.setText(_translate("MainWindow", "Execute"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    valueChanged = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.valueChanged.connect(self.on_value_changed)
        self.my_button.clicked.connect(self.on_clicked)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        threading.Thread(target=self.my_function, daemon=True).start()

    @QtCore.pyqtSlot(int)
    def on_value_changed(self, value):
        self.textEdit.append("Value: {}".format(value))

    def my_function(self):
        for idx in range(10):
            self.valueChanged.emit(idx)
            print("Executing iteration " + str(idx) + " ...")
            time.sleep(1)  # replaces time-consuming task
        print("Finished!")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Vala 打印输出仅在窗口关闭后在终端中可见

来自分类Dev

从子流程实时打印输出

来自分类Dev

从控制台实时打印输出到QTextEdit

来自分类Dev

实时打印输出并同时将其保存到变量

来自分类Dev

如何使用Open CV在窗口中打印消息

来自分类Dev

OsQuery在窗口中不提供json或csv输出

来自分类Dev

显示弹出窗口的ArcGIS Java Web地图打印输出

来自分类Dev

限制打印输出

来自分类Dev

在窗口中陷阱光标

来自分类Dev

如何从Linux的打印输出中获取一行?

来自分类Dev

如何从Android应用程序获取打印输出?

来自分类Dev

从打印输出中获取表格(熊猫)

来自分类Dev

从返回方法中获取正确的打印输出

来自分类Dev

如何从Linux的打印输出中获取一行?

来自分类Dev

在窗口中创建多个弹出窗口

来自分类Dev

在窗口中创建多个弹出窗口

来自分类Dev

在Excel中打印输出

来自分类Dev

如何垂直打印输出

来自分类Dev

在Excel中打印输出

来自分类Dev

使用awk打印输出

来自分类Dev

Vbscript函数打印输出

来自分类Dev

使用递归打印输出

来自分类Dev

如何使用PyQt在窗口中切换布局?(没有关闭/打开窗口)

来自分类Dev

使用PyQt5在文本框中打印输出语句

来自分类Dev

Visual Studio加载项:如何在窗口中获取选定的项目

来自分类Dev

在窗口中获取所有正在运行的进程的主页的缩略图

来自分类Dev

在窗口中调整Google图表的大小

来自分类Dev

在窗口中创建坐标查找

来自分类Dev

无法在窗口中显示进度栏