[PyQt] Update GUI Table using QThread

Kyle Altendorf sda at fstab.net
Fri Sep 1 13:51:50 BST 2017


On 2017-09-01 06:52, Hitesh Patel wrote:
> We are developing our control and monitoring system GUI using PyQt 
> which require to handle big table so Qt main thread has to spent 
> considerable time to create table which eventually hang the GUI.

What takes so long to update the table?  Database or other network 
requests?  CPU intensive calculations?

> Can we update Qt table using QThread ?

Sure, signals and slots are used to not only connect between objects in 
a single thread but are also able to safely cross thread boundaries.  
Make sure you understand threading hazards related to multiple objects 
in different threads accessing the same objects.  Also, don't call any 
GUI functions from threads, only interact by way of signals and slots 
which were connected prior to moving the objects to different threads.  
A pet peeve of mine is that people should first learn threads without 
inheriting from QThread or threading.Thread.  While sometimes inheriting 
can be argued to be simpler I don't feel it helps to understand what is 
going on.  In other words, I recommend the first example, not the 
second.

http://doc.qt.io/qt-5/qthread.html#details

Now back to the questions I started with.  While threads in Python 
certainly are 'real' threads, they do have limitations not present in 
the same way as threads in C/C++, for example.  Python has a Global 
Interpreter Lock (GIL) which restricts there to only be one thread at a 
time accessing Python objects.  This means that unless you use good 
C-extension modules for CPU intensive activities, your Python code will 
never have more than one CPU worth of processor time.  Moving a CPU 
intensive activity to another thread can still sort of maintain GUI 
responsiveness but it's not really great.  If you're spending more time 
waiting on blocking I/O calls such as network requests it can be 
valuable to look into async frameworks such as asyncio and Twisted.  I 
personally use Twisted for all the CANbusnetworking in my PyQt5 
application (serial at some point soon as well).  I use qt5-reactor to 
integrate the Twisted and Qt event loops.  I do also have a thread 
(spawned through Twisted actually) that does some more CPU intensive 
activity to generate a model for a tree view but the progress bar in the 
GUI is still not smooth during that time.

Let us know more details and we can try to offer more specific advice.

Cheers,
-kyle


More information about the PyQt mailing list