[PySide] Why doesn't this example work?

Sean Fisk sean at seanfisk.com
Thu Oct 23 06:26:11 CEST 2014


Hi Jim,

With all due respect to the author of the book, I don’t think this is a
very good example. The most important thing to realize is that nothing
really happens before the event loop is started. The line:

myApp.exec_()

is what starts the event loop. Without the event loop running, windows
won’t appear, user input cannot be handled, and basically nothing
QtGui-related will work. *Even if* windows show up before the event loop is
started, they won’t be able to respond to user interaction (as far as I
understand).

I would personally achieve the desired behavior like so:

#!/usr/bin/env python
import sys
from PySide import QtCore, QtGui
class SampleWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(SampleWindow, self).__init__(parent)
        self.setWindowTitle('Sample Window')
        self.setGeometry(300, 300, 200, 150)
        self.setMinimumHeight(100)
        self.setMinimumWidth(250)
        self.setMaximumHeight(200)
        self.setMaximumWidth(800)

    @QtCore.Slot()
    def do_resize(self):
        self.resize(300, 300)
        self.setWindowTitle('Sample Window Resized')
def main(argv):
    app = QtGui.QApplication(argv)

    # Create and show the window.
    window = SampleWindow()
    window.show()
    # PySide windows don't auto-raise on Mac OS X.
    window.raise_()

    # Set up a timer to fire 3 seconds *after the event loop starts*.
    QtCore.QTimer.singleShot(3000, window.do_resize)

    # Start the event loop. Nothing Qt-related happens until this call.
    return app.exec_()
if __name__ == '__main__':
    raise SystemExit(main(sys.argv))

The key take-away is that nothing QtGui-related *actually* happens before
the event loop is started, and everything is done by the time that it exits.

Hope this helps. Feel free to let me know if anything doesn’t make sense.
​


--
Sean Fisk

On Wed, Oct 22, 2014 at 8:17 PM, Jim Byrnes <jf_byrnes at comcast.net> wrote:

> In looking at the lists archives, I see that most of the participants
> seem to be experienced developers.  As a novice programmer I hope I am
> not intruding by asking some basic questions.
>
> I am working my way through examples in a PySide book I bought.
> According to the author the example should display a 200 x 150 window,
> pause 3 seconds and then display a 300 x 300 window.  On my system
> (Ubuntu 12.04) there is a approx 3 second delay after starting the
> program and then I see the 300 x 300 window. I never see the first window.
>
> Could someone explain to me why it does not act as described?
>
> # Import required modules
> import sys
> import time
> from PySide.QtGui import QApplication, QWidget
>
> class SampleWindow(QWidget):
>      """ Our main window class
>      """
>
>      # Constructor function
>      def __init__(self):
>          QWidget.__init__(self)
>          self.setWindowTitle("Sample Window")
>          self.setGeometry(300, 300, 200, 150)
>          self.setMinimumHeight(100)
>          self.setMinimumWidth(250)
>          self.setMaximumHeight(200)
>          self.setMaximumWidth(800)
>
> if __name__ == '__main__':
>      # Exception Handling
>      try:
>          myApp = QApplication(sys.argv)
>          myWindow = SampleWindow()
>          myWindow.show()
>          time.sleep(3)
>          myWindow.resize(300, 300)
>          myWindow.setWindowTitle("Sample Window Resized")
>          myWindow.repaint()
>          myApp.exec_()
>          sys.exit(0)
>      except NameError:
>          print("Name Error:", sys.exc_info()[1])
>      except SystemExit:
>          print("Closing Window...")
>      except Exception:
>          print (sys.exc_info()[1])
>
> Thanks,  Jim
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20141023/99b134f0/attachment.html>


More information about the PySide mailing list