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 :

Soucis avec Tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut Soucis avec Tkinter
    Bonjour à tous, j'ai un travail à rendre en Python et je galère avec Tkinter. J'ai mis au point un convertisseur de température, mais je n'arrive pas à lier le fait de cliquer sur un bouton et la conversion.

    En fait, il faut rentrer une valeur, cliquer sur le bouton, et donner la réponse dans une autre fenêtre. Seulement, j'ai eu beau chercher sur plusieurs forums, je n'arrive pas à créer une nouvelle fenêtre...

    Voici les lignes de 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    # -*- coding: cp1252 -*-
    from Tkinter import*
     
    # Création de la fenêtre
     
    F = Tk()
    w = Frame(F, height=500, width=500)
     
    # Affichage de la fenêtre
     
    w.pack()
     
    ## Programme Principal ##
    # Convertion de Celsius en Fahrenheit
    def CelToFah(celsius) :
        reponse= 9./5.*celsius+32
        text3.config(text=reponse)
        return reponse
     
    ##################################
    # Convertion de Celsius en Kelvin
    def CelToKel(celsius) :
        kelvin= celsius+273.15
        return kelvin
     
    ######################################
    # Convertion de Fahrenheit en Celsius
    def FahToCel(fahrenheit) :
        celsius= 5./9.*(fahrenheit-32)
        return celsius
     
    ##################################
    # Convertion de Kelvin en Celsius
    def KelToCel(kelvin) :
        celsius= kelvin-273.15
        return celsius
     
    ##################################
    # Convertion de Fahrenheit en Kelvin
    def FahToKel(fahrenheit) :
        kelvin= 5./9.*(fahrenheit+459.67)
        return kelvin
     
    ##################################
    # Convertion de Kelvin en Fahrenheit
    def KelToFah(kelvin) :
        fahrenheit= 9./5.*(kelvin-459.67)
        return fahrenheit
     
    # Création de boutons
     
    quitBouton = Button(F, text='Quitter', anchor=SE, command=F.quit)
    quitBouton.pack(side=BOTTOM, anchor=SE)
    Bouton1 = Button(F, text='CelToFah', anchor=SE, command=CelToFah)
    Bouton1.pack(side=BOTTOM, anchor=SW)
    Bouton2 = Button(F, text='CelToKel', anchor=SW, command=CelToKel)
    Bouton2.pack(side=BOTTOM, anchor=SW)
    Bouton3 = Button(F, text='KelToFah', anchor=SW, command=KelToFah)
    Bouton3.pack(side=BOTTOM, anchor=SW)
    Bouton4 = Button(F, text='KelToCel', anchor=SW, command=KelToCel)
    Bouton4.pack(side=BOTTOM, anchor=SW)
    Bouton5 = Button(F, text='FahToCel', anchor=SW, command=FahToCel)
    Bouton5.pack(side=BOTTOM, anchor=SW)
    Bouton6 = Button(F, text='FahToKel', anchor=SW, command=FahToKel)
    Bouton6.pack(side=BOTTOM, anchor=SW)
     
    # Création du texte d'entête
     
    texte1=Label(w,text="Convertisseur température")
    texte1.pack()
     
    # Création de l'entrée
     
    texte2 = Label(w, text = 'Entrez la Temperature :', anchor=SW)
    entree = Entry(w)
    texte2.pack(anchor=SW)
    entree.pack(anchor=SW)
     
     
    w.mainloop()

  2. #2
    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,

    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
    from Tkinter import *
     
    def CelToFah(celsius) :
        reponse= 9./5.*int(celsius)+32
        texte1.config(text=reponse)
        return reponse
     
    F = Tk()
    w = Frame(F, height=500, width=500)
    w.pack()
     
    Button(F, text='CelToFah', command=lambda: CelToFah(entree.get())).pack()
    Button(F, text='Quitter', command=F.quit).pack()
    texte1 = Label(w,text="Convertisseur température")
    texte1.pack()
    Label(w, text = 'Entrez la Temperature :').pack()
    entree = Entry(w)
    entree.pack()
     
    F.mainloop()
    @+

  3. #3
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Il y a 2 alternatives:
    Créer une fenetre Toplevel qui apparaitra et affichera la réponse soit céer une fenetre résultat dans ton interface graphique:
    Pour la solution toplevel #il faut que tes fonctions crées la toplevel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    from Tkinter import *
    def CelToFah(celsius) :
        global F
        reponse= 9./5.*int(celsius)+32
        texte1.config(text=reponse)
        conteneur=Toplevel(F)
        resultat= Label(conteneur, text=str(reponse)).pack()
    Pour la fenetre intéger il suffit que tes fonctions configure celle-çi #comme l'a dit PauseKawa.

    Bonne chance pour ton travail a rendre Morsounet et pout ton travail tout court car d'autres non pas la chance d'apprendre l'informatique a l'école, ce qui n'as presque rien a voir avec la chance je l'avoue mais bon suit ton destin et bonne continuation.

  4. #4
    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
    Citation Envoyé par Morsounet Voir le message
    et donner la réponse dans une autre fenêtre
    J'avais louper ce passage (merci Luke spywoker).
    Effectivement si vous devez afficher ceci dans une autre fenêtre vous devez utiliser un Toplevel. A retenir : Ne jamais avoir deux instances Tk().

    On ne peux pas décemment passer à coter de lambda avec le command des widgets.
    si vous écrivez command=CelToFah(entree.get()) command est exécuté à la création du widget du fait qu'il y a un argument.
    Par contre avec command=lambda: CelToFah(entree.get()) il n'est exécuté qu'au moment de l'event, ce qui est demandé.

    Vous pouvez n'utiliser qu'un seule fonction pour afficher votre Toplevel et lui passer les arguments de votre choix.
    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
    57
    58
    59
    60
    61
    62
    63
     
    #!/usr/bin/env python
    # -*- coding: cp1252 -*-
    #
    #
    from Tkinter import *
     
    def affiche(titre, reponse):
        # Attention : Bonus sans doute inutile.
        # Permet de n'afficher qu'un seul Toplevel
        # avec un destroy des précédents.
        for widget in F.winfo_children():
            if isinstance(widget, Toplevel):
                widget.destroy()
        ####################################
        conteneur = Toplevel(F)
        conteneur.title('Résultat')
        Label(conteneur, text=titre).pack()
        Label(conteneur, text='Résultat: ' + str(reponse)).pack()
        Button(conteneur, text='Ok', command=conteneur.destroy).pack(padx=5, pady=5)
     
    def CelToFah(celsius) :
        reponse = 9./5.*int(celsius)+32
        affiche('Convertion de Celsius en Fahrenheit', reponse)
     
    def CelToKel(celsius) :
        kelvin = int(celsius)+273.15
        affiche('Convertion de Celsius en Kelvin', kelvin)
     
    def FahToCel(fahrenheit) :
        celsius = 5./9.*(int(fahrenheit)-32)
        affiche('Convertion de Fahrenheit en Celsius', celsius)
     
    def KelToCel(kelvin) :
        celsius = int(kelvin)-273.15
        affiche('Convertion de Kelvin en Celsius', celsius)
     
    def FahToKel(fahrenheit) :
        kelvin = 5./9.*(int(fahrenheit)+459.67)
        affiche('Convertion de Fahrenheit en Kelvin', kelvin)
     
    def KelToFah(kelvin) :
        fahrenheit = 9./5.*(int(kelvin)-459.67)
        affiche('Convertion de Kelvin en Fahrenheit', fahrenheit)
     
    F = Tk()
    w = Frame(F, height=500, width=500)
    w.pack()
     
    Button(F, text='Quitter', anchor=SE, command=F.quit).pack(side=BOTTOM, anchor=SE)
    Button(F, text='CelToFah', anchor=SE, command=lambda: CelToFah(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='CelToKel', anchor=SW, command=lambda: CelToKel(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='KelToFah', anchor=SW, command=lambda: KelToFah(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='KelToCel', anchor=SW, command=lambda: KelToCel(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='FahToCel', anchor=SW, command=lambda: FahToCel(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='FahToKel', anchor=SW, command=lambda: FahToKel(entree.get())).pack(side=BOTTOM, anchor=SW)
     
    Label(w,text="Convertisseur température").pack()
    Label(w, text = 'Entrez la Temperature :', anchor=SW).pack(anchor=SW)
    entree = Entry(w)
    entree.pack(anchor=SW)
     
    F.mainloop()
    Vous devriez peut être revoir la géométrie de votre fenêtre. Comprendre la présentation.

    @+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    FAN-TA-STIQUE, juste ce qu'il faut, seulement, il y a certaine partie que je ne comprends pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def affiche(titre, reponse):
        # Attention : Bonus sans doute inutile.
        # Permet de n'afficher qu'un seul Toplevel
        # avec un destroy des précédents.
        for widget in F.winfo_children():
            if isinstance(widget, Toplevel):
                widget.destroy()
        ####################################
        conteneur = Toplevel(F)
        conteneur.title('Résultat')
        Label(conteneur, text=titre).pack()
        Label(conteneur, text='Résultat: ' + str(reponse)).pack()
        Button(conteneur, text='Ok', command=conteneur.destroy).pack(padx=5, pady=5)
    Je ne comprends pas cette partie (Je sais à quoi sert le .pack()).
    - Pour le "for widget in ... widget.destroy()": Je conçois que c'est comme si on créait une fenêtre mais ne voit pas à quoi sert le "for"
    - Que veut dire le "str(reponse)"?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def CelToFah(celsius) :
        reponse = 9./5.*int(celsius)+32
        affiche('Convertion de Celsius en Fahrenheit', reponse)
     
    def CelToKel(celsius) :
        kelvin = int(celsius)+273.15
        affiche('Convertion de Celsius en Kelvin', kelvin)
    - Pourquoi mettre le "int" ici? Il faut absolument préciser qu'on va rentrer des nombres?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Button(F, text='CelToFah', anchor=SE, command=lambda: CelToFah(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='CelToKel', anchor=SW, command=lambda: CelToKel(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='KelToFah', anchor=SW, command=lambda: KelToFah(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='KelToCel', anchor=SW, command=lambda: KelToCel(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='FahToCel', anchor=SW, command=lambda: FahToCel(entree.get())).pack(side=BOTTOM, anchor=SW)
    Button(F, text='FahToKel', anchor=SW, command=lambda: FahToKel(entree.get())).pack(side=BOTTOM, anchor=SW)
    - Je ne comprends pas la partie "command=lambda: CelToFah(entree.get())".
    Je n'ai jamais entendu parler de "lamba" (Sauf en Math ou en Physique mais pas en Python). Et à quoi correspond le (entree.get())?


    Je ne vous remercierai jamais assez pour cette aide, cela faisait un moment que je galérais : je dois présenter ce programme en Juin...
    Merci d'avance pour vos conseils avisés sur le structure de ce petit programme.

  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,

    Citation Envoyé par Morsounet Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def affiche(titre, reponse):
        # Attention : Bonus sans doute inutile.
        # Permet de n'afficher qu'un seul Toplevel
        # avec un destroy des précédents.
        for widget in F.winfo_children():
            if isinstance(widget, Toplevel):
                widget.destroy()
        ####################################
        conteneur = Toplevel(F)
        conteneur.title('Résultat')
        Label(conteneur, text=titre).pack()
        Label(conteneur, text='Résultat: ' + str(reponse)).pack()
        Button(conteneur, text='Ok', command=conteneur.destroy).pack(padx=5, pady=5)
    Je ne comprends pas cette partie (Je sais à quoi sert le .pack()).
    - Pour le "for widget in ... widget.destroy()": Je conçois que c'est comme si on créait une fenêtre mais ne voit pas à quoi sert le "for"
    - Que veut dire le "str(reponse)"?
    pack est un des gestionnaire (pack, place, grid) de géométrie de Tkinter.
    Cela permet de place les Widgets (les objets) dans la fenêtre.
    Dans la plupart des cas vous avez du code du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = Button(root)
    b.pack()
    Qu'importe 'b' si vous n'en avez pas besoin (Comprendre que vous n'avez pas besoin du nom 'b' et que 'command' est executer quand même puisque cette méthode est dans l'objet) ? Donc Button(root, command=tutu).pack().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for widget in F.winfo_children(): # Pour tous les Widgets de F
        if isinstance(widget, Toplevel): # Si le Widget est un Toplevel Tkinter
            widget.destroy() # On détruit le Widget.
    Retirez ce code est vous vous retrouvez avec une fenêtre Toplevel (Je parle bien de fenetre Toplevel et non Tk, Vous devez n'avoir qu'une instance Tk > unnom = Tk()) pour chaque résultat.

    str(reponse) : Votre résultat n'est pas un string, non ? Donc avec 'Résultat: ' + str(reponse) vous avez une concaténation d'un string + un string.

    Citation Envoyé par Morsounet Voir le message
    Pourquoi mettre le "int" ici? Il faut absolument préciser qu'on va rentrer des nombres?
    Une Entry Tkinter c'est du texte.

    Citation Envoyé par Morsounet Voir le message
    Je ne comprends pas la partie "command=lambda: CelToFah(entree.get())".
    Je n'ai jamais entendu parler de "lamba" (Sauf en Math ou en Physique mais pas en Python). Et à quoi correspond le (entree.get())?
    entree.get() donne le contenu de l'Entry entree.

    lambda est très important avec 'command'.
    Je vous laisse faire vos recherches sur le sujet (Pas tout quand même ;p)

    En conclusion : Pas si dur non ?

    @+

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

    Petit bonus matinal pour ce qui est des fonctions lambda

    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    from Tkinter import *
     
    def affiche(titre, reponse):
        for widget in F.winfo_children():
            if isinstance(widget, Toplevel):
                widget.destroy()
        conteneur = Toplevel(F)
        conteneur.title('Résultat')
        Label(conteneur, text=titre).pack()
        Label(conteneur, text='Résultat: ' + str(reponse)).pack()
        Button(conteneur, text='Ok', command=conteneur.destroy).pack(padx=5, pady=5)
     
    def quelletouche(event):
        global touche
        touche = event
     
    def veriftouche():
        if touche.char.isdigit() or touche.keysym == "BackSpace":
            return True
        else:
            entree.configure(validate='key', validatecommand=veriftouche)
        return False
     
    F = Tk()
    Label(F,text="Convertisseur température").pack(fill=BOTH)
    Label(F, text = 'Entrez la Temperature :').pack(fill=BOTH)
    entree = Entry(F, justify=CENTER, validate='key', validatecommand=veriftouche)
    entree.bind("<Key>", quelletouche)
    entree.pack(padx=5, pady=5, fill=BOTH)
    entree.focus_set()
    Button(F, text='CelToFah', command=lambda: affiche('Convertion de Celsius en Fahrenheit', 9./5.*int(entree.get())+32)).pack(padx=5, pady=5, fill=BOTH)
    Button(F, text='CelToKel', command=lambda: affiche('Convertion de Celsius en Kelvin', int(entree.get())+273.15)).pack(padx=5, pady=5, fill=BOTH)
    Button(F, text='KelToFah', command=lambda: affiche('Convertion de Kelvin en Fahrenheit', 9./5.*(int(entree.get())-459.67))).pack(padx=5, pady=5, fill=BOTH)
    Button(F, text='KelToCel', command=lambda: affiche('Convertion de Kelvin en Celsius', int(entree.get())-273.15)).pack(padx=5, pady=5, fill=BOTH)
    Button(F, text='FahToCel', command=lambda: affiche('Convertion de Fahrenheit en Celsius', 5./9.*(int(entree.get())-32))).pack(padx=5, pady=5, fill=BOTH)
    Button(F, text='FahToKel', command=lambda: affiche('Convertion de Fahrenheit en Kelvin', 5./9.*(int(entree.get())-32))).pack(padx=5, pady=5, fill=BOTH)
    Button(F, text='Quitter', command=F.quit).pack(padx=5, pady=5, fill=BOTH)
    F.mainloop()
    Je pense qu'avec cela vous avez de quoi

    @+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    Encore un grand merci pour vos réponses, je regarderai à tout ca ce soir, j'ai labo ce matin.

    Bonne journée et encore merci =)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

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