interestingly it often seems to find a previous instance on the first call, then after that it always finds two instanced.
not always though - weird

but it does seem to work so far...

On 24/10/13 20:19, Ivan Busquets wrote:
Whoops, hit send too early.

As for the problem that Ben mentioned of being left with an empty panel if you close your widget, I "naively" tried to iteratively look for the widget's parent until you find a QtGui.QStackedWidget, which seems to consistently lead to the widget holding the Panel's tabs (but again, I don't know if this is always the case. Just got lucky trying)

From there, I call removeWidget() to remove the most immediate child, which seems to remove the panel's tab as well.

Also, incidentally, while looking at the documentation for QtGui.QStackedWidget.removeWidget(), I found the following:


QtGui.QStackedWidget.removeWidget(/w/)

    Parameters:         *w* -- PySide.QtGui.QWidget
    
<https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QWidget.html#PySide.QtGui.QWidget>


Removeswidgetfrom thePySide.QtGui.QStackedWidget <https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QStackedWidget.html#PySide.QtGui.QStackedWidget>. i.e.,widgetis/not/deleted but simply removed from the stacked layout, causing it to be hidden.

Which might explain why closing a panel triggers a hideEvent() on all its widgets, but not a closeEvent()





On Thu, Oct 24, 2013 at 12:12 AM, Ivan Busquets <ivanbusqu...@gmail.com <mailto:ivanbusqu...@gmail.com>> wrote:

    Just gave this a try as well, since the whole hideEvent /
    closeEvent has bitten me recently as well.

    One thing I noticed is that hideEvent() gets called frequently
    while you drag your panel to a different pane, for example. So you
    want to be careful not to destroy anything during that event.

    As for the original question, though, I came up with this (not
    sure how bulletproof this will be, though)

    http://pastebin.com/Fqjyt1HX

    Instead of using the objectName, it just tries to match up the
    type of the current widget. I figure this should be safer, as you
    never know if other widgets will have the same name.



    On Wed, Oct 23, 2013 at 10:58 PM, Ben Dickson
    <ben.dick...@rsp.com.au <mailto:ben.dick...@rsp.com.au>> wrote:

        Hm, this is not easy..

        https://gist.github.com/dbr/7131354 is as far as I could get,

        ..but two problems:

        If you close the widget, you are left with an empty panel with
        no widgets. I couldn't find a way to access the PythonPanel in
        order to close it (closest I found was nuke.thisPane() or
        nuke.thisNode(), but nope)

        Second problem is you need to set _testwidget_instance=None
        when the panel is closed, but as discussed in the the "pyqt
        inside a python panel doesn't get close signal" thread above,
        hideEvent works but closeEvent is never called


        Writing your tool as a nukescripts.PythonPanel subclass might
        give enough flexibility, your PySide UI would be added as a
        PyCustom_Knob (as done in the panels.py code)


        On 24/10/13 14:14, Frank Rueter wrote:

            hm, every time I call a registered panel the first time, I
            find two
            objects with the respective ID e.g.:

            <PySide.QtGui.QWidget object at 0x31c95f0> <type
            'PySide.QtGui.QWidget'>

            <__main__.TestWidget object at 0x31c9128> <class
            '__main__.TestWidget'>


            If other instances are open, I am getting more QWidgets
            listed, e.g.:

            <__main__.TestWidget object at 0x2338128> <class
            '__main__.TestWidget'>

            <PySide.QtGui.QWidget object at 0x233ec20> <type
            'PySide.QtGui.QWidget'>
            <PySide.QtGui.QWidget object at 0x2341f80> <type
            'PySide.QtGui.QWidget'>


            How can I now check which ones to close, because two of
            these belong to
            the panel I need to keep?!


            Here is my test code which might be flawed:

            http://pastebin.com/bp7w1BnP



            I might not be seeing the trees for the woods here...




            On 24/10/13 15:12, Frank Rueter wrote:

                Cool, thanks Johan. That looks much simpler. Will give
                it a go as well...

                On 24/10/13 15:10, Johan Aberg wrote:


                    If you make sure your widgets are using
                    setObjectName(), you could
                    possibly look up the widgets by name like so to
                    make sure only on
                    instance is running:

                    for widget in QtGui.QApplication.allWidgets()
                    name = widget.objectName()
                    if 'myWidgetName' in name:
                    print name, type(widget)


                    I think the registered panel will be of class<class
                    'PyQt4.QtGui.QDialog'>

                    and the widget the PyCustom_Knob is pointing to<class
                    'PyQt4.QtGui.QWidget'>


                    As far as I can see, the panel and widget object
                    will be destroyed
                    when the panel is closed.


                    Johan

                    On 24/10/13 13:40, Frank Rueter wrote:

                        Hi all,


                        has anybody had success with enforcing only
                        one instance of a PySide
                        widget when it's registered as a panel?

                        My app writes data to disk upon certain events
                        and loads that data
                        again through the widget's constructor. So I
                        need to make sure that
                        only one instance is open at any given time,
                        otherwise I'm running
                        the risk of losing/corrupting that data.

                        Any ideas?

                        Cheers,
                        frank
                        _______________________________________________
                        Nuke-python mailing list
                        Nuke-python@support.thefoundry.co.uk
                        <mailto:Nuke-python@support.thefoundry.co.uk>,
                        http://forums.thefoundry.co.uk/
                        
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python





                _______________________________________________
                Nuke-python mailing list
                Nuke-python@support.thefoundry.co.uk
                
<mailto:Nuke-python@support.thefoundry.co.uk>,http://forums.thefoundry.co.uk/
                
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python




            _______________________________________________
            Nuke-python mailing list
            Nuke-python@support.thefoundry.co.uk
            <mailto:Nuke-python@support.thefoundry.co.uk>,
            http://forums.thefoundry.co.uk/
            http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python


-- ben dickson
        2D TD | ben.dick...@rsp.com.au <mailto:ben.dick...@rsp.com.au>
        rising sun pictures | www.rsp.com.au <http://www.rsp.com.au>

        _______________________________________________
        Nuke-python mailing list
        Nuke-python@support.thefoundry.co.uk
        <mailto:Nuke-python@support.thefoundry.co.uk>,
        http://forums.thefoundry.co.uk/
        http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python





_______________________________________________
Nuke-python mailing list
Nuke-python@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python

_______________________________________________
Nuke-python mailing list
Nuke-python@support.thefoundry.co.uk, http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python

Reply via email to