[Python] Checkbox et condition - Récupération de variable

Checkbox et condition - Récupération de variable [Python] - Python - Programmation

Marsh Posté le 19-01-2015 à 13:09:01    

Bonjour,
 
J'ai une liste sur tkinter.  
L'utilisateur choisit un élément de la liste.  
Le clique appel une "récupération" appelé CurSelect de ce que contient l'élément sélectionné.  
Selon le choix (condition en if) je dois remplir une variable k_i (variable associé à la i-ème liste de ma fenêtre).  
Là je fais simple. Juste une liste. Donc je dois remplir k1.  
 
Donc k1 prend des valeurs arbitraires que je lui fixe selon ce que l'utilisateur clique.  
Je demande un print(k1) à la fin juste pour être sûr que ça a marché et que j'ai bien ce qu'il faut dans k1.  
 
 

Citation :


from tkinter import *  
 
fenetre1 = Tk()
 
 
def CurSelet(evt):
    value=str(liste1.get(liste1.curselection()))
    if value==A:
       k1=0,8
    if value==B:
       k1=0,9
    if value==C:
       k1=1.1
    if value==D:
       k1=1.0
     
print(k1)
 
 
label = Label(fenetre1, text="Choisissez" )
label.pack()
liste1 = Listbox(fenetre1,width=80, height=5)
liste1.insert(1, "A" )
liste1.insert(2, "B" )
liste1.insert(3, "C" )
liste1.insert(4, "D" )
liste1.bind('<<ListboxSelect>>',CurSelet)


 
 
Il me renvoie toujours le message d'erreur suivant :
 

Citation :

NameError: name 'A' is not defined


(il me donne ça dans le cas où j'ai juste fait un seul IF avec A, mais j'ai mis tous les autres pour expliquer ou je voulais en venir).  
 
Je ne comprends pas en quoi elles ne sont pas définies. Que puis-je faire ? :o
 
Enfin. J'aimerais comprendre un truc. Dans le cas où ça marcherait, je le garde combien de temps k1 ?  
 
Vais je pouvoir appeler k1 "après" cette liste comme paramètre d'entrée d'une fonction ?  
 
 
Merci d'avance :o

Reply

Marsh Posté le 19-01-2015 à 13:09:01   

Reply

Marsh Posté le 19-01-2015 à 16:22:43    

Compare value à "A" (chaine de caractère contenant seulement le caractère 'A') au lieu de A  :o
 
Pour la variable k1, elle ne sera définie que dans ta fonction CurSelet (donc au passage, si tu veux l'afficher, il faut que tu indentes ton print(k1))


Message édité par Rontgen le 19-01-2015 à 16:26:47
Reply

Marsh Posté le 19-01-2015 à 16:42:46    

pinaillages divers, rontgen a resolu ton probleme :o
 
utilise fixed plutot que quote pour du code
 
fais gaffe à tes points et virgules quand tu definis k1, c'est pas la meme chose.
tu peux utiliser elif au lieu de if à la suite, et tu pourrais meme utiliser un dictionary pour passer de la lettre au nombre correspondant.
 
et chez moi la liste ne s'affiche que si tu finis avec un

liste1.pack()


---------------
I like work: it fascinates me. I can sit and look at it for hours.
Reply

Marsh Posté le 19-01-2015 à 18:07:05    

Merci les amis du taupin :o  
 
J'avais trouvé le problème entre temps mais bon rien de  tel qu'une confirmation.  
 
 
Comment je fais pour sortir k1 avec la valeur qui va bien (c'est à dire celle assignée par le if) de la fonction et aller la faire jouer ailleurs ?  
 

Reply

Marsh Posté le 19-01-2015 à 18:18:23    

Normalement il suffit d'un  

return k1


à la fin de ta fonction CurSelet pour que la fonction retourne la valeur de k1
 
Le truc un peu particulier là c'est que CurSelet est une fonction déclenchée par un événement dans ta liste donc c'est pas toi qui gère explicitement l'appel à cette fonction et donc sa valeur de retour.
Je ne sais pas exactement ce que tu veux faire mais tu as deux possibilités:
- soit tu rajoutes ton code qui utilise k1 à la fin de la fonction CurSelet
- soit tu as vraiment besoin de cette variable ailleurs et du coup il faut peut-être utiliser une variable globale, cf http://stackoverflow.com/questions [...] eated-them pour la syntaxe


Message édité par Rontgen le 19-01-2015 à 18:19:36
Reply

Marsh Posté le 19-01-2015 à 18:31:48    

Merci de ta réponse :o
Laisse moi t'expliquer alors plus en détail. Tu pourras peut être plus m'aiguiller.

 


Liste 1 => Clique de l'user => k1 =
Liste 2 => Clique de l'user => k2 =
Liste 3 => Clique de l'user => k3 =

 

Il faut que je récupère le k final (une fois que tout est bien cliqué) associé à chaque liste et faire une simple multiplication entre eux.

 

K=k1*k2*k3* ... k

 



Message édité par phosphorylase le 19-01-2015 à 18:31:57
Reply

Marsh Posté le 19-01-2015 à 19:05:18    

Probablement le plus facile serait de:
-  faire une variable globale qui est un tableau de taille n, qui va contenir chacun de tes (k_i)_i=1..n ainsi qu'une autre variable globale qui va contenir leur produit
- dans CurSelet, au lieu de ton k1, tu changes la valeur de k[i]
[  
D'ailleurs ce serait bien de reussir a choper quelle liste a déclenché l'événement à l'intérieur de CurSelet, comme ca tu peux la reutiliser pour toutes les listes et tu n'as pas à la dupliquer
Une autre facon intermédiraire serait de passer l'indice en argument donc CurSelet(evt, i) et de definir  
CurSelet1(evt) comme CurSelet(evt,1),  
CurSelet2(evt) comme CurSelet(evt,2)
et d'assigner CurSelet1 a la liste 1 , etc
]
- enfin, tu mets à jour la valeur de k comme le produit des (k_i)

Message cité 1 fois
Message édité par Rontgen le 19-01-2015 à 19:09:08
Reply

Marsh Posté le 19-01-2015 à 19:16:14    

Je vais m'y atteler. Merci. :o  
Mais déjà une première question.  
Mais pourquoi faut il une variable globale pour le produit ?  
Je comprends pas la nécessite de "global"  
Une Var=Produit des termes du vecteur contenant les k_i doit bien exister.

Reply

Marsh Posté le 19-01-2015 à 19:27:23    

Rontgen a écrit :

Probablement le plus facile serait de:
-  faire une variable globale qui est un tableau de taille n, qui va contenir chacun de tes (k_i)_i=1..n ainsi qu'une autre variable globale qui va contenir leur produit
- dans CurSelet, au lieu de ton k1, tu changes la valeur de k[i]


+1
 

Rontgen a écrit :

Une autre facon intermédiraire serait de passer l'indice en argument donc CurSelet(evt, i) et de definir  
CurSelet1(evt) comme CurSelet(evt,1),  
CurSelet2(evt) comme CurSelet(evt,2)
et d'assigner CurSelet1 a la liste 1 , etc


lambda evt: CurSelect(evt, 1)
lambda evt: CurSelect(evt, 2)
etc
[:turbocat:1]
 

phosphorylase a écrit :

Mais pourquoi faut il une variable globale pour le produit ?  
Je comprends pas la nécessite de "global"  
Une Var=Produit des termes du vecteur contenant les k_i doit bien exister.


oui, si tu t'en sers qu'à un endroit, le produit n'a pas besoin d'etre global.


---------------
I like work: it fascinates me. I can sit and look at it for hours.
Reply

Marsh Posté le 22-01-2015 à 23:10:48    

Nouveau jeu :)  
 
Il faut que je scroll ma fenêtre principale parce que widget sous tkinter s'empile mais j'ai plus de place :o
Il me faut absolument une scroll bar mais j'arrive pas à adapter un code :/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed