2010-03-23 8 views
0

Je suis en train de créer dynamiquement des boutons à l'exécution avec PyQT4.7Python: génération de nom d'attribut dynamique sans exec() ou eval()

Cependant, ce qui est mon premier programme Python Je ne suis pas sûr de savoir comment obtenir la fonctionnalité que je veux.

Je voudrais être en mesure de remplacer une chaîne de texte pour un nom d'attribut:

à savoir

for each in xrange(4): 
    myname = "tab1_button%s" % each #tab1_button0, tab1_button1, tab1_button2 

    #self.ui.tab1_button0 = QtGui.QPushButton(self.ui.tab) <--normal code to create a named button 
    setattr(self.ui,myname,QtGui.QPushButton(self.ui.tab)) #rewrite of line above to dynamicly generate a button 

#here's where I get stuck. this code isn't valid, but it shows what i want to do 
    self.ui.gridLayout.addWidget(self.ui.%s) % myname 
#I need to have %s be tab1_button1, tab1_button2, etc. I know the % is for string substituion but how can I substitute the dynamically generated attribute name into that statement? 

Je suppose qu'il ya une construction linguistique de basica Il me manque que le permet. Comme il est mon premier programme, s'il vous plaît reposez-vous sur moi;)

Répondre

3

Si j'interprété correctement, je pense que ce que vous voulez est le suivant:

self.ui.gridLayout.addWidget(getattr(self.ui,myname))

Donnez qu'un coup. En Python suivants deux déclarations sont fonctionnellement équivalentes (à partir du lien ci-dessous):

value = obj.attribute 
value = getattr(obj, "attribute-name") 

Pour contexte supplémentaire:

http://effbot.org/zone/python-getattr.htm

0

suffit de lui assigner le bouton à une variable de sorte que vous pouvez à la fois définir l'attribut et ajoutez le widget. Personnellement, j'ajouterais les boutons à une liste au lieu de leur donner des noms différents.

+0

dans ce scénario, les boutons deviennent des noms en ordre numérique , mais dans le programme que j'écris, leurs noms entiers seront tirés d'un dictionnaire, donc je ne suis pas sûr de savoir comment je les garderais sans noms intelligents avec votre exemple – PyNewbie27

+0

Stockez les boutons dans un dictionnaire? – FogleBird

0

Je pense que vous pouvez bénéficier de la connaissance des listes (communément appelés tableaux dans d'autres langues)

self.buttons = [None, None, None, None] 
for each in xrange(4): 
    self.buttons[each] = QtGui.QPushButton(self.ui.tab) 
    self.ui.gridLayout.addWidget(self.buttons[each]) 

Pour un tutoriel sur les listes Python: http://effbot.org/zone/python-list.htm