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 :

Problème avec fonction à deux variables


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Par défaut Problème avec fonction à deux variables
    Bonjour,

    je tente de faire une petite interface graphique pour un petit programme tout simple, mais je me heurt à un problème, une fonction à deux variable.

    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
    from tkinter import *
     
    def codage(ph, clé):
     
        alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéè0123456789,.;?!: " 
        ph_cod = ""
        pos_clé = -1
     
        for lettre in ph:
            pos_clé = (pos_clé +1)%len(clé)  # Position sur la clé
     
            décal = alpha.find(clé[pos_clé]) # décalage
     
            pos_alpha = alpha.find(lettre)
     
            nouv_pos =(pos_alpha+décal)%len(alpha)
     
            ph_cod = ph_cod + alpha[nouv_pos]
     
     
     
     
     
    menu = Tk()
     
    menu.title("CoD&Code")
     
    bonjour = Label(menu, text="Bienvenue sur CoD&Code")
    ph_tex = Label(menu,text="Entrer la phrase à coder :")
    ph = Entry(menu)
    clé_tex = Label(menu,text="Entrer la clé :")
    clé = Entry(menu)
     
    bonjour.grid(row=0, column=0)
    ph_tex.grid(row=1, column=0)
    ph.grid(row=1, column=1)
    clé_tex.grid(row=2, column=0)
    clé.grid(row=2, column=1)
     
    menu.mainloop()
    Je voulais utiliser la méthode qu'il y a dans ce tuto :
    http://python.developpez.com/cours/T...apitre8#L8.3.3

    Le problème c'est que j'ai deux variables ...

    J'ai tenter avec un button : button(menu, text="coder", command = codage(ph.get(), clé.get()))
    Mais ensuite, j'aimerais que ce button renvoie le résultat dans un label ...
    Bref, je n'arrive pas a récupérer le resultat de ma fonction ... Un peu d'aide serait la bienvenue.

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je n'utilise pas TK mais je pense que ce devrait être pareil, les entrées clavier sont captées par le widget qui a le focus.

    Ce qui veux dire que lors que tu entres une donnée dans une entry, c'est celle-ci qui captera aussi le Return et non pas l'autre.

    Pour le résultat de ta fonction que tu n'arrives pas à récupérer, tu sais que ta fonction ne retourne rien ?

    Autre chose, il n'y a pas erreur ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            pos_alpha = alpha.find(lettre)
    d'où vient le mot 'lettre' ? ce ne serait pas plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            pos_alpha = alpha.index(décal)

    Les caractères accentués dans les variables, ça ne se voit pas tous les jours ...

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 152
    Par défaut
    Une fonction à 2 variables peut-être utilisé en paramètre à l'aide de lambda

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button(menu, text="coder", command=lambda x=ph.get(), y=clé.get():codage(x, y))
    Mais bon Alex Martelli dit souvent que les callbacks avec tkinter sont sans argument "tkinter often uses no args"

    Question à se poser : Est-ce nécessaire?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Par défaut
    Merci d'avoir répondu.

    @VinsS : C'est vrai que les accents c'est pas forcement une bonne idée, mais chez moi, ça fonctionne.
    Sinon, il s'agit bien de lettre ( regarde la boucle for ).

    @fred

    Je vais tester ça merci.

  5. #5
    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
    Bonjour,

    Quelques notes:

    Attention avec les expressions lambda et command.
    Sous sa forme command=lambda x=ph.get(), y=clé.get():codage(x, y) les valeurs x y stockées dans command sons celles prises lors de la création, soit ''. Il n'y auras jamais de résultat.
    Pour avoir les textes des Entry lors de l’événement utilisez command=lambda:codage(ph.get(), cle.get()).
    Exemple (sans considération pour le code de codage):
    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
    from tkinter import *
     
     
    def codage(ph, cle):
        # sans doute à revoir
        alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéè0123456789,.;?!: " 
        ph_cod = ""
        pos_cle = -1
     
        for lettre in ph:
            pos_cle = (pos_cle +1)%len(cle)  # Position sur la cle
            décal = alpha.find(cle[pos_cle]) # décalage
            pos_alpha = alpha.find(lettre)
            nouv_pos =(pos_alpha+décal)%len(alpha)
            ph_cod = ph_cod + alpha[nouv_pos]
        # Affichage dans le Label result
        result.config(text=ph_cod)
     
     
    menu = Tk()
     
    menu.title("CoD&Code")
     
    bonjour = Label(menu, text="Bienvenue sur CoD&Code")
     
    result = Label(menu)
     
    ph_tex = Label(menu, text="Entrer la phrase à coder :")
    ph = Entry(menu)
    cle_tex = Label(menu, text="Entrer la clé :")
    cle = Entry(menu)
    bonjour.grid(row=0, column=0, columnspan=2, pady=5)
     
    # Label pour afficher le résultat
    result.grid(row=1, column=0, columnspan=2, pady=5)
     
    ph_tex.grid(row=2, column=0)
    ph.grid(row=2, column=1)
    cle_tex.grid(row=3, column=0)
    cle.grid(row=3, column=1)
     
    # Bouton pour le calcul
    calcul = Button(menu, text="Calcul", command=lambda:codage(ph.get(), cle.get()))
    calcul.grid(row=4, column=0, columnspan=2, pady=5)
     
    menu.mainloop()
    Maintenant si l'on prend en compte
    Citation Envoyé par fred1599 Voir le message
    Mais bon Alex Martelli dit souvent que les callbacks avec tkinter sont sans argument "tkinter often uses no args"
    le result.config(text=ph_cod) et le fait que la fonction ne sert qu'a cela.
    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
    from tkinter import *
     
     
    def codage():
        ph = ph_entry.get()
        cle = cle_entry.get()
        # sans doute à revoir
        alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéè0123456789,.;?!: " 
        ph_cod = ""
        pos_cle = -1
     
        for lettre in ph:
            pos_cle = (pos_cle +1)%len(cle)  # Position sur la cle
            décal = alpha.find(cle[pos_cle]) # décalage
            pos_alpha = alpha.find(lettre)
            nouv_pos =(pos_alpha+décal)%len(alpha)
            ph_cod = ph_cod + alpha[nouv_pos]
        # Affichage dans le Label result
        result.config(text=ph_cod)
     
     
    menu = Tk()
     
    menu.title("CoD&Code")
     
    bonjour = Label(menu, text="Bienvenue sur CoD&Code")
     
    result = Label(menu)
     
    ph_tex = Label(menu, text="Entrer la phrase à coder :")
    ph_entry = Entry(menu)
    cle_tex = Label(menu, text="Entrer la clé :")
    cle_entry = Entry(menu)
    bonjour.grid(row=0, column=0, columnspan=2, pady=5)
     
    # Label pour afficher le résultat
    result.grid(row=1, column=0, columnspan=2, pady=5)
     
    ph_tex.grid(row=2, column=0)
    ph_entry.grid(row=2, column=1)
    cle_tex.grid(row=3, column=0)
    cle_entry.grid(row=3, column=1)
     
    # Bouton pour le calcul
    calcul = Button(menu, text="Calcul", command=codage)
    calcul.grid(row=4, column=0, columnspan=2, pady=5)
     
    menu.mainloop()
    Vous remarquerez ph > ph_entry, cle > cle_entry pour différencier les variables des noms des Widgets.
    La fonction codage ayant accès aux Entry via son espace de nom global les arguments son ici inutiles.
    Les arguments et lambda n’ont d’intérêt que si l'on utilise la même fonction codage pour plusieurs traitements (entre autre, voir les binds plus bas).
    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
    51
    52
    53
    54
    55
    56
    from tkinter import *
     
     
    def codage(ph, cle):
        # sans doute à revoir
        alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéè0123456789,.;?!: " 
        ph_cod = ""
        pos_cle = -1
     
        for lettre in ph:
            pos_cle = (pos_cle +1)%len(cle)  # Position sur la cle
            décal = alpha.find(cle[pos_cle]) # décalage
            pos_alpha = alpha.find(lettre)
            nouv_pos =(pos_alpha+décal)%len(alpha)
            ph_cod = ph_cod + alpha[nouv_pos]
        # Affichage dans le Label result
        result.config(text=ph_cod)
     
     
    menu = Tk()
     
    menu.title("CoD&Code")
     
    bonjour = Label(menu, text="Bienvenue sur CoD&Code")
     
    result = Label(menu)
     
    ph_tex = Label(menu, text="Entrer la phrase à coder :")
    ph = Entry(menu)
     
    ph1 = Entry(menu)
     
    cle_tex = Label(menu, text="Entrer la clé :")
    cle = Entry(menu)
     
    cle1 = Entry(menu)
     
    bonjour.grid(row=0, column=0, columnspan=2, pady=5)
     
    # Label pour afficher le résultat
    result.grid(row=1, column=0, columnspan=2, pady=5)
     
    ph_tex.grid(row=2, column=0)
    ph.grid(row=2, column=1)
    ph1.grid(row=2, column=2)
    cle_tex.grid(row=3, column=0)
    cle.grid(row=3, column=1)
    cle1.grid(row=3, column=2)
     
    # Bouton pour le calcul
    calcul = Button(menu, text="Calcul1", command=lambda: codage(ph.get(), cle.get()))
    calcul.grid(row=4, column=0, pady=5)
    calcul = Button(menu, text="Calcul2", command=lambda: codage(ph1.get(), cle1.get()))
    calcul.grid(row=4, column=1, pady=5)
     
    menu.mainloop()
    Maintenant pour ce qui est du focus:
    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
    51
    52
    53
    54
    from tkinter import *
     
     
    def codage():
        ph = ph_entry.get()
        cle = cle_entry.get()
        # sans doute à revoir
        alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéè0123456789,.;?!: " 
        ph_cod = ""
        pos_cle = -1
     
        for lettre in ph:
            pos_cle = (pos_cle +1)%len(cle)  # Position sur la cle
            décal = alpha.find(cle[pos_cle]) # décalage
            pos_alpha = alpha.find(lettre)
            nouv_pos =(pos_alpha+décal)%len(alpha)
            ph_cod = ph_cod + alpha[nouv_pos]
        # Affichage dans le Label result
        result.config(text=ph_cod)
     
     
    menu = Tk()
     
    menu.title("CoD&Code")
     
    bonjour = Label(menu, text="Bienvenue sur CoD&Code")
     
    result = Label(menu)
     
    ph_tex = Label(menu, text="Entrer la phrase à coder :")
    ph_entry = Entry(menu)
    cle_tex = Label(menu, text="Entrer la clé :")
    cle_entry = Entry(menu)
    bonjour.grid(row=0, column=0, columnspan=2, pady=5)
     
    # Label pour afficher le résultat
    result.grid(row=1, column=0, columnspan=2, pady=5)
     
    ph_tex.grid(row=2, column=0)
    ph_entry.grid(row=2, column=1)
    cle_tex.grid(row=3, column=0)
    cle_entry.grid(row=3, column=1)
     
    # binds des Entry
    ph_entry.bind("<Return>", lambda event: cle_entry.focus_set())
    # <KP_Enter> > Pavé numérique
    ph_entry.bind("<KP_Enter>", lambda event: cle_entry.focus_set())
    cle_entry.bind("<Return>", lambda event: codage())
    # <KP_Enter> > Pavé numérique
    cle_entry.bind("<KP_Enter>", lambda event: codage())
    # On donne le focus
    ph_entry.focus_set()
     
    menu.mainloop()
    Vous remarquerez ici l'utilisation de lambda pour ne pas envoyer l'event du bind à cle_entry.focus_set() et codage.
    Une variante:
    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
    51
    52
    53
    54
    from tkinter import *
     
     
    def codage(event):
        ph = ph_entry.get()
        cle = cle_entry.get()
        # sans doute à revoir
        alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéè0123456789,.;?!: " 
        ph_cod = ""
        pos_cle = -1
     
        for lettre in ph:
            pos_cle = (pos_cle +1)%len(cle)  # Position sur la cle
            décal = alpha.find(cle[pos_cle]) # décalage
            pos_alpha = alpha.find(lettre)
            nouv_pos =(pos_alpha+décal)%len(alpha)
            ph_cod = ph_cod + alpha[nouv_pos]
        # Affichage dans le Label result
        result.config(text=ph_cod)
     
     
    menu = Tk()
     
    menu.title("CoD&Code")
     
    bonjour = Label(menu, text="Bienvenue sur CoD&Code")
     
    result = Label(menu)
     
    ph_tex = Label(menu, text="Entrer la phrase à coder :")
    ph_entry = Entry(menu)
    cle_tex = Label(menu, text="Entrer la clé :")
    cle_entry = Entry(menu)
    bonjour.grid(row=0, column=0, columnspan=2, pady=5)
     
    # Label pour afficher le résultat
    result.grid(row=1, column=0, columnspan=2, pady=5)
     
    ph_tex.grid(row=2, column=0)
    ph_entry.grid(row=2, column=1)
    cle_tex.grid(row=3, column=0)
    cle_entry.grid(row=3, column=1)
     
    # binds des Entry
    ph_entry.bind("<Return>", lambda event: cle_entry.focus_set())
    # <KP_Enter> > Pavé numérique
    ph_entry.bind("<KP_Enter>", lambda event: cle_entry.focus_set())
    cle_entry.bind("<Return>", codage)
    # <KP_Enter> > Pavé numérique
    cle_entry.bind("<KP_Enter>", codage)
    # On donne le focus
    ph_entry.focus_set()
     
    menu.mainloop()
    Je pense que c'est tout donc : y'apuqua

    @+

  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
    Bonjour Romz34,

    En complément vous pouvez lire "Pour aller plus loin" et "Pour aller plus loin 2" ici.

    @+

Discussions similaires

  1. Problème avec fonctions et string/char
    Par vdumont dans le forum C++
    Réponses: 6
    Dernier message: 08/04/2006, 16h54
  2. Problème avec fonction
    Par Goundy dans le forum C
    Réponses: 24
    Dernier message: 01/10/2005, 20h17
  3. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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