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

Python Discussion :

Fonctionnement Tk.Button - Exécution command


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 11
    Par défaut Fonctionnement Tk.Button - Exécution command
    Bonjour à tous,

    Je suis débutant avec Python (j'ai commencé ce matin...), et je ne parviens pas à vraiment comprendre le fonctionnement de Button et le moment où il déclenche l'action.

    J'ai fait un code très basique : une fenêtre avec un champs variable, un bouton, et quand on clique sur le bouton je m'attends à ce que la valeur de la variable soit affichée dans la console.

    Voici le code :
    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
    import tkinter as Tk
     
    #Fct : reception de la variable et ecriture dans la console
    def ecrire(num):
        print (num)
     
    #def fenetre
    window = Tk.Tk()
    window.title("Mon app")
    window.geometry("400x400")
     
    #def label
    hello = Tk.Label(window, text="Passage de variable sur click")
    hello.pack()
     
    #def frame (juste pour faire joli)
    frame = Tk.Frame(window, width=400, height=25)
    frame.pack()
     
    #def champs variable
    mois = Tk.Entry(window)
    mois.pack()
     
    #def frame (juste pour faire joli)
    frame = Tk.Frame(window, width=400, height=25)
    frame.pack()
     
    #def button
    button = Tk.Button(window, text="cliquez", command = ecrire(mois))
    button.pack()
     
    window.mainloop()
    Ce qu'il se passe :
    1. dans cette configuration : rien!
    2. si dans la fonction je remplace le
    par
    à l'exécution du code il imprime directement dans la console "ma variable" puis ouvre la fenêtre et plus rien ne se passe.

    Le but est bien d'envoyer une variable à une fonction une fois que l'on a cliqué sur le bouton.

    Pourriez-vous m'éclairer sur le sujet?

    Merci,

    David.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Ecrire Tk.Button(..., command = ecrire(mois)) exécute la fonction écrire à l'exécution de l'instruction pour assigner le retour de la fonction comme fonction de rappel (qui sera appelée lorsqu'on clique sur le Button). Ce retour étant None ça ne va pas faire grand chose.

    On peut écrire un truc comme:
    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
    import tkinter as Tk
     
    #Fct : reception de la variable et ecriture dans la console
    def ecrire():
        print (mois.get())
     
    #def fenetre
    window = Tk.Tk()
    window.title("Mon app")
    window.geometry("400x400")
     
    #def label
    hello = Tk.Label(window, text="Passage de variable sur click")
    hello.pack()
     
    #def frame (juste pour faire joli)
    frame = Tk.Frame(window, width=400, height=25)
    frame.pack()
     
    #def champs variable
    mois = Tk.Entry(window)
    mois.pack()
     
    #def frame (juste pour faire joli)
    frame = Tk.Frame(window, width=400, height=25)
    frame.pack()
     
    #def button
    button = Tk.Button(window, text="cliquez", command = ecrire)
    button.pack()
     
    window.mainloop()
    Pour le reste, vosu êtes supposé connaître les bases de Python (fonctions, portées des variables,...) avant de vous attaquer à tkinter... Ce qui suppose passer pas mal de temps dans des tutos et faire des exercices pour "comprendre" et savoir faire. Impossible d'y arriver en une matinée! Et si vous ne voulez pas vous donner plus de moyens pas la peine d'avoir l'ambition de programmer (embaucher un programmer qui fera le boulot à votre place? Trouver un autre passe-temps? Qu'est ce qui vous oblige à "programmer"?).

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

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 539
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 539
    Par défaut
    Quand on demande la bonne chose (utton command with arguments) à son moteur de recherche préféré, on tombe sur des réponses:
    https://www.tutorialspoint.com/passi...button-command
    bref, on peut passer par une fonction lambda

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button = Tk.Button(window, text="cliquez", command = lambda:ecrire(mois.get())

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par umfred Voir le message
    Quand on demande la bonne chose (utton command with arguments) à son moteur de recherche préféré, on tombe sur des réponses
    Pour demander "la bonne chose", il faut avoir une petite idée de ce à quoi elle peut ressembler. Pas facile lorsqu'on découvre "fonction", "portée des variables", ... qu'on découvre fonction de rappel (callback) d'aller imaginer closure ou fonctions anonymes.

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

  5. #5
    Membre averti
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 11
    Par défaut
    Hello wiztricks,

    Merci d'avoir pris le temps de me répondre.

    Effectivement, cela manque un peu de contexte :

    Je dois récupérer des informations d'énergie auprès du gestionnaire de réseau électrique.
    Historiquement, il mettait à disposition ses informations en format .csv sur leur site, le récupérer au moyen d'une connexion à une base de données externe sous Excel et un petit peu de bidouillage sous VBA et l'affaire était dans le sac.
    Aujourd'hui, ils ont changé leur méthode et cela nécessite un script Python pour récupérer les informations. Script qu'ils m'ont aimablement fourni (je suis incapable de "pondre" un code Python avec mes connaissances actuelles, bien évidemment!).
    Seulement voilà, c'est un peu brut de fonderie et j'aurai voulu une petite interface graphique pour encoder les paramètres à passer au script (le mois et l'année), pour que cela soit plus user-friendly.
    Après quelques recherches sur le Web, faire une GUI sous Python ne "semble" pas être hors de portée. C'est pourquoi j'ai fait quelques tests, et on obtient un résultat +/- satisfaisant en quelques lignes de code.
    Je m'attendais à une exécution événementielle lors du click sur le bouton, mais ce n'est pas le cas. D'où ma question.

    Merci pour les infos, je vais gratter de ce côté.

    Cdt,

    David.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par david.kaczmarek Voir le message
    faire une GUI sous Python ne "semble" pas être hors de portée.
    La programmation est une invention humaine. Tout a été construit de façon intelligible et rien n'est hors de portée.

    Citation Envoyé par david.kaczmarek Voir le message
    C'est pourquoi j'ai fait quelques tests, et on obtient un résultat +/- satisfaisant en quelques lignes de code.
    ça affiche des trucs d'autant plus facilement qu'on récupèrera des codes déjà tout faits sur Internet. Problème lorsqu'on veut modifier pour adapter, ilva falloir ouvrir le capot et mettre les mains dans le cambouis.


    Citation Envoyé par david.kaczmarek Voir le message
    Je m'attendais à une exécution événementielle lors du click sur le bouton, mais ce n'est pas le cas.
    Avec Python une variable est associé à un objet. Et un nom de variable suivi de parenthèses, crochets,... traduit une méthode qu'on applique à cet objet.
    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
    >>> a = None
    >>> a()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
        a()
        ~^^
    TypeError: 'NoneType' object is not callable
    
    >>> a[1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
        a[1]
        ~^^^
    TypeError: 'NoneType' object is not subscriptable
    >>>
    Et si Python peut exécuter cela sans erreur, il ne dira pas "hey toto t'es sur que tu n'a pas écrit n'importe quoi?" pour (peut être) se vautrer des dizaines d'instructions plus tard pour une raison qui sera sans rapport avec l'erreur initiale (et donc difficile à trouver).

    A vous de voir.

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

  7. #7
    Membre averti
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 11
    Par défaut
    Citation Envoyé par umfred Voir le message
    Quand on demande la bonne chose (utton command with arguments) à son moteur de recherche préféré, on tombe sur des réponses:
    https://www.tutorialspoint.com/passi...button-command
    bref, on peut passer par une fonction lambda

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button = Tk.Button(window, text="cliquez", command = lambda:ecrire(mois.get())
    Bonjour Umfred,

    Merci d'avoir pris le temps de me répondre.

    Je vais y jeter un oeil et tenter de comprendre ce qu'ils font dans leur exemple.

    Cdt,

    David.

Discussions similaires

  1. Code qui ne fonctionne qu'avec un command button
    Par Usgpa dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/07/2010, 15h56
  2. [ODBC] Connection fonctionne avec ligne de commande mais pas sur site
    Par maxeur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/03/2010, 14h33
  3. [Carte mère] fonctionnement mémoire, bus de commande et rôles de composants matériels
    Par new_wave dans le forum Composants
    Réponses: 0
    Dernier message: 15/03/2010, 19h11
  4. Réponses: 2
    Dernier message: 18/06/2008, 07h14
  5. focus sur button de commande
    Par hebh dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 14/05/2008, 10h52

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