问题描述
我想将控制台定向到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__
我有两个问题。
-
为什么定义
def write(self,text)
但不使用 -
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的限制。