python segfaulting, MemoryError (PyQt)
Phil Thompson
phil at riverbankcomputing.com
Tue Apr 28 11:26:21 EDT 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