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 :

plusieurs if imbriquer et autant d'else identique


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    Demandeur d'emploi
    Inscrit en
    Octobre 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Demandeur d'emploi

    Informations forums :
    Inscription : Octobre 2018
    Messages : 32
    Par défaut plusieurs if imbriquer et autant d'else identique
    Bonjour, je suis en train de réaliser un fichier de calcul de périmètre et je veux vérifier que la valeur saisie en Entry est un nombre et supérieur à 0.
    Si ce n'est pas le cas, il m'affiche un Messagebox, mais j'ai eu un problème.
    Voici un exemple de code qui me posait un problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if cote.get().isnumeric() or cote.get() > 0:
       "Afficher le texte dans une zone Text"
    else:
       Messagebox("Titre", "Message")
    Il mettait un message d'erreur lorsque j'essaie de saisir une lettre dans le Entry, il "TypeError: '>' not supported between instances of 'str' and 'int'"

    Voici la solution que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if cote.get().isnumeric():
       if cote.get() > 0:
          "Afficher le texte dans une zone Text"
       else:
          Messagebox("Titre", "Message")
    else:
       Messagebox("Titre", "Message")
    Sinon existe t'il un moyen de réunir les deux else en un.

    L'exemple était le périmètre d'un carré avec une valeur le côté, mais si je fais le périmètre d'un rectangle il y a 2 valeurs (longueur et largeur) donc j'ai dù faire 4 lignes de if et 4 lignes de else identique.

    Avez vous une solution, merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Citation Envoyé par Yanss49 Voir le message
    Sinon existe t'il un moyen de réunir les deux else en un.
    En français: si la valeur est un nombre *ET* est positive alors...

    Ceci dit, la solution que vous avez trouvé (ou le *ET*) ne fonctionnera pas car .isnumeric s'applique à une chaine de caractères qu'il faudra convertir en nombre pour pouvoir être comparé à 0... et plusieurs étapes.

    Citation Envoyé par Yanss49 Voir le message
    L'exemple était le périmètre d'un carré avec une valeur le côté, mais si je fais le périmètre d'un rectangle il y a 2 valeurs (longueur et largeur) donc j'ai dù faire 4 lignes de if et 4 lignes de else identique.
    Il faudrait montrer le code car le périmètre d'un rectangle est longueur plus largeur fois 2. Comment vous retrouvez-vous avec 4 conditions là ou il n'y en a pas?

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

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    bonjour

    pourquoi ne pas avoir utilisé un IntVar à la place d'un StringVar ???

    Puisque tu semples vouloir retourner un message d'erreur, alors il y a 2 types (négatif and non numérique + egal à zero?). Donc c'est trois/quatres retours possibles ?

    Un petit code pour que tu fasses des tests peut-être:
    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
    from tkinter import *
    import tkinter as tk
     
    root = tk.Tk()
     
    def convert_to_int(strvar) -> [int, str]:
        match strvar.get().removeprefix("-").isnumeric():
            case True if int(strvar.get()) == 0:
                msg = "Est trop petit"
                ret = None
            case True if int(strvar.get()) < 1:
                msg = "Est négatif"
                ret = None
            case True:
                msg = ""
                ret = int(strvar.get())
            case _:
                msg = "Doit être un entier"
                ret = None
        return (ret, msg)
     
    valeurs = (
        tk.StringVar(),
        tk.StringVar(value="45"),
        tk.StringVar(value="a99"),
        tk.StringVar(value="-8"),   # strvar.get().isnumeric() == False ! donc pas bon retour
        tk.StringVar(value="0"),
        tk.StringVar(value="2.2"),
    )
     
    for valeur in valeurs:
        value, msg = convert_to_int(valeur)
        print("#", valeur, type(valeur), type(valeur.get()), value, msg) # si mélange de stringvar et intvar, inutile ici
        if msg:
            print("ERREUR pour", valeur.get(), "->", msg)
        else:
            # traitement de value
            print(f"  OK -> {value}")
            ...
    EDIT:
    Citation Envoyé par Yanss49 Voir le message
    il y a 2 valeurs (longueur et largeur) donc j'ai dù faire 4 lignes de if et 4 lignes de else identique.
    ? pas si on utilise une fonction comme dans l'exemple
    $moi= (:nono: !== :oops:) ? :king: : :triste: ;

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Citation Envoyé par papajoker Voir le message
    pourquoi ne pas avoir utilisé un IntVar à la place d'un StringVar ???
    Au départ, il s'agit d'une Entry.

    On peut lui associer un IntVar mais cela ne garantira pas que l'utilisateur ait entré un nombre... il faudra gérer le soucis via un try...except avant de comparer.

    Ceci dit, dans les premiers exercices, la saisie se fait avec input et la logique "convertir avant de comparer" est similaire. Plus inquiétant est la solution proposée: on y croit mais elle ne peut pas marcher!

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

Discussions similaires

  1. Expression régulière - gestion de plusieurs spans imbriqués en HTML
    Par Kayan dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/04/2009, 15h06
  2. [MySQL] Plusieurs while imbriqués pour expoitation de résultats
    Par jojo57 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/03/2008, 14h01
  3. Plusieurs strtok imbriqués
    Par HaTnuX dans le forum C
    Réponses: 7
    Dernier message: 10/12/2006, 15h02
  4. plusieurs panel imbriqué
    Par bmw13fr dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 21/02/2006, 15h30
  5. [excel] Plusieurs if imbriqués
    Par steps5ive dans le forum Access
    Réponses: 2
    Dernier message: 08/11/2005, 18h25

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