python segfaulting, MemoryError (PyQt)

Phil Thompson phil at riverbankcomputing.com
Tue Apr 28 17:26:21 CEST 2009


On Tue, 28 Apr 2009 17:10:51 +0200, "Denis L" <no at spam.com> wrote:
> "Phil Thompson" <phil at riverbankcomputing.com> wrote in message 
> news:mailman.4690.1240925876.11746.python-list at python.org...
>> On Tue, 28 Apr 2009 14:54:41 +0200, "Denis L" <no at spam.com> wrote:
>>> "Phil Thompson" <phil at riverbankcomputing.com> wrote in message
>>> news:mailman.4664.1240907352.11746.python-list at python.org...
>>>> On Tue, 28 Apr 2009 03:53:34 +0200, "Denis L" <no at spam.com> wrote:
>>>>> 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
>>>>>
>>>>> Thanks in advance for any help.
>>>>
>>>> Works fine for me with current versions.
>>>>
>>>> Phil
>>>
>>> I have noticed that if I do "self.values[option] = QString(value)"
>>> instead of "self.values[option] = value" in optionChanged I don't get
>>> any
>>
>>> errors.
>>>
>>> Is it perhaps not safe to keep the reference to the lambda QString
>>> argument?
>>
>> It shouldn't make any difference.
>>
>> Phil
> 
> Last idea, C++ declaration of textChanged signal is this:
> 
> void textChanged (const QString&text)
> 
> would self.values[option] = value store the reference to QString? And if
so
> 
> is that safe, to access that object after my slot returns?
>
> As far as I can see C++ equivalent would be
> 
> QString* pointer = &text; then derferencing that pointer later in the
code.
> 
> I can see how this could cause problems.

If there was a bug with lambda slots it's been fixed by now.

> Btw you are using PyQt 4.4.4 correct? What version of python? 

PyQt v4.5 snapshot, Python v2.6.2 and v3.0.1.

Phil



More information about the Python-list mailing list