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 !!:ccool:
Version imprimable
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 !!:ccool:
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:
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:
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:>>> 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 :P.
Pourquoi ne pas proposer plus simple ?
Par exemple.Code:
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 ! :P )
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:
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:
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:
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...
@+