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

我想将控制台定向到 Pyqt GUI

代码如下所示


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给了我一个警告Unexpected argument


Qyouu
浏览 95回答 1
1回答

桃花长相依

1. 为什么定义了 def write(self, text) 但没有使用print要了解为什么要实现 write 方法,只需阅读内置文档:打印(*对象,sep='',end='\n',file=sys.stdout,flush=False)将对象打印到文本流文件,以 sep 分隔,后跟 end。sep、end、file 和flush(如果存在)必须作为关键字参数给出。所有非关键字参数都像 str() 一样转换为字符串并写入流中,以 sep 分隔,后跟 end。sep 和 end 都必须是字符串;它们也可以是 None,这意味着使用默认值。如果没有给出对象, print() 将只写 end。文件参数必须是具有 write(string) 方法的对象;如果它不存在或没有,则将使用 sys.stdout。由于打印的参数被转换为文本字符串,因此 print() 不能与二进制模式文件对象一起使用。对于这些,请使用 file.write(...) 代替。输出是否缓冲通常由文件决定,但如果flush关键字参数为true,则强制刷新流。版本 3.3 中的更改:添加了lush关键字参数。(强调我的)如前所述,“print”函数实现了一个逻辑,可以通过 write 方法将简单单词的文本(添加 sep、end 等)写入默认为 sys.stdout 的文件中。因此,目标不是在 sys.stdout 设备上写入,而是重定向文本,因此必须修改该方法,以便它通过信号发送信息newText。2. Stream(newText=self.onUpdateText) 中的参数是什么意思,我的pycharm给了我一个警告 Unexpected argument。默认情况下,QObject 可以接收 qproperties 初始值的 kwargs 并建立 qsignals 的连接。在这种情况下,它是第二个选项,所以sys.stdout = Stream(newText=self.onUpdateText)等于sys.stdout = Stream() sys.stdout.newText.connect(self.onUpdateText)Pycharm 指示警告“意外参数”,因为它指示的逻辑是用 C++ 实现的(通过 SIP),并且 IDE 无法处理它们。跳过它,因为它只是 IDE 的限制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python