2017-07-24 2 views
0

Je suis en train d'utiliser une variable dans un nom d'instance de zone de texte afin de mélanger à travers eux dans une boucle. Par exemple, j'ai 14 widgets de texte (infoBox1 à InfoBox14) que j'essaie de remplir à partir d'une liste. Donc, ce que je cherche à faire est la suivante:variable en utilisant le nom d'instance du widget texte dans tkinter

x=1 
for item in finalList: 

    self.infoBox(x).insert(END, item) 

    x += 1 

Ensuite, il suffit de remplir les cases que x augmente. Quelqu'un peut-il aider avec cela?

+2

Votre question est "est-ce possible", et la réponse est, plus que probablement "oui". – GrumpyCrouton

Répondre

3

Vous n'avez pas besoin de noms pour faire une telle chose. Vous pouvez mettre vos widgets dans une liste puis accéder à ceux qui utilisent des index.

#you can create like this. Used -1 as index to access last added text widget 
text_list = [] 
for idx in range(14): 
    text_list.append(tkinter.Text(...)) 
    text_list[-1].grid(...) 

#then you can easily select whichever you want just like accessing any item from a list 

text_list[x].insert(...) 
#or directly 
for idx, item in enumerate(finalList): 
    text_list[idx].insert("end", item) 
1

Il est possible de faire ce que vous essayez de faire.

Je n'ai pas rencontré une situation qui aurait besoin de le faire de cette façon bien.

Voici un exemple utilisant exec pour exécuter les commandes par boucle.

Pour en savoir plus sur la déclaration exec vous pouvez reed une documentation here

REMARQUE: Évitez cette méthode et utiliser les méthodes liste/dict à la place. Cet exemple est juste pour fournir des connaissances sur la façon dont cela serait possible en python.

from tkinter import * 

class tester(Frame): 
    def __init__(self, parent, *args, **kwargs): 
     Frame.__init__(self, parent, *args, **kwargs)  

     self.parent = parent 
     self.ent0 = Entry(self.parent) 
     self.ent1 = Entry(self.parent) 
     self.ent2 = Entry(self.parent) 
     self.ent0.pack() 
     self.ent1.pack() 
     self.ent2.pack() 

     self.btn1 = Button(self.parent, text="Put numbers in each entry with a loop", command = self.number_loop) 
     self.btn1.pack() 

    def number_loop(self): 
     for i in range(3): 
      exec ("self.ent{}.insert(0,{})".format(i, i)) 


if __name__ == "__main__": 
    root = Tk() 
    app = tester(root) 
    root.mainloop() 
+0

Pendant que vous y êtes, vous pouvez également créer des entrées avec exec. :) – Lafexlos

+0

True. Je voulais juste parler de la fonction d'insertion que l'OP utilisait. –