python - 将函数输出直接显示到 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,就像它在控制台上看到的那样?
提前致谢
解决方案
如果你真的不想改变你的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())
推荐阅读
- reactjs - Draft.js 与 Material UI 的集成引发缺少 ref 错误
- javascript - 当文件不存在时需要抛出错误
- flutter - 在没有上下文的颤振小部件上无法在 onPressed 上使用 Navigator.push 功能
- r - 错误:CentOS 7 上的包“rstan”延迟加载失败
- python - 自开始以来的 Python 记录时间(以秒为单位)
- c++ - 计算负实数值的 Gamma 函数(C++,Boost)
- wpf - WPF:我不想将样式传递给子元素
- algorithm - 此规范的线性算法?
- powerbi - Power BI 数据流更新,但数据集和报表不更新
- c++ - 如何解决“缺少vtable通常意味着第一个非内联虚成员函数没有定义。”