Pyqt print輸出到控件中小demo

用pyqt做GUI的時候,涉及到日誌功能,希望把print的東西輸出到某個控件中,如QTextEdit()中。

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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章