[PyQt] creating a variable number of widget
Matt Newell
newellm at blur.com
Mon Jul 2 17:21:15 BST 2012
On Sunday, July 01, 2012 04:09:31 PM David Beck wrote:
> I am trying to create a GUI for managing a multilingual lexical database.
> Every word in the database can have 1 to n meanings or senses, each of
> which has to have several types of information associated with it. This
> corresponds to a (simplified) XML structure as follows
>
> <Lex>
> <Word>word</word>
> <Def>
> <L1>English definition</L1>
> <L2>Spanish definition</L2>
> <EG>example sentences</EG>
> </Def>
> <Def> … etc., may be iterated many times
> </Lex>
>
> What I would like to do is write a script that reads from the XML, counts
> the number of iterations of <Def>, and if there is more than one creates a
> QTabWidget for each <Def> element with QGroupBoxes and QTextEdits to
> display the contents of each of the subelements. It doesn't seem possible
> to completely automate this process using some sort of loop (repeat for
> the number of <Def> elements in <Lex>) because the constructors for the
> widgets are like this
>
> Fieldbook.ui.tab = QtGui.QWidget()
> Fieldbook.ui.lL1Box = QtGui.QGroupBox(Fieldbook.ui.tab)
> Fieldbook.ui.lL1Definition = QtGui.QTextEdit(Fieldbook.ui.lL1Box)
> Fieldbook.ui.lL2Box = QtGui.QGroupBox(Fieldbook.ui.tab)
> Fieldbook.ui.lL2Definition = QtGui.QTextEdit(Fieldbook.ui.lL2Box)
> Fieldbook.ui.lExampleBox = QtGui.QGroupBox(Fieldbook.ui.tab)
> Fieldbook.ui.lExamples = QtGui.QTextEdit(Fieldbook.ui.lExampleBox)
>
> On the first iteration this is fine, but the second iteration of the loop
> is going to create widgets with exactly the same names. Is there someway
> to replace something like the ".tab" in Fieldbook.ui.tab = QtGui.QWidget()
> with a variable that changes with every iteration of the loop?
>
There's many ways to do this in python. You could store each set of widgets
in a tuple, and have a list of tuples, one for each Def.
widgetGroups = []
for def in defs:
tab = QtGui.QWidget()
IL1Box = QtGui.QGroupBox(tab)
...
widgetGroups.append( (tab,IL1Box,...) )
If you want to be able to reference the individual widgets by name instead of
their index in the tuple, you could instead use a dict, or go one step further
and use a class.
If for some reason you really wanted to store each widget individually in
Fieldbook.ui's class dict, you could do
for def, i in enumerate(defs):
Fieldbook.ui.setattr( 'tab%i' % i, QtGui.QWidget() )
...
Matt
More information about the PyQt
mailing list