有关直接控制台到Pyqt GUI的两个问题

问题描述

我想将控制台定向到Pyqt GUI

然后我搜索stackoverflow,找到答案

Print out python console output to Qtextedit

下面显示代码

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

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

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        self.setGeometry(50,50,500,300)
        self.setwindowTitle("PyQT tuts!")
        self.setwindowIcon(QtGui.QIcon('pythonlogo.png'))
        self.home()

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

    def onUpdateText(self,text):
        cursor = self.process.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.process.setTextCursor(cursor)
        self.process.ensureCursorVisible()

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

我有两个问题。

  1. 为什么定义def write(self,text)但不使用

  2. Stream(newText=self.onUpdateText)中的参数是什么意思,我的pycharm给我一个警告意外的参数

解决方法

1。为什么定义def write(self,text)但不使用

要了解为什么要实现write方法,只需阅读内置print的文档:

print(* objects,sep ='',end ='\ n',file = sys.stdout,flush = False)

将对象打印到文本流文件中,用sep分隔,然后跟随 最后。 sep,end,file和flush(如果存在)必须作为关键字给出 争论。

所有非关键字参数都将转换为字符串,例如str()这样做,并且 写入流中,以sep分隔,然后以end分隔。两者都 并且结尾必须是字符串;它们也可以是None,这意味着要使用 默认值。如果没有给出对象,则print()只会写完。

file参数必须是带有write(string)方法的对象;如果它 不存在或没有,将使用sys.stdout。自印 参数将转换为文本字符串,print()不能与 二进制模式文件对象。对于这些,改为使用file.write(...)

是否缓冲输出通常由文件确定,但是如果 flush关键字参数为true,将强制刷新流。

在版本3.3中进行了更改:添加了flush关键字参数。

(重点是我的)

如前所述,“打印”功能实现了一种逻辑,该逻辑可以通过写方法将简单的文字(添加sep,end等)写入默认为sys.stdout的文件中。

因此,目标不是写在sys.stdout设备上,而是重定向文本,因此必须修改该方法,以便它通过newText信号发送信息。

2。 Stream(newText = self.onUpdateText)中的参数是什么意思,我的pycharm给我一个警告Unexpected参数。

默认情况下,QObjects可以将kwarg接收到qproperties的初始值,并建立qsignal的连接。在这种情况下,这是第二个选择,所以

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

等于

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

Pycharm指示警告“意外参数”,因为它指示的逻辑是在C ++中实现的(通过SIP),并且IDE无法处理它们。只需跳过它,因为它只是对IDE的限制。