[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: [PyQt] logging.Handler not working with QThreads
From: Lukas Hetzenecker <LuHe () gmx ! at>
Date: 2009-02-25 15:27:16
Message-ID: 200902251627.16827.LuHe () gmx ! at
[Download RAW message or body]
Hello,
I created a QTextEdit where I wanted to display log messages.
A logging.Handler should do this job.
It worked with one thread well, but when I start a QThread the text on all
widgets is removed and I get many errors in my konsole:
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 177
Extension: 152 (RENDER)
Minor opcode: 25 (RenderCompositeGlyphs32)
Resource id: 0x0
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 177
Extension: 152 (RENDER)
Minor opcode: 25 (RenderCompositeGlyphs32)
Resource id: 0x0
X Error: RenderBadGlyphSet (invalid GlyphSet parameter) 177
Extension: 152 (RENDER)
Minor opcode: 25 (RenderCompositeGlyphs32)
Resource id: 0x0
.. and so on
I attatched a small example to this mail.
Could anybody tell me what I'm doing wrong?
Thanks for you help,
Lukas
["logging_error.py" (text/x-python)]
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import logging
class QtStreamHandler(logging.Handler):
def __init__(self, parent, main):
logging.Handler.__init__(self)
self.parent = parent
self.main = main
self.textWidget = parent
self.formater = logging.Formatter("%(message)s")
def createLock(self):
self.mutex = QMutex()
def acquire(self):
self.mutex.lock()
def release(self):
self.mutex.unlock()
def emit(self,record):
self.textWidget.appendPlainText(self.formater.format(record))
self.textWidget.moveCursor(QTextCursor.StartOfLine)
self.textWidget.ensureCursorVisible()
class Log(QDialog):
def __init__(self, parent, main):
super(Log, self).__init__(parent)
self.parent = parent
self.main = main
self.layout = QVBoxLayout(self)
self.logEdit = QPlainTextEdit(self)
self.logEdit.setLineWrapMode(QPlainTextEdit.NoWrap)
self.logEdit.setReadOnly(True)
self.button = QPushButton(self)
self.button.setText("Message")
self.layout.addWidget(self.logEdit)
self.layout.addWidget(self.button)
self.connect(self.button, SIGNAL("clicked()"), self.message)
self.show()
def message(self):
self.main.log.error("Log window")
class MainWindow(QDialog):
def __init__(self, parent, main):
super(MainWindow, self).__init__()
self.parent = parent
self.main = main
self.layout = QVBoxLayout(self)
self.check = QCheckBox(self)
self.check.setText("Foobar")
self.combo = QComboBox(self)
self.combo.addItem("aaaa")
self.combo.addItem("bbbb")
self.button = QPushButton(self)
self.button.setText("Start Thread")
self.button2 = QPushButton(self)
self.button2.setText("Message")
self.layout.addWidget(self.check)
self.layout.addWidget(self.combo)
self.layout.addWidget(self.button)
self.layout.addWidget(self.button2)
self.connect(self.button, SIGNAL("clicked()"), self.startThread)
self.connect(self.button2, SIGNAL("clicked()"), self.message)
self.show()
def startThread(self):
self.thread = Thread(self, self.main)
self.connect(self.thread, SIGNAL("finished()"), lambda : self.main.log.error("Thread finished"))
self.thread.start()
def message(self):
self.main.log.error("Main window")
class Thread(QThread):
def __init__(self, parent, main):
super(Thread, self).__init__(parent)
self.log = main.log
def run(self):
self.log.info("Thread...")
class Main(QObject):
def __init__(self):
super(Main, self).__init__()
logger = logging.getLogger("series60-remote")
logger.setLevel(logging.DEBUG)
self.logWindow = Log(None, self)
dialogHandler = QtStreamHandler(self.logWindow.logEdit, self)
logger.addHandler(dialogHandler)
self.logWindow.show()
self.log = logger
self.window = MainWindow(None, self)
app = QApplication([])
main = Main()
app.exec_()
_______________________________________________
PyQt mailing list PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic