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 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:
Tyrtamos
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 self.bind_all('<Up>',self.ajoutey) self.bind_all('<Down>',self.retranchey)
Tyrtamos
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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").
Partager