Je suis occupé à écrire un programme qui demande des champs de type "textvariable".
Chacune des variable assujetties à 'textvariable' serait, par facilité de programme, du genre 'variable[i]=...". De ce fait, il faudrait définir les variables comme ceci :
for i in range(0, 18, 1):
Variable[i] = StringVar(value="")
La notation avec les crochets et une manière de dire: accède au i ème élément de la liste est assigne lui la valeur ... ce que tu donnes derrière le signe =. Mais il faudrait que ta liste ait déjà cette longueur. Hors ce n'est pas ton cas.
Toi tu veux créer une liste dans laquelle tu vas ajouter au fur et à mesure une référence vers un StringVar. Pour ajouter un élément à une liste, on utilise la méthode append des listes.
valeurs = [] # création d'une liste vide
for i in range(18):
valeurs.append(StringVar(value="")) # Ajout de la référence de StringVar à la liste valeurs
J'ai bien compris ton point de vue. Mais cela ne fonctionne pas, il me retourne l'erreur suivante :
Traceback (most recent call last):
File "/media/geoffroy/ON6GMT1/QSLLog/V0.1/QSLLog.py", line 600, in <module>
initialise = init()
File "/media/geoffroy/ON6GMT1/QSLLog/V0.1/QSLLog.py", line 593, in init
Label.append(StringVar(value=""))
File "/usr/lib/python3.5/tkinter/__init__.py", line 332, in __init__
Variable.__init__(self, master, value, name)
File "/usr/lib/python3.5/tkinter/__init__.py", line 236, in __init__
self._root = master._root()
AttributeError: 'NoneType' object has no attribute '_root'
J'ai bien créer ma liste 'Label = []', puis fait un 'append" sur ma liste, mais apparemment, il n'en veut pas ...
Ce n'est pas lié au append mais à la classe StringVar. Pour instancier un tel objet, il faut au minimum qu'un contexte existe (tkinter.Tk).
Crée donc ta fenêtre avant de créer ce StringVar, et tout ira bien.
(tkinter pourrait tout de même fournir des erreurs plus explicites)
Ok, j'ai bien compris mon erreur : en fait, je définissais mes différents "def ...", dont "def init():", dans lequel je définissais notamment mes StringVar, mais la fonction était appelée AVANT mon tkinter.Tk().
Maintenant, je l'ai changer de place : j'appelle la fonction APRES la définition de ma fenêtre, et ça fonctionne.
Merci à vous pour ce petit coup de main, et bonnes fêtes !
Geoffroy
StringVar
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique