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

Python Discussion :

aide sur un programme.


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 27
    Points : 20
    Points
    20
    Par défaut aide sur un programme.
    bonjour à tous et toutes,
    actuellement en m'aidant de ce 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
    from tkinter import *
    from math import *
    # définition de l'action à effectuer si l'utilisateur actionne
    # la touche "enter" alors qu'il édite le champ d'entrée :
    def evaluer(event):
    chaine.configure(text = "Résultat = " + str(eval(entree.get())))
    # ----- Programme principal : -----
    fenetre = Tk()
    entree = Entry(fenetre)
    entree.bind("<Return>", evaluer)
    chaine = Label(fenetre)
    entree.pack()
    chaine.pack()
    fenetre.mainloop()
    j'ai pu ecrire celui-ci:
    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
    81
    82
    83
    84
    from tkinter import *
     
    #fct circuit
    def circouv():
        canv.delete(ALL)
        flagetat=False
        canv.create_line(50,200,200,200) #gene borne+
        canv.create_line(100,250,150,250) #gene borne-
        canv.create_line(125,200,125,100) #fil gene+
        canv.create_line(125,100,250,100) #inter borne+
        canv.create_oval(245,95,255,105,fill="black") #inter contact+
        canv.create_line(250,125,350,100) #inter bascule
        canv.create_line(350,100,450,100) #inter borne-
        canv.create_oval(345,95,355,105,fill="black") #inter contact-
        canv.create_line(450,100,450,150) #res borne+
        canv.create_rectangle(425,150,475,250) #res
        canv.create_line(450,250,450,350) #res borne-
        canv.create_line(450,350,125,350) #fil
        canv.create_line(125,350,125,250) #fil gene-
     
    def circfer():
        canv.delete(ALL)
        flagetat=True
        canv.create_line(50,200,200,200) #gene borne+
        canv.create_line(100,250,150,250) #gene borne-
        canv.create_line(125,200,125,100) #fil gene+
        canv.create_line(125,100,250,100) #inter borne+
        canv.create_oval(245,95,255,105,fill="black") #inter contact+
        canv.create_line(250,100,350,100) #inter bascule
        canv.create_line(350,100,450,100) #inter borne-
        canv.create_oval(345,95,355,105,fill="black") #inter contact-
        canv.create_line(450,100,450,150) #res borne+
        canv.create_rectangle(425,150,475,250) #res
        canv.create_line(450,250,450,350) #res borne-
        canv.create_line(450,350,125,350) #fil
        canv.create_line(125,350,125,250) #fil gene-
     
    def sw():
        """
        """
        global flagetat
        if flagetat == True:
            flagetat = False
            circouv()
            lbl1.configure(text="la tension est de: 0V")
            lbl2.configure(text="le courant est de: 0A")
     
        elif flagetat == False:
            flagetat = True
            circfer()
            lbl1.configure(text="la tension est de: "+ent1.get())
            lbl2.configure(text="le courant est de: "+str(int(ent1.get())/int(ent2.get()))+"A")
     
    #interface
    fen = Tk()
     
    canv = Canvas(fen, height = 450, width = 600, bg="light yellow",)
    canv.grid(row=0,column=0,rowspan=10)
     
    Label(fen,text="interrupteur").grid(row=0,column=1)
    but = Button(fen,text="marche/arret",command=sw)
    but.grid(row=0, column=2)
     
    Label(fen,text="générateur").grid(row=1,column=1)
    ent1 = Entry(fen)
    ent1.grid(row=1,column=2)
    ent1.bind("<Return>",sw)
     
    Label(fen,text="resistance").grid(row=2,column=1)
    ent2 = Entry(fen)
    ent2.grid(row=2,column=2)
    ent2.bind("<Return>",sw)
     
    lbl1 = Label(fen)
    lbl1.grid(row=4,column=2)
     
    lbl2 = Label(fen)
    lbl2.grid(row=5,column=2)
     
    #main
    flagetat = False
    circouv()
     
    fen.mainloop()
    cependant vous remarquerez que ma fonction sw (qui prends en référence la fonction eval du premier exemple) ne semble pas fonctionner de la même manière.

    1-je n'ai pas de paramètre event (d'ailleurs si j'en mets un ça me génère une erreur).

    2-je ne peux pas utiliser de fonction eval() pour "evaluer" les valeurs contenus dans mes Entry. bon la je pense que c'est dû à Python3 et que tout simplement je ne le peux pas d'où pour moi le fait des les convertir en int puis en string.

    en fait ma question est plus pour la 1 si quelqu'un peut m'expliquer pourquoi je n'ai pas eu besoin du paramètre event

    merci pour l'aide apportée

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

    Sans trop s'éloigner du 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
    from tkinter import *
     
    def sw(event=None):
        """
        """
        global flagetat
        if flagetat == True:
            flagetat = False
            canv.coords(bascule, (250, 125, 350, 100))
            lbl1.configure(text="la tension est de: 0V")
            lbl2.configure(text="le courant est de: 0A")
     
        elif flagetat == False:
            flagetat = True
            canv.coords(bascule, (250, 100, 350, 100))
            if ent1.get() and ent2.get():
                lbl1.configure(text="la tension est de: %s" % ent1.get())
                lbl2.configure(text="le courant est de: " + str(int(ent1.get())/int(ent2.get())) + "A")
     
    #interface
    fen = Tk()
     
    canv = Canvas(fen, height=450, width=600, bg="light yellow")
    canv.create_line(50, 200, 200, 200) #gene borne+
    canv.create_line(100, 250, 150, 250) #gene borne-
    canv.create_line(125, 200, 125, 100) #fil gene+
    canv.create_line(125, 100, 250, 100) #inter borne+
    canv.create_oval(245, 95, 255, 105, fill="black") #inter contact+
    bascule = canv.create_line(250, 125, 350, 100) #inter bascule
    canv.create_line(350, 100, 450, 100) #inter borne-
    canv.create_oval(345, 95, 355, 105, fill="black") #inter contact-
    canv.create_line(450, 100, 450, 150) #res borne+
    canv.create_rectangle(425, 150, 475, 250) #res
    canv.create_line(450, 250, 450, 350) #res borne-
    canv.create_line(450, 350, 125, 350) #fil
    canv.create_line(125, 350, 125, 250) #fil gene-
    canv.grid(row=0, column=0, rowspan=10)
     
    Label(fen, text="interrupteur").grid(row=0, column=1)
    Button(fen, text="marche/arret", command=sw).grid(row=0, column=2)
     
    Label(fen, text="générateur").grid(row=1, column=1)
    ent1 = Entry(fen)
    ent1.grid(row=1, column=2)
    ent1.bind("<Return>", sw)
     
    Label(fen, text="resistance").grid(row=2, column=1)
    ent2 = Entry(fen)
    ent2.grid(row=2, column=2)
    ent2.bind("<Return>", sw)
     
    lbl1 = Label(fen, text="la tension est de: 0V")
    lbl1.grid(row=4, column=2)
     
    lbl2 = Label(fen, text="le courant est de: 0A")
    lbl2.grid(row=5, column=2)
     
    #main
    flagetat = False
     
    fen.mainloop()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 27
    Points : 20
    Points
    20
    Par défaut
    bonjour
    en fait je ne voulais pas de modification de mon code. il me satisfait pour le moment. juste une info. mais peut etre que ce n'est pas necessaire.
    j'attends quand meme d'autres reponses au cas ou...

  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
    Et pas question pour moi de réécrire le code : regardez la réponse.

    Citation Envoyé par ivigu Voir le message
    1-je n'ai pas de paramètre event (d'ailleurs si j'en mets un ça me génère une erreur).

    2-je ne peux pas utiliser de fonction eval() pour "evaluer" les valeurs contenus dans mes Entry. bon la je pense que c'est dû à Python3 et que tout simplement je ne le peux pas d'où pour moi le fait des les convertir en int puis en string.
    1 Passe par une valeur par défaut de l'argument : event=None.

    2 Vous avez deux façons de programmer à ce niveau : LBYL/EAFP (Look Before You Leap / It's Easier to Ask Forgiveness Than Permission).
    Cela passe par if ou try.
    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
    >>> value = 'A'
    >>> int(value)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: 'A'
    >>> try:
    ...     v = int(value)
    ... except ValueError:
    ...     v = 0
    ... 
    >>> v
    0
    >>> if value in ("0123456789"):
    ...     v = int(value)
    ... else:
    ...     v = 0
    ... 
    >>> v
    0
    @+

    Edit : Vous avez aussi la validation du Widget Entry qui vous permet de limiter ce qui est saisi dedans ("0123456789" par exemple).
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par ivigu Voir le message
    1-je n'ai pas de paramètre event (d'ailleurs si j'en mets un ça me génère une erreur).
    La fonction "sw" est utilisée comme "command" invoquée lorsqu'on clicke sur un Button et comme callback d'event lorsque l'utilisateur signale la fin de sa saisie dans une Entry via "<Return>".
    Lorsque la commande est appelé vous savez à quoi correspond l'event (l'action de l'utilisateur sur l'IHM), c'est plus difficile quand c'est un callback!

    => Vous n'avez pas d'erreur parce que vous n'avez pas effectué l'action côté IHM déclenchant l'event qui appelerait le callback.

    Comment adapter sw pourqu'il puisse être utilisé dans les deux cas?
    La solution proposée par PauseKawa "fonctionne", il y en a d'autres.

    Ceci dit vous vous rendez compte que mélanger command et callback n'aide pas. Personnellement, lorsque j'écris du code "à la volée", je prend le soin de préfixer les commandes par un "do_" et les events par un "on_". Plus tard, quand le code est plus "stable", je factorise.

    2-je ne peux pas utiliser de fonction eval() pour "evaluer" les valeurs contenus dans mes Entry. bon la je pense que c'est dû à Python3 et que tout simplement je ne le peux pas d'où pour moi le fait des les convertir en int puis en string.
    Une Entry contiendra une chaîne de caractères éventuellement vide.
    D'un point de vue "usability" de l'IHM, il sera préférable de valider les caractères entrés au fur et à mesure. Sinon il va falloir contre-pédaler.
    Ceci dit écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                  lbl2.configure(text="le courant est de: "+str(int(ent1.get())/int(ent2.get()))+"A")
    supposent que ent1.get retourne une chaîne de caractères non vide à laquelle pourra s'appliquer "int". Pareil pour ent2.get() avec en plus la contrainte "différent de 0".
    C'est quand même un peu "optimiste"!!!
    Sans aller jusqu'à écrire les choses proprement, il serait quand même sage d'insérer des valeurs par défaut dans ces widgets. Cà permettra au programme de fonctionner à minima.

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

Discussions similaires

  1. Aide sur un programme Client Serveur
    Par clubmed01 dans le forum Linux
    Réponses: 33
    Dernier message: 29/05/2012, 10h22
  2. Besoin d'aide sur un programme
    Par chuko dans le forum C
    Réponses: 22
    Dernier message: 14/06/2008, 17h33
  3. [VB6] Demande d'aide sur un programme !
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/06/2006, 11h49

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