IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Limiter une fonction


Sujet :

Tkinter Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Par défaut Limiter une fonction
    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 !!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 718
    Par défaut
    Salut,

    On commence par fabriquer un button puis une 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')
    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
    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
    ...
    Et on colle le tout dans le button:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> btn['command']=limit_calls(btn, 3, myfunc)
    Fastoche, non?!?
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Belle pente pour un débutant en effet, limite piste noire .
    Pourquoi ne pas proposer plus simple ?
    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()
    Par exemple.

    @+

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Par défaut
    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 !

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 718
    Par défaut
    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:
    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'
    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
    7
    def btncmd(count = 5):
          def wraps():
                nonlocal count
                count -= 1
                if count <= 0:
                      btn['state'] = 'disabled'
          return wraps
    Et cette mécanique est extensible pour passer aussi fonction et button en paramètres.

    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'

    Citation Envoyé par PauseKawa Voir le message
    Pourquoi ne pas proposer plus simple ?
    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.

    Citation Envoyé par pepearl Voir le message
    En effet la deuxième technique me semble plus simple !! (au moins je l'ai comprise, et elle marche parfaitement ! )
    Et pourquoi pas fourguer des raviolis a la viande de cheval tant qu'on y est? Tant que personne ne regarde... çà fonctionne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    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...

    @+

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/05/2008, 23h36
  2. Limiter une fonction dans le temp
    Par selfae dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2008, 14h15
  3. Réponses: 3
    Dernier message: 13/02/2008, 10h10
  4. Impossible de limiter friend à une fonction
    Par NicolasJolet dans le forum C++
    Réponses: 15
    Dernier message: 03/08/2006, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo