首页 > 解决方案 > 将函数输出直接显示到 QtextBrowser

问题描述

我对在面向对象的 python 上的编码还很陌生,所以请多多包涵。

我试图为我在使用 PyQt5 之前编写的程序构建一个 GUI。我在 Qt Designer 中设计了我的表单,然后用于python -m PyQt5.uic.pyuic -x [FILENAME].ui -o [FILENAME].py将文件获取为 .py。

为了避免更改文件,我使用另一个 python 文件来调用 form.py 文件和我的 program.py 并在那里构建所有内容

import sys 
from myform import Ui_MainWindow
from mydialog1 import Ui_Dialog as Dlog_1
from mydialog2 import Ui_Dialog as Dlog_2
from PyQt5 import QtCore, QtGui, QtWidgets
from myprogram import *

class Prog(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self):
        super(Prog, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.show()

        self.ui.actionAbout.triggered.connect(self.about)

        self.ui.textBrowser.append(show())

    def about(self):
        dialog = QtWidgets.QDialog()
        dialog.ui = Dlog_1()
        dialog.ui.setupUi(dialog)
        dialog.ui.Adicionar_3.clicked.connect(dialog.close)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.exec_()


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

我试图将函数(来自 myprogram)的输出显示到 QTextBrowser 小部件,因为它可以看到,self.ui.textBrowser.append(show())尽管这适用于例如纯文本(“test”),但它不适用于函数。

函数 show() 定义如下

def show():
    global empresas
    info = ["Nome da empresa", "Site da empresa", "Montante investido"]
    valid = False
    while not valid:
        try:
            gen = ((k, v[0], v[1]) for k, v in empresas.items())
            ename, esite, evalue = zip(*gen)
            valid = True
        except ValueError:
            print('Não existem empresas para mostrar. Introduza mais empresas')
            return
    print("")
    a = ('|{}{:^30}{}| |{}{:^30}{}| |{}{:^30}{}|'.format(c['g'],info[0],c['d'],c['g'],info[1],c['d'],c['g'],info[2],c['d']))
    print("+" + "=" * (len(a)-32) + "+")
    print(a)
    print("+" + "=" * (len(a)-32) + "+")
    for y in range(0,len(ename)):
       if y % 2 == 0:   
           print(f'|{ename[y]:^30}| |{esite[y]:^30}| |{evalue[y]:^17.3f}Milhões de',simb, '|') 
           print("+" + "-" * (len(a)-32) + "+")
       elif y % 2 == 1:
           print(f'|{ename[y]:^30}| |{esite[y]:^30}| |{evalue[y]:^17.3f}Milhões de',simb, '|') 
           print("+" + "-" * (len(a)-32) + "+") 
    return

此功能基本上打印一个有组织的表格,其中包含从字典到控制台的所有项目。有没有一种方法可以让我将相同类型的输出打印到 QtextBrowser,就像它在控制台上看到的那样?

提前致谢

标签: pythonpython-3.xpyqtpyqt5

解决方案


如果你真的不想改变你的show函数来返回一个字符串而不是直接打印它,你可以使用 stdout 重定向。基本上,这只是告诉print写入您自己的缓冲区,然后您可以将其刷新到字符串应该转到的实际目标中:

from contextlib import redirect_stdout
import io

# in __init__ :
f = io.StringIO()   # in-memory string buffer

with redirect_stdout(f):
    # everything printed in here will go to f
    show()    

# now reroute everything written to f to textBrowser
self.ui.textBrowser.append(f.getvalue())

推荐阅读