Bonjour,
tout nouveau en python, je recherche un moyen de limiter le nombre de clic sur un bouton (associé à une fonction) à un certain nombre...
Merci !!![]()
Bonjour,
tout nouveau en python, je recherche un moyen de limiter le nombre de clic sur un bouton (associé à une fonction) à un certain nombre...
Merci !!![]()
Salut,
On commence par fabriquer un button puis une fonction:
Puis on fabrique la chose qui va limiter le nombre d'appels a la fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 >>> import tkinter as tk >>> app = tk.Tk() >>> btn = tk.Button(text='click') >>> btn.pack() >>> def myfunc(): ... print ('myfunc')
Et on colle le tout dans le button:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 >>> def limit_calls(button, count, func): ... def wraps(): ... nonlocal count ... if count > 0: ... try: ... func() ... finally: ... pass ... count -= 1 ... if count == 0: ... button['state']='disabled' ... return wraps ...
Fastoche, non?!?
Code : Sélectionner tout - Visualiser dans une fenêtre à part >>> btn['command']=limit_calls(btn, 3, myfunc)
Effectivement si vous débutez ça décoiffe... Mais les tutos sont la pour proposer une découverte de Python un peu moins pentue.
- W
Belle pente pour un débutant en effet, limite piste noire.
Pourquoi ne pas proposer plus simple ?
Par exemple.
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 import tkinter as tk def btncmd(l=[0]): if l[0] < 5: l[0] += 1 lab['text'] = l[0] else: btn['state'] = 'disabled' app = tk.Tk() lab = tk.Label() lab.pack() btn = tk.Button(text='click', command=btncmd) btn.pack() app.mainloop()
@+
Merci beaucoup pour vos réponses ! En effet la deuxième technique me semble plus simple !! (au moins je l'ai comprise, et elle marche parfaitement !)
Merci encore !
Meilleurs voeux PauseKawa.
Gérer le décompte via un mutable comme paramètre par défaut?
Vous faites dans le toxique!
Quitte a tout mettre en globals, pourquoi ne pas écrire:
A partir de la paramétrer "count" n'est pas si complique:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 count = 5 def btncmd(): global count count -= 1 if count <= 0: btn['state'] = 'disabled'
Et cette mécanique est extensible pour passer aussi fonction et button en paramètres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 def btncmd(count = 5): def wraps(): nonlocal count count -= 1 if count <= 0: btn['state'] = 'disabled' return wraps
Un style plus OO serait de s/classer Button:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class Button(tk.Button): def __init__(self, master=None, count=5, _kwargs=None, **kwds): super().__init__(master, _kwargs, **kwds) self._count = count self.bind('<1>', self._on_click) def _on_click(self, event): self._count -= 1 if not self._count: self['state'] = 'disabled'
Le seul élément technique est button['state'] = 'disabled'.
Le reste n'est qu'emballage du décompte avec des constructions de bases du langage. Prenez n'importe quel tuto, tkinter n'est aborde qu’après de nombreux chapitres permettant de les acquérir. Le PO ne sait peut être pas les mettre en œuvre mais il doit pouvoir les lire et les comprendre avant d'aborder Tk.
Et pourquoi pas fourguer des raviolis a la viande de cheval tant qu'on y est? Tant que personne ne regarde... çà fonctionne.
- W
Bonsoir et meilleurs vœux wiztricks,
'répondre et mettre de la réflexion'... : Cela viens de vous.
L'utilisation d'une variable globale est la solution de 'base', surtout dans le cadre d'un code 'simple' (uniquement des fonctions) basé sur tkinter. A retenir pour le PO puisque vous la donnez, a voir sur la compréhension des espaces de nom.
La réponse avec un mutable apporte un plus au niveau réflexion/compréhension, non ? Toxique ? Sans doutes mais amène une réflexion pour le PO... : 'Comment cela fonctionne' ?
Les autres propositions ne correspondent pas à un 'débutant'. A lui de les relire après coup.
Note: Je préfère cette dernière réponse à celle d'avant avec un beau try au millieu...
@+
Partager