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 :

Impossible de relancer mon interface deux fois de suite


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Impossible de relancer mon interface deux fois de suite
    Bonsoir,
    Et encore un problème (le dernier je pense).
    J'ai un programme 1 qui permet de mettre dans une listebox tous les noms de fichiers trouvés dans un certain dossier. Quand on clique sur un des noms de la listebox, ce programme 1 appelle un autre programme 2 qui lui affiche une interface graphique en mettant dans des labels des infos recueillies dans le fichier sélectionné (dans la listebox).
    Le problème c'est qu'une fois que j'enregistre l'interface graphique et que je veux refaire la même chose avec un autre fichier (je clique sur un nom dans la listebox) et là rien ne se passe (à part que dans le shell apparait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 
    in interface_av_div_test
    .... (alors que le programme 1 devrait rappeler le programme2 pour afficher l'interface avec dans les labels les données du nouveau fichier choisi). Je choisi à chaque fois obligé de fermer la fenêtre avec la listebox puis relancer le programme1 pour que à nouveau je puisse sélectionné un fichier dans la listebox et que au double clic çà affiche l'interface.

    Je ne sais pas si c'est assez clair, dites moi

    voici le code du programme 1 (choisir_fichier_av_div_test.py):
    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
    #-*- coding: utf-8 -*-  # Définition l'encodage des caractères
    import os #importer le module servant à communiquer avec le système d'exploitation
    import sys # pour pouvoir communiquer entre les scripts
     
     
     
     
     
     
    #Pour que ce script puisse être exécuté grâce à au script choisir_fichier_avant_div
    def Foo5():
        print('in choisir_fichier_av_div_test')
     
     
     
     
     
     
     
     
    import tkinter
    from tkinter import *
    from tkinter import ttk
    import tkinter.filedialog as Selector 
     
     
     
    root=tkinter.Tk()
    mafenetre1=tkinter.Frame()# pour créer une fenêtre
    #root.pack()# pour placer les widgets les uns en_dessous des autres
    label=tkinter.Label(root,text="titre",justify="center",fg="black",bg="#00FA9A")
     
    label.pack() 
     
    label=tkinter.Label(root,text="Choisissez un fichier",justify="center",fg="black",bg="grey")                                                                                        
    label.pack()  
    listb2=tkinter.Listbox(root) 
    lab2=tkinter.Label(root,text=" ")
    listb2.pack()
    lab2.pack() 
    liste2=[]
     
    for  root1,dirs,files in os.walk('/Users/Fanny/Desktop/avant div'): 
        for name in files:
            liste2.append(name)
    for i in liste2: 
        listb2.insert(END,i)
     
     
    def Valider_fichier(e):
        select=listb2.get(listb2.curselection())
        lab2.configure(text="Fichier choisi : "+select,bg="white") 
        nom_fichier=select
     
     
        import sys 
        sys.argv2=nom_fichier
     
        #Pour exécuter le fichier interface_fichier_avant_div
        import interface_av_div_test
        interface_av_div_test.Foo1()
     
     
     
     
    #un double clic dans la listbox appelera la fonction Valider_fichier
    listb2.bind('<Double-1>',Valider_fichier)
     
     
    ##########################" Pour exécuter le programme #######################
     
    root.mainloop()# pour exécuter les instructions (attend des événements)
    et une partie du programme2 (interface_av_div_test.py):
    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
    #-*- coding: utf-8 -*-  # Définition l'encodage des caractères
    import os
    import sys 
     
    #Pour que ce script puisse être exécuté grâce à au script choisir_fichier_avant_div
    def Foo1():
        print('in interface_av_div_test')
    ###Ouvrir le fichier eclipse et prendre les données qui nous intéressent
    ouvert=open('/Users/Fanny/Desktop/avant div/mickey') 
    dico={}  
    compteur_faisceaux=0 
     
    for t in ouvert: 
        longueur=len(t) 
        if t[0:18]=='Patient First Name': 
            dico['Patient First Name']=t[19:longueur-1]
    ouvert.close() 
     
    import tkinter 
    avant_div=tkinter.Toplevel()
    label=tkinter.Label(avant_div,text=dico['Patient First Name'] ,anchor="w",fg="black",bg="white")
     
    label.grid(column=0,row=0) 
     
    def Enregistrement() :
     
        os.unlink('/Users/Fanny/Desktop/avant div/mickey')    
        fichier_sauvegarde=open("/Users/Fanny/Desktop/Apres DIV/"+"//"+ str(sys.argv2),"w")
     
        for cle,valeur in avant_div.dico.items(): 
            fichier_sauvegarde.write("%s=%s\n"%(str(cle),str(valeur)))
        fichier_sauvegarde.close()
     
        avant_div.destroy()
    bouton = tkinter.Button(avant_div, bg='violet', text='Enregistrement', command = Enregistrement) 
    bouton.grid(column=1, row=0)

    Est-ce un bug de python de faire çà? où est-ce que quand j'ai oublié quelquechose dans mes codes où quelque chose est-il mal écrit (pour mon problème)?

  2. #2
    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
    Le problème c'est qu'une fois que j'enregistre l'interface graphique et que je veux refaire la même chose avec un autre fichier (je clique sur un nom dans la listebox) et là rien ne se passe (à part que dans le shell apparait
    "et là rien ne se passe"?
    Pourquoi ne pas ajouter "log".
    En cas de problème, vous mettez en route l'option DEBUG.
    Ca va afficher des messages que vous avez ajouté dans votre code pour indiquer ce qu'il se passe et si çà se passe comme attendu.

    Comment voulez vous qu'on vous aide si "rien ne se passe"?
    Il faut pouvoir décrire ce qu'il se passe et pourquoi çà ne se passe pas comme attendu.

    Si la mise en place d'un "log" vous semble être une bonne idée, c'est pas difficile, le module logging de Python fait cela très bien. Regardez les discussions qui parle de ce sujet, lisez la documentation, ouvrez une discussion sur ce sujet,...

    - W

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Mais en fait je pense que le problème vient du fait que si je clique une première fois sur un nom de la listbox çà appelle le deuxième programme qui génère l'interface graphique et qui, quand on enregistre çà va jusqu'à la ligne avant_div.destroy(). Le processus de ce script tourne toujours (puisque je ne lui dit pas quitte le script du programme 2. Donc quand je choisi une deuxième fois un autre nom de la listbox celui_ci rappelle le programme 2 (mais il est toujours à la même ligne) alors que moi je voudrais qu'il le relance complètement.... comment faire?


    (sinon je n'ai pas compris comment utiliser ce module log)...
    merci à vous

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

    Ben en fait votre Toplevel doit être dans interface_av_div_test.Foo5.

    Ceci dit pourquoi cet import ?
    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
    import os
    import tkinter
     
     
    liste2 = []
    for root1, dirs, files in os.walk('/Users/Fanny/Desktop/avant div'):
        for names in files:
            liste2.append(names)
     
    def showtop(e):
        def enregistrer():
            # os.unlink() risqué sans test non ?
            fichier_sauvegarde = open("/Users/Fanny/Desktop/Apres DIV/%s.sauv" % \
                                      nom_fichier, "w")
            for cle, valeur in dico.items():
                fichier_sauvegarde.write("%s=%s\n" % (str(cle), str(valeur)))
            fichier_sauvegarde.close()
            avant_div.destroy()
     
        nom_fichier = listb2.get(listb2.curselection())
        lab2.configure(text="Fichier choisi : %s" % nom_fichier, bg="white")
        # Je ne comprend pas le but du code ci dessous.
        ouvert = open("/Users/Fanny/Desktop/avant div/mickey", "r")
        dico = {}
        compteur_faisceaux = 0  # ?
        for t in ouvert:
            if t.startswith("Patient First Name"):
                dico["Patient First Name"] = t[19:-1]
        ouvert.close()
        ###
        avant_div = tkinter.Toplevel()
        tkinter.Label(avant_div, text=dico["Patient First Name"], anchor="w",
                      fg="black", bg="white").grid(column=0, row=0) 
        tkinter.Button(avant_div, bg="violet", text="Enregistrement",
                       command=enregistrer).grid(column=1, row=0)
     
    root = tkinter.Tk()
    label1 = tkinter.Label(root, text="titre", justify="center", fg="black",
                           bg="#00FA9A")
    label1.pack(fill="both")
    label2 = tkinter.Label(root, text="Choisissez un fichier", justify="center",
                           fg="black", bg="grey")
    label2.pack(fill="both")
    listb2 = tkinter.Listbox(root)
    for i in liste2:
        listb2.insert("end", i)
    listb2.pack()
    lab2 = tkinter.Label(root, bg="white")
    lab2.pack(fill="both")
    listb2.bind("<Double-1>", showtop)
    root.mainloop()
    (Pour la partie 'logique' vous corrigerez: Je n'ai rien compris)

    @+

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Bonjour
    merci pour votre réponse je vais tester ce matin
    Je fait un import car je voulais exécuter le programme n°2 (ici je n'ai mis qu'un toute petite partie mais en réalité il est beaucoup plus long et si je met ce programme 2 sous un def ou une class, certaines variable sont perdues, python ne sais pas ce qu'elles sont )

  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
    Citation Envoyé par nini_python Voir le message
    si je met ce programme 2 sous un def ou une class, certaines variable sont perdues, python ne sais pas ce qu'elles sont )
    Pensez aux arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> def function(value):
    ...     return value * 2
    ... 
    >>> v = function(2)
    >>> v
    4
    @+

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    merci beaucoup je vais tester tout çà

    Quant à la logique de mon code c'est sans doute un peu fouillit mais j'essaye de me débrouiller avec ce que je connais et découvre, je fais mon possible pour un travail qui est limité dans le temps ( un mois).

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    bonjour!

    merci beaucoup pour vos réponse PauseKawa çà marche à merveille.

    Je vous souhaite un très bon dimanche.

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

Discussions similaires

  1. Impossible de relancer mon esx1
    Par sofydiversion dans le forum VMware
    Réponses: 2
    Dernier message: 28/11/2014, 11h22
  2. Exécution de mon script deux fois
    Par PAB/31/SAB dans le forum VBScript
    Réponses: 2
    Dernier message: 28/03/2013, 20h12
  3. [VBA] Impossible d'éxécuter une requête deux fois.
    Par oliv134 dans le forum SDK
    Réponses: 5
    Dernier message: 22/09/2011, 11h09
  4. [PB VB.net]Pb ouverture de fichier deux fois de suite
    Par skaraa dans le forum Windows Forms
    Réponses: 15
    Dernier message: 24/10/2007, 10h52
  5. Button OnClick s'execute deux fois de suite
    Par ToxiZz dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/06/2007, 08h59

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