On Thursday 23 July 2009 10:13, Dennis Lee Bieber wrote: > On Wed, 22 Jul 2009 10:32:51 -0700 (PDT), Seth <king.s...@gmail.com> > declaimed the following in gmane.comp.python.general: > >> Thanks for the response. I have gone through a lot of the tutorials. >> All of them(that I saw) seem to just deal will event-based >> applications ie calculator, image viewer, etc. How do I run pyserial >> in the background and pass the information to PyQT and refresh the >> screen? Is there a way to have pyserial run in another thread and >> pass the information to the UI? >> > So far as I've experienced (which isn't all that much), most all GUI > frameworks support some method of defining either: 1) a work routine > which will be called whenever the input event queue is empty -- work > routines should be coded to do a very short, fast, bit of processing and > return, so the event dispatcher can continue (collect one character at a > time, or one line using a non-blocking I/O operation; or use a thread to > collect and post via a Queue) (wx.EVT_IDLE [bind to your idle handler] & > wx.WakeUpIdle() [call from thread after posting to queue]);
I think I can say that idle processing isn't a common idiom in PyQt applications. After all, you can't guarantee that your application will be idle or be able to use up idle time in a way that you can rely on, and perhaps it isn't a good situation to be in if your framework is using up CPU time by idling. > 2) a timed-event which the dispatcher can call at periodic intervals (use > a thread to collect lines from the serial port, post the lines via a > Queue, and have the timed event check for queued data) (wx.Timer() ); In PyQt, the easiest way to do this is with a timer, connecting its timeout() signal to a slot (method) to perform some processing. A widget class might be adapted to do this in the following way: class MyWindow(QWidget): def __init__(self): QWidget.__init__(self) # ... other initialisation ... timer = QTimer(self) timer.timeout.connect(self.processData) # PyQt 4.5 signal notation timer.start(100) # every 100 milliseconds def processData(self): # Do your processing here. There are various ways to use timers with PyQt, but this is a fairly simple pattern to use. > 3) a callback interface to the GUI event dispatcher which can be invoked > from a separate thread (wx.CallAfter() ) I think at this point I would recommend using a separate thread. The idiom for using threads with PyQt is quite simple, though it helps to go with the framework and use QThread instead of Python's thread class. > You'll have to track down the equivalent QT functions (I have to > confess, I found the above from "wxPython in Action"; my last real GUI > coding that needed such was nearly 20 years ago, using xt and DECWindows > for the interface, and GKS on X for the data drawing, emulating an > archaic Ramtek graphics engine command set. The idle/work routine > collected commands sent via VMS mailbox to the "display" and generated > GKS operations for them). The people demand screenshots! ;-) David -- http://mail.python.org/mailman/listinfo/python-list