【问题标题】:PySide and python loggingPySide 和 python 日志记录
【发布时间】:2013-06-12 13:11:17
【问题描述】:

我想使用 PySide 创建一个简单的应用程序,只是为了从 python 日志中输出。

def mpm_print():
    print 'OK'

def mpm_log():
   log.info('OK')

class LabWindow(QtGui.QMainWindow):
    def __init__(self):
        super(LabWindow, self).__init__()

        self.initUI()
        mpm_print()
        mpm_log()

    def initUI(self):

        font = QtGui.QFont()
        font.setFamily("Courier")
        font.setFixedPitch(True)
        font.setPointSize(10)

        self.qtxt = QtGui.QTextEdit(self)
        self.qtxt.resize(self.size())
        self.qtxt.setReadOnly(True)
        self.qtxt.setFont(font)

        self.resize(640, 512)
        self.setWindowTitle('Efficient Algorithms Lab')

        self.show()

我想知道:

  • 如何重定向标准输出以写入 QTextEdit?
  • 如何编写 logging.Handler 来登录到 QTextEdit ?

谢谢

【问题讨论】:

    标签: python qt pyside


    【解决方案1】:

    这是从PyQt mailing-list 复制粘贴的,但应该适用于 PySide

    这应该做你想做的。

    class OutLog:
        def __init__(self, edit, out=None, color=None):
            """(edit, out=None, color=None) -> can write stdout, stderr to a
            QTextEdit.
            edit = QTextEdit
            out = alternate stream ( can be the original sys.stdout )
            color = alternate color (i.e. color stderr a different color)
            """
            self.edit = edit
            self.out = None
            self.color = color
    
        def write(self, m):
            if self.color:
                tc = self.edit.textColor()
                self.edit.setTextColor(self.color)
    
            self.edit.moveCursor(QtGui.QTextCursor.End)
            self.edit.insertPlainText( m )
    
            if self.color:
                self.edit.setTextColor(tc)
    
            if self.out:
                self.out.write(m)
    

    示例用法:

    import sys
    sys.stdout = OutLog( edit, sys.stdout)
    sys.stderr = OutLog( edit, sys.stderr, QtGui.QColor(255,0,0) )
    

    【讨论】:

    • 酷黑客!由于属性sys.stdoutsys.stderr 期望file objects 链接到它们,因此您刚刚创建了一个新类,它与file 对象(在本例中为write)具有相同的类函数名称。我猜想更详细一点,您也可以使用这种方法从qlineedit 读取stdin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多