[PyQt] Shortening multiple widget initializations to one line

Matt Newell newellm at blur.com
Mon Dec 10 16:19:05 GMT 2012


On Sunday, December 09, 2012 11:48:18 PM Shriramana Sharma wrote:
> Hi -- recently I was trying to shorten the following overly verbose
> (IMO) lines to:
> 
> 		self . p1xSpin = QSpinBox ()
> 		self . p1ySpin = QSpinBox ()
> 		self . c1xSpin = QSpinBox ()
> 		self . c1ySpin = QSpinBox ()
> 		self . c2xSpin = QSpinBox ()
> 		self . c2ySpin = QSpinBox ()
> 		self . p2xSpin = QSpinBox ()
> 		self . p2ySpin = QSpinBox ()
> 
> to:
> 
> 		self . p1xSpin, self . p1ySpin, self . c1xSpin, self . c1ySpin,
> 		self . c2xSpin, self . c2ySpin, self . p2xSpin, self . p2ySpin,
> 		self . pHxSpin, self . pHySpin = ( QSpinBox () for i in range ( 10 ) 
)
> 
> but I got the error:
> 
> Traceback (most recent call last):
>   File "./bezierview-cubic-interp.py", line 327, in <module>
>     mainWindow = MainWindow ()
>   File "./bezierview-cubic-interp.py", line 204, in __init__
>     self . p1xSpin, self . p1ySpin, self . c1xSpin, self . c1ySpin,
> AttributeError: 'MainWindow' object has no attribute 'p1xSpin'
> 

Probably some simple error here causing the line to try to get the attribute 
instead of set it.

>>> class Y(object):                                                                                                                                                                                                                                                          
...     def __init__(self):
...             self.a, self.b = (QSpinBox() for a in range(2))
...                                                                                                                                                                                                                                                                           
>>>                                                                                                                                                                                                                                                                           
>>> y = Y()                                                                                                                                                                                                                                                                   

> Why is this, and is there any other method I can follow to shorten the
> tortuous list of repetitive commands for initializing multiple
> widgets?
> 

If you have a bunch of similarly named attributes then you can easily generate 
them.

>>> class X(object):
...     def __init__(self):
...             for at in ['%s%s%s' % (a,b,c) for a in ('c','p') for b in 
('x','y') for c in (1,2)]:
...                     setattr(self,at,QSpinBox())
... 
>>> x = X()
>>> x.cx1
<PyQt4.QtGui.QSpinBox object at 0x27c8440>
>>> x.cx2
<PyQt4.QtGui.QSpinBox object at 0x27c84d0>                                                                                                                                                                                                                                    


Matt


More information about the PyQt mailing list