[PyQt] Conflict between setuptools & requirements in official PyQt5 docs

Baz Walter bazwal at ftml.net
Wed Feb 10 18:08:08 GMT 2016


On 10/02/16 17:24, Phil Thompson wrote:
> On 10 Feb 2016, at 4:49 pm, Jones, Bryan <bjones at ece.msstate.edu> wrote:
>>
>> def printDestroyed(qObject):
>>      def destroyed():
>>          print('destroyed {}'.format(qObject))
>>      qObject.destroyed.connect(destroyed)
>>
>> def qtMain():
>>      global app
>>      app = QApplication(sys.argv)
>>      printDestroyed(app)
>>
>>      w = QWidget()
>>      printDestroyed(w)
>>      w.show()
>>
>> def gcCrash():
>>      print('gcCrash')
>>      qtMain()
>>      gc.collect()
>
> I think that has something to do with the destroyed() slot being in a
> nested function. Also the destroyed signal can be tricky to deal with
> because it is emitted during the destruction of the QObject. I'm not
> saying there isn't a bug here, but I'm not sure it's a symptom of the
> crash on exit issue.
>
> Phil

This example can be made a bit clearer if the widget is explicitly 
deleted like this:

     w = QWidget()
     w.setAttribute(Qt.WA_DeleteOnClose, True)
     printDestroyed(w)
     w.show()

The destroyed signal is now emitted, but it produces a somewhat 
unexpected exception:

     NameError: free variable 'qObject' referenced before assignment in 
enclosing scope

This can be fixed by avoiding use of the enclosed variable in the nested 
function:

def printDestroyed(qObject):
     def destroyed(obj):
         print('destroyed {}'.format(obj))
     qObject.destroyed.connect(destroyed)

Which works okay, but still dumps core on exit, which I don't 
understand. Any ideas why that is?

-- 
Regards
Baz Walter


More information about the PyQt mailing list