将功能输出直接显示到QtextBrowser

时间:2019-02-01 14:14:07

标签: python python-3.x pyqt pyqt5

对于使用面向对象的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())可以看到,尽管例如它适用于纯文本(“测试”),但不适用于功能。

函数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相同的输出类型?

预先感谢

1 个答案:

答案 0 :(得分:0)

如果您真的不想更改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())