如何使用 Python 将控制台输出重定向到 pyqt5 qplainTextEdit 小部件?

2023-12-02

我正在尝试在 PyQt5 的 QplainTextEdit 小部件中显示 python 脚本的控制台输出。

我收到此错误:

TypeError:调用元类基时出错 元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

我已经在 pyqt GUI 文件中定义了我的对象,并且我相信我拥有所有导入。

Update

我修改了这个问题中的代码:

from PyQt5.QtCore import QRectF, Qt
from PyQt5.QtWidgets import QFileDialog, QPlainTextEdit
from PyQt5 import QtCore, QtGui, QtWidgets
from PIL import Image, ImageQt, ImageEnhance
# from PyQt5.QtGui import Qt
from pyqtgraph.examples.text import text

from covid19gui_V3 import Ui_MainWindow
import os
import sys

input_img = Image.open("/home/ironmantis7x/Documents/Maverick_AI/Python/keras-covid-19/maverickAI30k.png")
text_edit = QPlainTextEdit()

class EmittingStream(QtCore.QObject):

    textWritten = QtCore.pyqtSignal(str)
    def write(self, text):
        self.textWritten.emit(str(text))

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    textWritten = QtCore.pyqtSignal(str)
    def __init__(self, parent=None, **kwargs):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.ShowIButton.clicked.connect(self.do_test)
        self.chooseStudy.clicked.connect(self.do_choosestudy)
        self.RunButton_3.clicked.connect(self.do_runstudy)
        self.scene = QtWidgets.QGraphicsScene(self)
        self.graphicsView.setScene(self.scene)
        w, h = input_img.size
        self.pixmap_item = self.scene.addPixmap(QtGui.QPixmap())
        # self.graphicsView.fitInView(QRectF(0, 0, w, h), Qt.KeepAspectRatio)
        self.graphicsView.update()
        self.plainTextEdit.update()
        self.level = 1
        self.enhancer = None
        self.timer = QtCore.QTimer(interval=500, timeout=self.on_timeout)
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)

    def write(self, text):
        self.textWritten.emit(str(text))

    @QtCore.pyqtSlot()
    def do_test(self):
        # input_img = Image.open("/home/ironmantis7x/Documents/Maverick_AI/Python/keras-covid-19/maverickAI30k.png")
        self.enhancer = ImageEnhance.Brightness(input_img)
        self.timer.start()
        self.ShowIButton.setDisabled(True)

    @QtCore.pyqtSlot()
    def on_timeout(self):
        if self.enhancer is not None:
            result_img = self.enhancer.enhance(self.level)
            qimage = ImageQt.ImageQt(result_img)
            self.pixmap_item.setPixmap(QtGui.QPixmap.fromImage(qimage))
        if self.level > 7:
            self.timer.stop()
            self.enhancer = None
            self.level = 0
            self.ShowIButton.setDisabled(False)
        self.level = 1
        self.ShowIButton.setDisabled(False)

    @QtCore.pyqtSlot()
    def do_choosestudy(self):
        dlg = QFileDialog()
        dlg.setFileMode(QFileDialog.AnyFile)
        if dlg.exec_():
            filenames = dlg.selectedFiles()
            f = open(filenames[0], 'r')

    @QtCore.pyqtSlot()
    def do_runstudy(self):
        os.system("df -h")
        # filetext = open('screenout.txt').read()
        # filetext.close()
        # textViewValue = self.plainTextEdit.toPlainText()
        # QPlainTextEdit.appendPlainText(self, str(textViewValue))
        # sys.stdout = self(textWritten=self.textWritten)
        self.normalOutputWritten(text_edit)

    def __del__(self):
        # Restore sys.stdout
        sys.stdout = sys.__stdout__

    def normalOutputWritten(self, text_edit):
        #cursor = self.plainTextEdit.textCursor()
        #cursor.movePosition(QtGui.QTextCursor.End)
        #cursor.insertText(text_edit)
        self.plainTextEdit.appendPlainText(text_edit)
        #self.plainTextEdit.ensureCursorVisible()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

我怎样才能使其正确工作?

Update 2

我确实对这个主题进行了研究,这是我在发布问题之前用来尝试解决问题的主要资源之一:如何捕获 Python 解释器的输出并在文本小部件中显示?

Update 3

我修改了帖子中的代码,以反映我用来帮助我解决问题的链接中的代码建议。

我仍然无法让它正确运行。我现在收到此错误:

self.plainTextEdit.appendPlainText(text_edit) 类型错误: appendPlainText(self, str):参数 1 具有意外类型 'QPlainTextEdit'


我有一个用户界面 TableManagerWindow,我一直在 Qt 设计器中维护和开发它。通过 pyuic 转换为 *.py 文件后,我能够实现 Ferdinand Beyer 在上面提供的链接中建议的内容。用于将文本打印到终端的简单按钮,它确实通过append() 附加到QTextEdit 小部件。由于某种原因,不确定这是否适合您,但我可以保证它也对我有用。我不够精明,无法理解引起问题的细微差别,但我想我会把它放在这里以防万一。如果它是无关的,管理员可以随意删除它,但它确实有效。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

# Define a stream, custom class, that reports data written to it, with a Qt signal
class EmittingStream(QtCore.QObject):

    textWritten = QtCore.pyqtSignal(str)

    def write(self, text):
        self.textWritten.emit(str(text))

class Ui_TableManagerWindow(object):
    def setupUi(self, TableManagerWindow):
        #define all of my widgets, layout, etc here
        .
        .
        .
        # Install a custom output stream by connecting sys.stdout to instance of EmmittingStream.
        sys.stdout = EmittingStream(textWritten=self.output_terminal_written)

        # Create my signal/connections for custom method
        self.source_dir_button.clicked.connect(self.sourceDirButtonClicked)

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


    def retranslateUi(self, TableManagerWindow):
        .
        .
        .

    #custom method that prints to output terminal.  The point is to have this emmitted out to my QTextEdit widget.
    def sourceDirButtonClicked(self):
        for i in range(10):
            print("The Source DIR button has been clicked " + str(i) + " times")

    #custom method to write anything printed out to console/terminal to my QTextEdit widget via append function.
    def output_terminal_written(self, text):
        self.output_terminal_textEdit.append(text)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    TableManagerWindow = QtWidgets.QMainWindow()
    ui = Ui_TableManagerWindow()
    ui.setupUi(TableManagerWindow)
    TableManagerWindow.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python 将控制台输出重定向到 pyqt5 qplainTextEdit 小部件? 的相关文章

随机推荐

  • 在包含 DOS-cmd 的变量中使用 subprocess()

    我不太擅长编程并且在使用时遇到问题subprocess Python 中的命令 我的程序创建以下字符串 wsl ocrmypdf sr l deu mnt z dms inbox Scan 2019 11 27 13 12 33 pdf z
  • 在 Bash 布尔表达式中使用变量

    有人可以解释如何执行布尔运算并将它们存储在 Bash 中的变量中吗 I tried A true B false C A D A B echo C echo D 我也尝试过不用美元 用 用 如何在bash中完成如此简单的操作 控制台的结果是
  • 如何在ViewPager中设置OnClickListener

    我是 Android 开发新手 正在学习编写和设计 Android 项目 我有问题ViewPager并且无法在此网站上或通过 Google 搜索找到答案 Problem 我无法制作一个Button执行其动作ViewPager 您可以在这里查
  • Java JTable 标头自动换行

    我正在尝试让表格上的标题自动换行 我已经成功做到了这一点 但第一个数据行正在扩展 该表的代码是 public class GenerateTable extends JTable private JCheckBox boxSelect ne
  • 符号扩展 1 位 2 的补数?

    我是一名学生 正在用 C 语言编写一个函数来对给定的位字段进行符号扩展 我正在使用 32 位 我在谷歌上查找了这个答案 但没有找到我想要的东西 我正在编写一个函数 该函数返回从 32 英寸中提取的一个或多个连续位的二进制补码表示形式 最左边
  • jQuery:用方括号发布数组怪癖

    我正在使用以下代码来发帖 var checked 2231 2432 jQuery ajax type post url statusUrl data entries checked 然而 当它实际发布时 服务器端的发布数据和开发人员工具中
  • 无法在 Eclipse 中启动 IBM MobileFirst Foundation Studio 8.0

    操作系统版本 Mac OS Sierra 10 12 3 Eclipse 版本 Neon 3 发布 4 6 3 Steps 下载最新的 Eclipse 版本 为 Java 开发人员安装了 IDE 从 Eclipse Marketplace
  • 如何从循环中的原始资源读取多个文件?

    我有很多文本文件 想将它们放入 for 循环中 我得到了一个 Extra 其中包含上次活动的资源名称 并有一个资源名称为的数组 我的原始资源中的文本文件来自 d0 d1 d2 d3 d79 我想检查名称和数组名称并将查找名称放入资源 我在
  • 如何在docker compose启动时创建表postgresql

    我知道这个问题已经被问过并且也给出了答案 但这对我不起作用 我也遵循同样的做法 我的 postgres 容器运行良好 我在容器内部检查了 docker entrypoint initdb d init sql 是否存在 我使用了以下 doc
  • 如何使用 Junit 5 测试服务提供商实现模块?

    这是我的基本模块 需要实现 myspi 包中定义的接口 各种提供商都可以提供 MyProvider 实现 基础模块通过 myspi MyProvider 接口实现使用它们 module base exports myspi uses mys
  • 无法在 xcode 中创建单视图 ios 应用程序

    I am new to ios xcode and I was trying to follow through the new SwiftUI tutorial The first one has you create a ios sin
  • KornShell 对整数数组进行排序

    KornShell ksh 脚本中有用于对整数数组进行排序的命令吗 在这种具体情况下 我对简单性而不是效率感兴趣 例如 如果变量 UNSORTED ARR 包含值 100911 111228 090822 并且我想将结果存储在 SORTED
  • assemble、a​​ssembleDebug 和 assembleRelease 之间的区别

    我在尝试学习bitrise平台 截至目前 我也不知道这个平台到底有什么用途 无论如何 当我进行设置时 它要求选择gradle task to run 有谁知道 assemble assembleDebug 和 assembleRelease
  • org.json.JSONException: JSONObject["address"] 不是 JSONArray

    我正在 java 中使用 org json 解析 json 我的 json 看起来像 address addressLine1 Noida addressLine2 UP firstName Achyut lastName khanna 我
  • Laravel Blade 在 php 中传递 Javascript 变量

    如何将 javascript 变量作为 php 循环中的变量传递 像这样的东西 显然不起作用 var myJsVar 100 for i 0 i
  • 确保 mongodb 中的索引

    一些问题 如果我在已经索引的字段上确保索引 它会重新索引还是简单地说 是的 我已经索引了 如果某些开发人员的机器上尚不存在该集合 mongo 会启动索引吗 我是否需要再次确保索引或者调用它一次就足够了 什么时候索引 安全 一定需要一些时间
  • 如何添加 NSMutableArray 中的所有十进制数字

    我有一个NSMutableArray其中有一些NSDecimalNumber在其中 就像 500 50 80 70 8000 现在我想添加所有这些decimal numbers一起 我尝试过使用 for NSDecimalNumber nu
  • 用表情符号替换表情符号

    我有一些文本 可能包括文本表情符号 例如 我想将它们替换为相应的表情符号 unicode 字符 and 对于上面的例子 我的目的是在此文本上运行 twimoji 我知道我可以查找和替换 但我宁愿使用已经预先构建的东西来执行此操作 有哪些库已
  • Qt 在“调试”模式下正确渲染此 SVG,但在“发布”模式下则不然

    我遇到了这个奇怪的问题 当我构建调试并链接调试 dll Qt 5 12 2 开源 时 我得到了预期的渲染 当我构建发布版本并链接到发布 dll 时 图像完全是空白的 该程序是从 MSVC 运行的 因此 dll 路径应该正确设置 有人知道发生
  • 如何使用 Python 将控制台输出重定向到 pyqt5 qplainTextEdit 小部件?

    我正在尝试在 PyQt5 的 QplainTextEdit 小部件中显示 python 脚本的控制台输出 我收到此错误 TypeError 调用元类基时出错 元类冲突 派生类的元类必须是其所有基类的元类的 非严格 子类 我已经在 pyqt