[PyQt] New exception in Python 3.7.4 when bad code tries to PyQt5.uic.loadUi()
Phil Thompson
phil at riverbankcomputing.com
Wed Aug 7 12:13:50 BST 2019
On 05/08/2019 18:25, Kyle Altendorf wrote:
> On 2019-08-03 14:38, Kyle Altendorf wrote:
>> I have many custom widgets with pyqtProperty's and GUI elements loaded
>> from .ui files. In various ways, my existing code tries to access
>> not-yet-present attributes in pyqtProperty's while the .ui is being
>> loaded. This is obviously bad and I plan to fix my code. I share
>> this example because I already finished it and because this is an odd
>> change of behavior from a micro version bump of Python. Also, it is
>> odd that each first time my code raises an exception there is not
>> necessarily a Qt failure. For example, WidgetB must be constructed
>> twice to get the traceback. I understand that this may well not get
>> 'fixed' since it probably never should have worked to begin with.
>>
>> Code and output from 3.7.3/3.7.4 on Linux/Windows are attached and
>> also available at:
>> https://gist.github.com/altendky/f15f8d180269a4080c25dec83cf556a0
>>
>> Here is the basic traceback:
>>
>> AttributeError: __getattribute__
>>
>> The above exception was the direct cause of the following
>> exception:
>>
>> Traceback (most recent call last):
>> File "bad.py", line 146, in main
>> widgets.append(WidgetA(broken=True))
>> File "bad.py", line 53, in __init__
>> PyQt5.uic.loadUi(io.StringIO(ui_text), self)
>> File
>> "C:\epc\bug\venv3.7-32\lib\site-packages\PyQt5\uic\__init__.py", line
>> 227, in loadUi
>> return DynamicUILoader(package).loadUi(uifile, baseinstance,
>> resource_suffix)
>> File
>> "C:\epc\bug\venv3.7-32\lib\site-packages\PyQt5\uic\Loader\loader.py",
>> line 72, in loadUi
>> return self.parse(filename, resource_suffix, basedir)
>> File
>> "C:\epc\bug\venv3.7-32\lib\site-packages\PyQt5\uic\uiparser.py", line
>> 1030, in parse
>> actor(elem)
>> File
>> "C:\epc\bug\venv3.7-32\lib\site-packages\PyQt5\uic\uiparser.py", line
>> 942, in createConnections
>> QtCore.QMetaObject.connectSlotsByName(self.toplevelWidget)
>> SystemError: <built-in function connectSlotsByName> returned a
>> result with an error set
>
> I read briefly about this SystemError and it seems that while yes, my
> code was raising an exception and shouldn't really have worked ever...
> this error indicates that connectSlotsByName() isn't properly
> propagating the exception and is instead returning a value as if no
> exception occurred. As such it seems that there is an error in the
> PyQt connectSlotsByName() wrapper in addition to my code. Though I
> admittedly don't know my way around SIP nor the C-API much.
It could also be that an exception is being correctly ignored, but not
cleared with PyErr_Clear().
However I can't reproduce the problem - I don't get a traceback,
although I'm not using exactly the same versions of Python.
Phil
More information about the PyQt
mailing list