PyQt app in seperate thread

Chris Mellon arkanes at gmail.com
Wed Nov 22 09:49:28 EST 2006


On 22 Nov 2006 06:43:55 -0800, anders <anderslanglands at gmail.com> wrote:
>
> Phil Thompson wrote:
> > On Wednesday 22 November 2006 2:06 pm, anders wrote:
> > > Phil Thompson wrote:
> > > > On Wednesday 22 November 2006 12:37 pm, anders wrote:
> > > > > I am writing a plugin for a piece of software in python, and I want to
> > > > > start up a PyQt GUI in the plugin, without stalling the main thread
> > > > > while the gui is running (later i will want to pass messages between
> > > > > the main thread and the gui thread).
> > > > >
> > > > > I'm new to pyqt, so I'm probably doing something very silly, but for
> > > > > the moment I'm just trying to get the first pyqt tutorial example
> > > > > running in a seperate thread:
> > > > >
> > > > > ----8<--------
> > > > >
> > > > > import sys
> > > > > from PyQt4 import QtGui
> > > > > from PyQt4 import QtCore
> > > > >
> > > > > class MyThread( QtCore.QThread ):
> > > > >         def __init__( self ):
> > > > >                 QtCore.QThread.__init__( self )
> > > > >
> > > > >         def run( self ):
> > > > >                 app = QtGui.QApplication( sys.argv )
> > > > >                 hello = QtGui.QPushButton( 'Hello world!' )
> > > > >                 hello.resize( 500, 500 )
> > > > >                 hello.show()
> > > > >                 app.exec_()
> > > > >                 QtCore.QThread.terminate(  )
> > > > >
> > > > >
> > > > >
> > > > > mt = MyThread()
> > > > > mt.start()
> > > > > print 'Main thread continuing...'
> > > > > mt.wait()
> > > > > print 'GUI thread finished.'
> > > > >
> > > > > ----8<--------
> > > > >
> > > > > The app starts up (with a warning WARNING: QApplication was not created
> > > > > in the main() thread. ). I get a window, but no button, and clicking on
> > > > > the close button does nothing and I have to force the program to quit.
> > > > >
> > > > > There's got to be a way to get this working, right? Can anyone help me
> > > > > along the right path?
> > > >
> > > > Read http://doc.trolltech.com/4.2/threads.html
> > > >
> > > > In particular the bit that says that exec_() must be called from the main
> > > > thread and not from a QThread.
> > > >
> > > > Phil
> > >
> > > OK so that's all good... so how do I go about doing what I want then?
> > > Can I set up a window in the second thread and start its event loop
> > > without running the event loop in the core app?
> >
> > No. Read the second sentence of the paragraph I referred to. Also read the
> > section "QObject Reentrancy".
> >
> > Phil
>
> OK I see that now. Thanks for pointing that out. So basically, I can't
> do what I want at all. That's a bit of a pain. Is there no way of
> tricking Qt into thinking I'm running it in the main thread?
>

It's possible with hackery from C++ but I seriously doubt you can do
it from PyQt.


> A
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list