Pyqt print输出到控件中小demo
2016-05-15 11:44
501 查看
用pyqt做GUI的时候,涉及到日志功能,希望把print的东西输出到某个控件中,如QTextEdit()中。
but how?
根据stackoverflow的大神回复,我们可以写出如下代码:
运行结果,发现的确是把print输出到“日志输出”了,可是为何是乱码呢?
![](https://img-blog.csdn.net/20160515114701151)
![](https://img-blog.csdn.net/20160515114753863)
在QString 中文乱码中找到解决方案:
在print前加一句:
![](https://img-blog.csdn.net/20160515114620095)
最终代码:
but how?
根据stackoverflow的大神回复,我们可以写出如下代码:
# #coding:utf-8 from PyQt4 import QtGui from PyQt4 import QtCore from PyQt4.QtWebKit import* from PyQt4 import QtCore, QtGui from PyQt4 import uic from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import * from PyQt4.QtNetwork import * import sys reload(sys) sys.setdefaultencoding('utf-8') class MyConsole(QWidget): def __init__(self,parent): QWidget.__init__(self) self.parent = parent self.initUI() #初始化UI def initUI(self): self.gridlayout = QtGui.QGridLayout() #设置出20 x 20 的格局 for i in range(20): self.gridlayout.setColumnStretch(i,1) self.gridlayout.setRowStretch(i,1) lb1 = QLabel(u'账户:') lb2 = QLabel(u'密码:') self.userEntry = QLineEdit() self.passEntry = QLineEdit() self.passEntry.setEchoMode(QLineEdit.Password) self.loginBtn = QtGui.QPushButton(u"登录") self.loginBtn.setFixedSize(40,20) self.connect(self.loginBtn, QtCore.SIGNAL('clicked()'), self.onLoginButton) self.gridlayout.addWidget(lb1, 0, 0) self.gridlayout.addWidget(lb2, 1, 0) self.gridlayout.addWidget(self.userEntry, 0, 1,1,3) self.gridlayout.addWidget(self.passEntry, 1, 1,1,3) self.gridlayout.addWidget(self.loginBtn, 0, 4,1,2) self.setLayout(self.gridlayout) #响应登录按钮 def onLoginButton(self): username = self.userEntry.text() password = self.passEntry.text() QtGui.QMessageBox.about(self, username+u'登录成功', u"密码是:"+password) print username+u'登录成功', u"密码是:"+password class EmittingStream(QtCore.QObject): textWritten = QtCore.pyqtSignal(str) def write(self, text): self.textWritten.emit(str(text)) class MainWindow(QtGui.QMainWindow): def __init__(self,parent=None): QtGui.QMainWindow.__init__(self, parent) tabs = QtGui.QTabWidget(self) #tab1 tab1 = QtGui.QWidget() vbox = QtGui.QVBoxLayout() console = MyConsole(self) vbox.addWidget(console) tab1.setLayout(vbox) #tab2 self.tab2 = QTextEdit() tabs.addTab(tab1,u"控制台") tabs.addTab(self.tab2,u"日志输出") tabs.resize(500, 350) self.resize(500, 350) #禁止最大化 self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) self.show() #重定向输出 sys.stdout = EmittingStream(textWritten=self.normalOutputWritten) sys.stderr = EmittingStream(textWritten=self.normalOutputWritten) def __del__(self): sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ def normalOutputWritten(self, text): cursor = self.tab2.textCursor() cursor.movePosition(QtGui.QTextCursor.End) cursor.insertText(text) self.tab2.setTextCursor(cursor) self.tab2.ensureCursorVisible() def main(): app = QtGui.QApplication(sys.argv) win = MainWindow() sys.exit(app.exec_()) if __name__ == '__main__': main()
运行结果,发现的确是把print输出到“日志输出”了,可是为何是乱码呢?
在QString 中文乱码中找到解决方案:
在print前加一句:
QTextCodec.setCodecForCStrings(QTextCodec.codecForName("utf-8"))
最终代码:
# #coding:utf-8 from PyQt4 import QtGui from PyQt4 import QtCore from PyQt4.QtWebKit import* from PyQt4 import QtCore, QtGui from PyQt4 import uic from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtWebKit import * from PyQt4.QtNetwork import * import sys reload(sys) sys.setdefaultencoding('utf-8') class MyConsole(QWidget): def __init__(self,parent): QWidget.__init__(self) self.parent = parent self.initUI() #初始化UI def initUI(self): self.gridlayout = QtGui.QGridLayout() #设置出20 x 20 的格局 for i in range(20): self.gridlayout.setColumnStretch(i,1) self.gridlayout.setRowStretch(i,1) lb1 = QLabel(u'账户:') lb2 = QLabel(u'密码:') self.userEntry = QLineEdit() self.passEntry = QLineEdit() self.passEntry.setEchoMode(QLineEdit.Password) self.loginBtn = QtGui.QPushButton(u"登录") self.loginBtn.setFixedSize(40,20) self.connect(self.loginBtn, QtCore.SIGNAL('clicked()'), self.onLoginButton) self.gridlayout.addWidget(lb1, 0, 0) self.gridlayout.addWidget(lb2, 1, 0) self.gridlayout.addWidget(self.userEntry, 0, 1,1,3) self.gridlayout.addWidget(self.passEntry, 1, 1,1,3) self.gridlayout.addWidget(self.loginBtn, 0, 4,1,2) self.setLayout(self.gridlayout) #响应登录按钮 def onLoginButton(self): username = self.userEntry.text() password = self.passEntry.text() QtGui.QMessageBox.about(self, username+u'登录成功', u"密码是:"+password) QTextCodec.setCodecForCStrings(QTextCodec.codecForName("utf-8")) print username+u'登录成功!\n' + u"密码是:"+password class EmittingStream(QtCore.QObject): textWritten = QtCore.pyqtSignal(str) def write(self, text): self.textWritten.emit(str(text)) class MainWindow(QtGui.QMainWindow): def __init__(self,parent=None): QtGui.QMainWindow.__init__(self, parent) tabs = QtGui.QTabWidget(self) #tab1 tab1 = QtGui.QWidget() vbox = QtGui.QVBoxLayout() console = MyConsole(self) vbox.addWidget(console) tab1.setLayout(vbox) #tab2 self.tab2 = QTextEdit() tabs.addTab(tab1,u"控制台") tabs.addTab(self.tab2,u"日志输出") tabs.resize(500, 350) self.resize(500, 350) #禁止最大化 self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) self.show() #重定向输出 sys.stdout = EmittingStream(textWritten=self.normalOutputWritten) sys.stderr = EmittingStream(textWritten=self.normalOutputWritten) def __del__(self): sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ def normalOutputWritten(self, text): cursor = self.tab2.textCursor() cursor.movePosition(QtGui.QTextCursor.End) cursor.insertText(text) self.tab2.setTextCursor(cursor) self.tab2.ensureCursorVisible() def main(): app = QtGui.QApplication(sys.argv) win = MainWindow() sys.exit(app.exec_()) if __name__ == '__main__': main()
相关文章推荐
- QT入门,while parsing target library list: not well-formed (invalid token)解决
- Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt
- qt 最小化托盘 菜单互斥
- Qt5给Excel添加批注
- Qt在Windows下的三种编程环境搭建
- Qt在pro中管理多个子项目(子工程)
- mqtt 学习
- QT5问题汇总
- Qt学习笔记:QMainWindow与QDockWidget
- Qt: can't find -lGL(Ubuntu16.04)
- Qt学习笔记:QMenuBar()、QMenu()和QAction()的使用
- QtChart-Qt官方绘图库安装与使用
- ubuntu 安装 qt
- QT运行发布的exe时无法读取并显示图片的解决办法
- Qt学习之路(58): 进程间交互
- QT-怎么添加程序图标
- QT实现五子棋(附源码)
- QT-如何添加资源文件
- QT实战:LOL模拟加点器
- QT——快捷键