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 :

message d'erreur tkinter


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 32
    Points
    32
    Par défaut message d'erreur tkinter
    Bonjour,
    je débute avec Tkinter et je suis entrain d'écrire un programme qui effectue des traitements sur les matrices .
    Quand je veux recuperer la taille de la matrice et la convertir en int , j'obtiens cette erreur:
    ValueError: invalid literal for int() with base 10: ''
    voici mon 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
     
     
     
    from tkinter import *
     
    def MatVide(taille):
        m = [float]*taille
        for i in range(taille):
            m[i] = [float]*taille
        return m
    def saisie_matrice(taille):
        fenetre = Tk()
        champ_lab = Label(fenetre, text="Saisie de la matrice ")
        champ_lab.pack()
        mat = MatVide(taille)
        for i in range(taille):
            for j in range(taille):
                 ligne_texte = Entry(fenetre,width=30)
                 ligne_texte.pack()
                 mat[i][j] = float(ligne_texte.get())
     
     
     
     
    def somme_matrice():
        fenetre = Tk()
     
     
        champ_lab = Label(fenetre, text="Donner la taille ")
        champ_lab.pack()
     
     
        ligne_texte = Entry(fenetre,width=30)
        ligne_texte.pack()
     
     
        taille=int(ligne_texte.get())
     
     
        bouton_ok = Button(fenetre, text="Ok",command=saisie_matrice(taille))
     
        bouton_ok.pack()
     
     
     
    fenetre = Tk()
    fenetre.geometry("300x300")
    bouton_quitter = Button(fenetre, text="Quitter", command=fenetre.quit,width="300")
    bouton_somme = Button(fenetre, text="Somme de matrices",width="300",command=somme_matrice)
    bouton_produit = Button(fenetre, text="Produit de matrices",width="300")
    bouton_transpose = Button(fenetre, text="Transpose de matrices",width="300")
    bouton_inverse = Button(fenetre, text="Inverse de matrices",width="300")
     
     
    champ_lab = Label(fenetre, text="Que voulez vous faire?")
     
    champ_lab.pack()
    bouton_somme.pack()
    bouton_produit.pack()
    bouton_transpose.pack()
    bouton_inverse.pack()
    bouton_quitter.pack()
    fenetre.mainloop()

  2. #2
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par magyy Voir le message
    Bonjour,
    je débute avec Tkinter et je suis entrain d'écrire un programme qui effectue des traitements sur les matrices .
    Quand je veux recuperer la taille de la matrice et la convertir en int , j'obtiens cette erreur:
    ValueError: invalid literal for int() with base 10: ''
    voici mon 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
     
     
     
    from tkinter import *
     
    def MatVide(taille):
        m = [float]*taille
        for i in range(taille):
            m[i] = [float]*taille
        return m
    def saisie_matrice(taille):
        fenetre = Tk()
        champ_lab = Label(fenetre, text="Saisie de la matrice ")
        champ_lab.pack()
        mat = MatVide(taille)
        for i in range(taille):
            for j in range(taille):
                 ligne_texte = Entry(fenetre,width=30)
                 ligne_texte.pack()
                 mat[i][j] = float(ligne_texte.get())
     
     
     
     
    def somme_matrice():
        fenetre = Tk()
     
     
        champ_lab = Label(fenetre, text="Donner la taille ")
        champ_lab.pack()
     
     
        ligne_texte = Entry(fenetre,width=30)
        ligne_texte.pack()
     
     
        taille=int(ligne_texte.get())
     
     
        bouton_ok = Button(fenetre, text="Ok",command=saisie_matrice(taille))
     
        bouton_ok.pack()
     
     
     
    fenetre = Tk()
    fenetre.geometry("300x300")
    bouton_quitter = Button(fenetre, text="Quitter", command=fenetre.quit,width="300")
    bouton_somme = Button(fenetre, text="Somme de matrices",width="300",command=somme_matrice)
    bouton_produit = Button(fenetre, text="Produit de matrices",width="300")
    bouton_transpose = Button(fenetre, text="Transpose de matrices",width="300")
    bouton_inverse = Button(fenetre, text="Inverse de matrices",width="300")
     
     
    champ_lab = Label(fenetre, text="Que voulez vous faire?")
     
    champ_lab.pack()
    bouton_somme.pack()
    bouton_produit.pack()
    bouton_transpose.pack()
    bouton_inverse.pack()
    bouton_quitter.pack()
    fenetre.mainloop()
    Bonjour,
    Combien y a-t-il d'instances de "Tk" lancées? Ces instances ne peuvent que très mal échanger des informations entre elles. C'est pourquoi il ne faut lancer qu'une seule et unique instance de "Tk".
    À la place ce sont des "Toplevel" qu'l faut utiliser.

    Sinon, la taille est lue, avant que l'utilisateur ait eu le temps d'entrer la taille de cette matrice…
    D'autre part, la commande d'un bouton est toujours le nom d'une fonction sans parenthèses (un "callback"). Sinon la fonction est exécutée à la mise en place du bouton.
    Pour passer un paramètre il faut utiliser une fonction "lambda"…

    Clodion

  3. #3
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    C'est ici taille=int(ligne_texte.get()) que tu lèves une erreur ?

    Le message te dit que la chaîne de texte, donc le contenu de l'Entry est vide.

    Tu peux simplifier ta première fonction MatVide(taille)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def MatVide(taille):
        return [[0] * taille for i in range(taille)]
    pas besoin d'utiliser des instances de classe float.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Re,
    Ainsi, la fonction "somme_matrice" pourrait ressembler à 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
    def somme_matrice():
        fen2 = Toplevel()
        def taille_mat():
            text = ligne_texte.get()
            if text.isnumeric():
                taille=int(ligne_texte.get())
                saisie_matrice(taille)
            else:
                print("recommencer")
     
        champ_lab = Label(fen2, text="Donner la taille ")
        champ_lab.pack()
        ligne_texte = Entry(fen2,width=30)
        ligne_texte.pack()
        bouton_ok = Button(fen2, text="Ok",command=taille_mat)
        bouton_ok.pack()
    Ensuite il reste des erreurs… Mais bon, ce sont les mêmes (outre celle pointée par VinsS).

    Clodion

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    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 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Vous faites un entry.get() juste après avoir créé l'entry: impossible que l'utilisateur ait eu temps d'entrer quoi que soit. entry.get() retourne la chaine vide, et sa convertion en float(). Vous penser programmation séquentielle alors qu'avec un GUI, il faut penser évènements et structurer son programme en conséquence. Pour construire des dialogues de saisie c'est beaucoup plus compliqué que ce qu'on doit faire quand on travaille avec la console.
    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
    16
    17
    18
    19
    20
    21
    22
    23
    import tkinter as tk
    from tkinter import messagebox
     
    def saisie_entier(master=None):
     
        frame = tk.Frame(master)
        tk.Label(frame, text="taille?").pack()
        entry = tk.Entry(frame)
        entry.pack()
        tk.Button(frame, text='ok', command=frame.quit).pack()
        frame.pack()
        while 1:
            frame.mainloop()
            n = entry.get()
            if str.isdigit(n):
                break
            messagebox.showerror("Erreur", "ce n'est pas un entier!!!")
            entry.delete(0, 'end')
        frame.destroy()
        return int(n)
     
    root = tk.Tk()
    print(saisie_entier(root))
    Pour comprendre comment cela fonctionne, il vous faudra prendre le temps de lire et comprendre comment programmer un GUI par vous même grâce à un tuto.
    Bon courage.

    - W

  6. #6
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    @wiztricks: y a-t-il un avantage à utiliser "str.isdigit(n)" plutôt que "n.isdigit()"?
    Pourquoi importer spécifiquement "messagebox"?
    Sinon, la structure "while 1:\n fen.mainloop()" me semble un peu alambiquée, non? Y a-t-il une raison particulière?

    Clodion

    PS: et si la fenêtre est fermée par la croix de la barre de titre, le "entry.get()" provoque une erreur de tkinter.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    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 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Citation Envoyé par Clodion Voir le message
    @wiztricks: y a-t-il un avantage à utiliser "str.isdigit(n)" plutôt que "n.isdigit()"?
    Techniquement, c'est la même chose.
    Pour la petite histoire, j'avais initialement écrit "isdigit(n)". Bien sûr, çà s'est vautré. Je lai corrigé en préfixant par "str." parce que c'était plus proche de ce à quoi je pensais en écrivant cela.

    Citation Envoyé par Clodion Voir le message
    Pourquoi importer spécifiquement "messagebox"?
    Parce qu'écrire tk.messagebox.showerror, c'est une indirection de trop (pour moi).

    Citation Envoyé par Clodion Voir le message
    Sinon, la structure "while 1:\n fen.mainloop()" me semble un peu alambiquée, non? Y a-t-il une raison particulière?
    La méthode conventionnelle est de passer par une classe qui hérite d'un Toplevel où l'appelant attend que le dialogue se termine via un .wait puis récupère le résultat qui a été sauvegardé dans un attribut. Comme il faut rendre cette Toplevel modale, c'est pas si simple sauf si on apprend à utiliser tk.simpledialog (qui fait une bonne partie du boulot). Le principe est le même mainloop sauf que c'est la méthode qui "valide" qui décidera d'en sortir ou pas. Ici, on vérifie "en séquence"...
    autre version:
    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
    import tkinter as tk
    from tkinter import messagebox
     
    def saisie_entier(master=None):
        n = None
     
        def ok_button():
            nonlocal n
     
            n = entry.get()
            if str.isdigit(n):
                frame.quit()
            else:
                messagebox.showerror("Erreur", "ce n'est pas un entier!!!")
                entry.delete(0, 'end')
     
        frame = tk.Frame(master)
        tk.Label(frame, text="taille?").pack()
        entry = tk.Entry(frame)
        entry.pack()
        tk.Button(frame, text='ok', command=ok_button).pack()
        frame.pack()
        frame.mainloop()
        frame.destroy()
        return int(n)
     
    root = tk.Tk()
    print(saisie_entier())
    Pas si évident que ce soit "plus simple" (à lire).

    - W

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 32
    Points
    32
    Par défaut
    J'ai corrigé mon code et je n'ai plus l'erreur!
    Merci beaucoup pour vos aides!

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

Discussions similaires

  1. problème message d'erreur tkinter
    Par polette dans le forum Tkinter
    Réponses: 14
    Dernier message: 30/04/2014, 19h41
  2. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 12h42
  3. Réponses: 4
    Dernier message: 04/03/2003, 02h05
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 15h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 20h46

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