python segfaulting, MemoryError (PyQt)

Diez B. Roggisch deets at nospam.web.de
Tue Apr 28 03:35:31 EDT 2009


Denis L schrieb:
> Hello,
> 
> I'm experiencing odd errors on both windows and linux with the following 
> code:
> 
> import sys
> from PyQt4.QtCore import *
> from PyQt4.QtGui import *
> 
> class Options(QDialog):
>     def __init__(self, values):
>         QDialog.__init__(self)
> 
>         self.values = values
> 
>         fooEdit = QLineEdit(values['foo'])
>         self.connect(fooEdit, SIGNAL('textChanged(QString)'),
>                      lambda value: self.optionChanged('foo', value))
> 
>         barEdit = QLineEdit(values['bar'])
>         self.connect(barEdit, SIGNAL('textChanged(QString)'),
>                      lambda value: self.optionChanged('bar', value))
> 
>         layout = QVBoxLayout()
>         layout.addWidget(fooEdit)
>         layout.addWidget(barEdit)
> 
>         self.setLayout(layout)
> 
>     def optionChanged(self, option, value):
>         self.values[option] = value
>         print self.values
> 
> def main(args):
>     app = QApplication(args)
>     values = dict(foo='', bar='')
>     dialog = Options(values)
>     dialog.show()
>     app.exec_()
> 
> if __name__ == '__main__':
>     main(sys.argv)
> 
> 
> If I type a character in fooEdit, another character in barEdit, and then 
> delete the character from barEdit I get an unhandled win32 exception occured 
> in python.exe on windows and segfault on linux.
> 
> If I type a character in fooEdit, delete it, and then type a character in 
> barEdit I get:
> 
> {'foo': PyQt4.QtCore.QString(u'a'), 'bar': ''}
> {'foo': PyQt4.QtCore.QString(u''), 'bar': ''}
> {'foo': Traceback (most recent call last):
>   File "L:\home\dev\python\test.py", line 17, in <lambda>
>     lambda value: self.optionChanged('bar', value))
>   File "L:\home\dev\python\test.py", line 27, in optionChanged
>     print self.values
> MemoryError
> 
> I'm using Python 2.5.4 and PyQt 4.4.3-1

As the documentation of pyqt clearly states, connecting signals doesn't 
increment the refcount on a passed slot, thus
  you need to keep a reference to your slots around.

Diez



More information about the Python-list mailing list