bonjour je voudrais créer un programme qui augmente la valeur d'une variable "y" lorsque la touche up, et pressé et que sa valeur diminue lorsque la touche down et pressé. J'ai essayer de regarder la F.A.Q je ne comprend pas merci
Version imprimable
bonjour je voudrais créer un programme qui augmente la valeur d'une variable "y" lorsque la touche up, et pressé et que sa valeur diminue lorsque la touche down et pressé. J'ai essayer de regarder la F.A.Q je ne comprend pas merci
Bonjour,
Je t'ai fait un petit code très simplifié qui fait ce que tu souhaites:
TyrtamosCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #!/usr/bin/python # -*- coding: utf-8 -*- import Tkinter # variable globale dont on va changer la valeur y=0 class Application(Tkinter.Frame): def __init__(self, master=None): global y Tkinter.Frame.__init__(self, master) self.grid() # création du label qui affiche la valeur de y self.affichey=Tkinter.Label(self, background="yellow", text=y) self.affichey.grid(row=0,column=0, sticky="we", padx=3, pady=3) # création du bouton "up" self.ajoute=Tkinter.Button(self, text="Up", background="light blue", activebackground="red", command=self.ajoutey) self.ajoute.grid(row=1, column=0, sticky="we", padx=3, pady=3) # création du bouton "down" self.retranche=Tkinter.Button(self, text="Down", background="light blue", activebackground="red", command=self.retranchey) self.retranche.grid(row=2, column=0, sticky="we", padx=3, pady=3) # méthode qui va incrémenter y et va afficher son résultat def ajoutey(self): global y y += 1 self.affichey.configure(text=y) # méthode qui va décrémenter y et va afficher son résultat def retranchey(self): global y y -= 1 self.affichey.configure(text=y) if __name__ == "__main__": fen=Tkinter.Tk() fen.title("Mon programme") app=Application(fen) fen.mainloop()
Mais je crois que stuffy voulait que sa variable soit incrémentée ou décrémentée lorsqu'il appuie sur la touche up ou down, pas quand il appuie sur un bouton (j'avoue ca ne change pas grand chose sauf si c'est pour programmer un jeu par exemple..).
Je propose de reprendre ton code mais au lieu de mettre les boutons, écrire
Code:
1
2
3 affichey.bind('<Up>',ajoutey) affichey.bind('<Down>',retranchey)
Bonjour KindPlayer,
Tu as entièrement raison: j'avais compris "bouton" et pas "touche clavier".
Ta correction est bonne, mais il faut utiliser bind_all, sinon, ça ne marche que pour les widgets qui ont le focus. Et comme le label ne l'aura pas... Cela donnera:
Voilà mon petit programme corrigé (j'ai laissé les boutons!):Code:
1
2
3 self.bind_all('<Up>',self.ajoutey) self.bind_all('<Down>',self.retranchey)
TyrtamosCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 #!/usr/bin/python # -*- coding: utf-8 -*- import Tkinter # variable globale dont on va changer la valeur y=0 class Application(Tkinter.Frame): def __init__(self, master=None): global y Tkinter.Frame.__init__(self, master) self.grid() # création du label qui affiche la valeur de y self.affichey=Tkinter.Label(self, background="yellow", text=y) self.affichey.grid(row=0,column=0, sticky="we", padx=3, pady=3) # création du bouton "up" self.ajoute=Tkinter.Button(self, text="Up", background="light blue", activebackground="red", command=self.ajoutey) self.ajoute.grid(row=1, column=0, sticky="we", padx=3, pady=3) # création du bouton "down" self.retranche=Tkinter.Button(self, text="Down", background="light blue", activebackground="red", command=self.retranchey) self.retranche.grid(row=2, column=0, sticky="we", padx=3, pady=3) # pour que les touches clavier Up et Down fasse la même chose que les boutons self.bind_all('<Up>',self.ajoutey) self.bind_all('<Down>',self.retranchey) # méthode qui va incrémenter y et va afficher son résultat def ajoutey(self, event=None): global y y += 1 self.affichey.configure(text=y) # méthode qui va décrémenter y et va afficher son résultat def retranchey(self, event=None): global y y -= 1 self.affichey.configure(text=y) if __name__ == "__main__": fen=Tkinter.Tk() fen.title("Mon programme") app=Application(fen) fen.mainloop()
je connaissais pas bind_all. Je remarque que j'avais aussi oublié les "self" (sont-ils nécessaires d'ailleurs puisqu'on est à l'interieur de la classe?).
Les self sont nécessaires parce que ... si on les oublie, ça ne marche plus :D
Si on essaye d'appeler ajoutey au lieu de self.ajoutey, Python cherche une fonction globale appelée "ajoutey" qu'il ne trouve pas. En fait, self représente l'adresse de l'instance de classe qui référence les objets qui en font partie.
De même, self.bind_all() affecte la liaison bind à l'instance de la classe Application. Et c'est bien ce qu'on veut ici pour que ça marche quelque soit le widget qui a le focus.
Enfin, si on veut s'adresser à la fenêtre, en étant à l'intérieur de la classe Application, on utilise self.master pour "remonter" dans l'arbre des objets graphiques. Par exemple: self.master.title("Mon programme").
d'ailleurs j'ai dit une énormité. C'est bien parce que on est a l'interieur de la classe qu'on met des self, sinon ils n'auraient pas de sens. Des fois j'oublie de réfléchir.:?
merci a tous vous m'avais bien aider et kindplayer a bien comprit ce que je voulais faire. :king:
Voila avec tous vos code je me suis dit qu'il était un peu charger alors j'ai décidé de faire un peut de rangement je suppose que ma technique a de gros défaut mais je suis débutant et je les connait pas alors si vous pouviez me les indiqué ce serai gentil merci (trouvez vous pas que cela est moin chargé et plus lisible) .
De plus je ne comprend pas pourquoi le bind_all est associé a la variable du Label et a quoi sert les arguments event=none et franchement je ne trouve pas que ce soit bon d'apprendre des chose sans les comprendre merci d'avance.
code :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 # -*- coding: Latin-1 -*- from Tkinter import* # ===> SCRIPT VISUEL <=== # # --- Etablissement de la variable --- # position = 0 # --- Etablissement des fonctions --- # def augmenter(event=None): global position position = position + 1 coord.configure(text = position) def diminuer(event=None): global position position = position - 1 coord.configure(text = position) # ===> SCRIPT VISUEL <=== # fenetre = Tk() # --- Edition du label --- # coord = Label(fenetre) coord.configure(text = position) coord.pack() # --- Récupération de l'appui des touches "up" et "down" --- # coord.bind_all('<Up>',augmenter) coord.bind_all('<Down>',diminuer) fenetre.mainloop()
bind_all c'est pour que l'évenement soit associé à toute l'application, et donc que ton label et ta variable soient mis à jour lorsque tu appuies sur la touche haut ou bas, même si c'est un autre widget qui a le focus. event=none signifie que ta méthode n'est associée à aucun evenement en particulier. C'est bien de simplifier le code mais je te conseille néanmoins de laisser ton appli enveloppée au sein d'une classe comme l'a fait tyrtamos.
D'accord a l'avenir j'encapsulerais l'appli dans une class mais une derniere question m'a question pour le bind_all était pourquoi il est associé a la variable "coord" et non pas a une nouvelle variable nommé par exemple "recupération"
Code:
1
2
3
4
5
6
7
8
9
10 coord = Label(fenetre) coord.configure(text = position) coord.pack() # --- Récupération de l'appui des touches "up" et "down" --- # coord.bind_all('<Up>',augmenter) coord.bind_all('<Down>',diminuer)
Juste un petit mot concernant event=None.
Cela fait partie de la programmation par évènement.
Quand la fenêtre est affichée (on est dans fen.mainloop()), elle ne fait qu'une seule chose: elle attend qu'il se passe quelque chose: un évènement (une touche de clavier, un clic de souris, un signal réseau, etc...). Chaque évènement est traité par une méthode (=une fonction de la classe). Quand l'évènement appelle la méthode pour traiter l'évènement, on peut souvent récupérer le type d'évènement avec le paramètre "event" pour affiner le traitement.
Mais certains évènements demande la présence du paramètre "event", et d'autre ne la réclame pas. J'ai donc pris comme habitude d'utiliser le paramètre "event=None" qui marche dans tous les cas.
Un chaleureux conseil: traite chaque fenêtre dans une classe, et mets toutes les méthodes de traitement d'évènement dans cette classe. Cela complique un peu les exemples très simples, mais cela simplifie et rend le code plus clair et plus robuste dès que tu fais de vraies applications.
Tyrtamos