如何清除QTextEdit的文本并立即插入新的文本

2024-10-02 00:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个GUI来作为Python的交互式“曲线拟合工具”。我添加了一个“日志”窗口,它以QTextEdit小部件的形式显示代码的相关输出,比如优化的参数、警告等系统标准输出以及系统标准通过以下方式将其添加到QTextEdit小部件:

class Stream(QtCore.QObject):
    newText = QtCore.pyqtSignal(str)

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

class MyApp(QtWidgets.QMainWindow):
   def __init__(self):
        # Other stuff here...
        self.outputWidget = QtWidgets.QTextEdit();
        self.outputWidget.setReadOnly(True)
        vLayout.addWidget(self.outputWidget)

        sys.stderr = Stream(newText=self.onUpdateText)
        sys.stdout = Stream(newText=self.onUpdateText)

我想做的是在用户完成某些操作(如更改fit函数等)后,清除日志窗口,然后继续打印出现的任何内容,以防止与以前的fits混淆。在

显而易见的是:

^{pr2}$

然而,这只会导致widget被清除掉所有文本,而没有其他内容出现(或者,更确切地说,根本没有显示任何内容)。删除clear()调用可以使其正常工作,尽管没有清除以前的输出。在

在放入附加文本之前,什么是正确的方法来清除小部件的文本?在

编辑:

下面是一个可复制的例子:

import sys

from PyQt5 import QtGui, QtCore,QtWidgets
from PyQt5.QtCore import pyqtSlot
import PyQt5.QtCore as qtcore

class Stream(QtCore.QObject):
    newText = QtCore.pyqtSignal(str)

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


class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)

        vLayout = QtWidgets.QVBoxLayout(self._main);
        self.inputWidget = QtWidgets.QLineEdit();
        self.inputWidget.setText("Type something here.")
        self.inputWidget.textEdited.connect(self.textChanged)
        vLayout.addWidget(self.inputWidget)

        self.outputWidget = QtWidgets.QTextEdit();
        self.outputWidget.setReadOnly(True)
        vLayout.addWidget(self.outputWidget)

        sys.stdout = Stream(newText=self.onUpdateText)

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

    def onUpdateText(self, text):
        self.outputWidget.clear()
        self.outputWidget.insertPlainText(text)
        self.outputWidget.ensureCursorVisible()

    def textChanged(self,newstr):
        print(newstr)

if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    qapp.exec_()

Tags: textselfstreamdefstdoutsysclassstr
1条回答
网友
1楼 · 发布于 2024-10-02 00:28:29

导致这个问题的原因是print()方法在缓冲区2上写入文本:传递给print的文本和您可以验证是否传递字节的结束行(“\n”)。因此,第一次写入删除先前的文本并将其添加到新文本中,并且在第二次写入中删除先前的文本并且导致不可见的“\n”导致明显的不写入。在

def onUpdateText(self, text):
    self.outputWidget.insertPlainText(str(text.encode()))

输出:

enter image description here

因此,根据您的实际应用,有几种解决方案:

  • 使用sys.stdout.write()代替print()。在
^{pr2}$
  • 如果文本是结束线,请勿清理或执行任何操作:
def onUpdateText(self, text):
    if text != "\n":
        self.outputWidget.clear()
    self.outputWidget.insertPlainText(text)

def textChanged(self, newstr):
    print(newstr)

或者

def onUpdateText(self, text):
    if text != "\n":
        self.outputWidget.clear()
        self.outputWidget.insertPlainText(text)

def textChanged(self, newstr):
    print(newstr)

相关问题 更多 >

    热门问题