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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 2
    Points
    2
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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 expérimenté
    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
    Points : 1 742
    Points
    1 742
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 2
    Points
    2
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 2
    Points
    2
    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 =)

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    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 347
    Points : 36 870
    Points
    36 870
    Par défaut utilisation de validatecmd
    Salut,

    Juste parce que j'ai çà en stock et qu'on se passe d'un StringVar.

    Le point délicat est l'enregistrement d'une validate command en précisant les paramètres qu'on voudra recevoir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from Tkinter import *
     
    class ValidateEntry(Entry):
        def __init__(self, master=None, default=None, **kwds):
            Entry.__init__(self, master,
                            validate='key',
                            validatecommand=self._validate)
            vcmd = (self.register(self._validate), '%d', '%s', '%S', '%P')
            self.config(vcmd=vcmd)
            if default:
                self.insert(1.0, str(default))
                self._validate('1', '', default, default)
    Les paramètres que j'ai retenu sont:
    • %d: insert, delete qui valides pour 'key'
    • %s: la chaine de caractère déjà saisie
    • %S: les caractères qu'on essaie d'ajouter
    • %P: ce que sera le contenu si on retourne True.

    Une première utilisation est de signaler le changement d'état côté contenu vide ou pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def _validate(self, action, old, ins, new):
            if len(old) and not len(new):
                self.event_generate('<<no_data>>')
            elif len(new) and not len(old):
                self.event_generate('<<has_data>>')
            return True
    Puis on peut s'amuser à vérifier que le contenu est, reste un entier...
    Note: les gens pressés peuvent se contenter de tester int(new) mais c'est moins instructif.
    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
    class ValidateInteger(ValidateEntry):
        def get(self):
            return int(ValidateEntry.get(self))
     
        def _validate(self, action, old, ins, new):
            print 'action:', action, 'old:', old, 'new:', new
            is_valid = False
            if action == '1': # insert
                for c in ins:
                    if c not in '0123456789':
                        break
                else:
                    is_valid = True
            elif action == '0': # delete
                is_valid = True
            if is_valid:
                return ValidateEntry._validate(self, action, old, ins, new)
    Exemple d'utilisation en associant les events à l'état clickable ou pas du bouton 'ok'.
    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
    if __name__ == '__main__':
     
        root = Tk()
        w = ValidateInteger(root, justify=CENTER)
        w.pack()
     
        def show_integer(value):
            print value
        cmd = lambda: show_integer(w.get())
        ok_btn = Button(root, text='Ok', disabledforeground='',
                        state='disabled', command=cmd)
     
        ok_btn.pack(padx=5, pady=5, fill=BOTH)
        w.bind('<<no_data>>', lambda e: ok_btn.configure(state='disabled'))
        w.bind('<<has_data>>', lambda e: ok_btn.configure(state='normal'))
     
        Button(root, text='Quit', command=root.quit).pack(padx=5, pady=5, fill=BOTH)
     
        mainloop()
    Truc qui ne me plait pas.
    ValidateInteger hérite de ValidateEntry et c'est bien car la chose reste un "object" Tk.Entry. Mais... pour valider une entrée, on peut vouloir effectuer ou pas une liste de validations quelconques, style:
    - c'est un entier,
    - dans l'intervalle X..Y
    - ...
    L'héritage n'est pas la liaison la plus appropriée mais "elle est assez bonne" pour cet exemple.
    - W

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Rebonjour à tous!
    Voilà le programme que je compte présenter à l'examen.
    Le prof va surement demander des améliorations :
    -Dire que la température de -300°C n'est pas possible à atteindre (Par exemple), pour ça, j'ai déjà mon idée
    -Permettre de convertir des chiffres à virgules, je sais qu'il faudrait rentrer un float mais je ne sais pas où...
    -Rendre le programme plus robuste à la conversion de lettres (Là je ne vois pas...)

    Si vous avez des remarques, n'hésitez pas ;-)

    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
    # UMONS - Réalisé par Aline Clément et Jérôme Diricq - 2e BAC Chimie - 13/05/2011 #
    from Tkinter import *
     
    def affiche(titre, reponse): # Permet de n'afficher qu'un seul Toplevel (Fenêtre affichant les réponses) avec un destroy des précédents #
        for widget in F.winfo_children():
            if isinstance(widget, Toplevel):
                widget.destroy()
        ####################################
        conteneur = Toplevel(F) # Création de la fenêtre de réponse #
        conteneur.title('Résultat') # Création du titre de la fenêtre #
        Label(conteneur, text=titre).pack() # Label défini un fragment de texte qui peut être utilisé pour afficher des informations dans la fenêtre "conteneur" #
        Label(conteneur, text='Résultat: ' + str(reponse)).pack() # Pack permet d'adapter la géométrie de la fenêtre au texte. "str" défini une chaine de caractères #
        Button(conteneur, text='Ok', command=conteneur.destroy).pack(padx=5, pady=5) # Création du bouton qui détruit la fenêtre et définition de la grandeur du bouton #
     
    # Création des fonctions permettant de convertir les températures, les formules ont été prises sur wikipedia #
     
    def CelToFah(celsius) :
        fahrenheit = 9./5.*int(celsius)+32
        affiche('Conversion de Celsius en Fahrenheit', fahrenheit)
     
    def CelToKel(celsius) :
        kelvin = int(celsius)+273.15
        affiche('Conversion de Celsius en Kelvin', kelvin)
     
    def FahToCel(fahrenheit) :
        celsius = 5./9.*(int(fahrenheit)-32)
        affiche('Conversion de Fahrenheit en Celsius', celsius)
     
    def KelToCel(kelvin) :
        celsius = int(kelvin)-273.15
        affiche('Conversion de Kelvin en Celsius', celsius)
     
    def FahToKel(fahrenheit) :
        kelvin = 5./9.*(int(fahrenheit)+459.67)
        affiche('Conversion de Fahrenheit en Kelvin', kelvin)
     
    def KelToFah(kelvin) :
        fahrenheit = 9./5.*(int(kelvin)-459.67)
        affiche('Conversion de Kelvin en Fahrenheit', fahrenheit)
     
    F = Tk() # Création de la classe Tk() qui permet d'engendrer différents types de fenêtres, de modifier les tailles,... #
    w = Frame(F, height=500, width=500) # Création de la fenêtre de travail et défintion des dimensions #
    w.pack()
     
    # Bouton permettant la destruction de la fenêtre et définition de sa position dans la fenêtre #
    ## Création de boutons de conversion. Ceux-ci vont exploiter la valeur qui sera entrée par l’utilisateur (entree.get) et la fonction correspondant au bouton ##
    ### On utilise la fonction lambda pour pouvoir utiliser un argument dans la fonction command ###
    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)
     
    # Quelques textes, affichés dans la fenêtre et entrés de la même façon que précédemment #
     
    Label(w,text="Convertisseur température").pack()
    Label(w,text="Réalisé par Aline Clément et Jérôme Diricq").pack()
    Label(w, text = 'Entrez la Temperature :', anchor=SW).pack(anchor=SW) # Anchor permet de positionner le texte où l'on veut dans la fenêtre #
    entree = Entry(w)  # Permet à l’utilisateur d’entrer une valeur qui sera exploitée grâce aux boutons de conversion #
    entree.pack(anchor=SW)
     
    F.mainloop() # Permet de faire tourner le programme en boucle en attendant qu'il soit utilisé #
    EDIT :
    - J'ai trouvé pour les chiffres à virgules, j'ai simplement remplacé "int" par "float"
    - Par contre impossible d'afficher que la conversion est impossible pour une température sous 0°K ...

  11. #11
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pour ce qui est 0 tu dois utiliser un test
    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
    def delwidgets():
        for widget in F.winfo_children():
            if isinstance(widget, Toplevel):
                widget.destroy()
     
    def erreur(texte):
        delwigets()
        erreurwidget = Toplevel(F)
        erreurwidget.title('Erreur')
        Label(erreurwidget, text=texte).pack(padx=5, pady=5)
        Button(erreurwidget, text='Ok', command=erreurwidget.destroy).pack(padx=5, pady=5)
     
    def affiche(titre, reponse): # Permet de n'afficher qu'un seul Toplevel (Fenêtre affichant les réponses) avec un destroy des précédents #
        delwidgets()
        ####################################
        conteneur = Toplevel(F) # Création de la fenêtre de réponse #
        conteneur.title('Résultat') # Création du titre de la fenêtre #
        Label(conteneur, text=titre).pack() # Label défini un fragment de texte qui peut être utilisé pour afficher des informations dans la fenêtre "conteneur" #
        Label(conteneur, text='Résultat: ' + str(reponse)).pack() # Pack permet d'adapter la géométrie de la fenêtre au texte. "str" défini une chaine de caractères #
        Button(conteneur, text='Ok', command=conteneur.destroy).pack(padx=5, pady=5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def KelToCel(kelvin):
        if int(kelvin) == 0:
            erreur('Ne peut etre égal à zéro')
        else:
            celsius = int(kelvin)-273.15
            affiche('Conversion de Kelvin en Celsius', celsius)
    C'est aussi utilisable pour 300°C.

    Pour ce qui est des lettres utilise la validation (edit).
    Soit if touche.char in '0123456789.' or touche.keysym == "BackSpace":

    @+

    Ps : Pense a rajouter l’entête de fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #

  12. #12
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Et, à l'occasion, pense a lire ce que je viens de poster sur l'import de Tkinter.

    @++

  13. #13
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par PauseKawa Voir le message
    Et, à l'occasion, pense a lire ce que je viens de poster sur l'import de Tkinter.
    J'avais déjà vu que tu utilisais ce code. Je pensais que c'était pour des histoires de compatibilité entre plateformes. Je sais maintenant pourquoi. Bien que je reste sous python 2.7 le plus longtemps possible. j'y penserai désormais.

    A+

    Pfeuh

  14. #14
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir pfeuh,

    Citation Envoyé par pfeuh Voir le message
    Bien que je reste sous python 2.7 le plus longtemps possible
    Rien n’empêche de faire du code Tk 'propre' et portable pour la suite, question de ne pas se retaper tout en 3.x
    De même que sous Python il existe des 'bonnes pratiques' (indentation, etc) il devrais exister des 'bonnes habitudes' sous Tkinter.

    @+

+ 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