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 :

Récupérer valeur Entry et les enregistrer dans un dictionnaire


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Electricien
    Inscrit en
    Septembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Electricien

    Informations forums :
    Inscription : Septembre 2022
    Messages : 5
    Par défaut Récupérer valeur Entry et les enregistrer dans un dictionnaire
    Bonjour à tous,
    Tout d'abord désolés je suis nouveau sur le forum et je ne sais pas si je suis au bon endroit.

    Je tiens à vous remercier par avance pour vos retours.

    je tiens à préciser également que je suis débutant en Python

    je suis entrain de développer une application pour rédiger des rapports de visite de maintenance pour mon travail.

    Cependant j'ai beaucoup de formulaires Tkinter, donc pleins d'entry et de StringVar() afin de diminuer mes lignes j'aimerais savoir si je peux utiliser les dictionnaires?

    j'ai réussi à faire quelque chose avec l'aide de Google.
    Par contre je n'arrive pas à supprimer le boutton Valider car je voudrais avoir une incrémentation automatique

    je vous mets le code 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import tkinter
    from tkinter import*
    
    app = tkinter.Tk()
    
    class beta:
        def __init__(self):
            self.dic_sdi = {"Fabricant": "dcdc", "Réference": ""}
    
        def testa(self):
            self.list_entry=list()
            for key,valeur in self.dic_sdi.items():
                label = tkinter.Label(app,text=key,width=100)
                label.pack()
                entry = tkinter.Entry(app)
                entry.pack()
                self.list_entry.append((key,entry))
    
                print(key)
            tkinter.Button(app,text="Valider",command=self.valider).pack()
    
        def valider (self):
            self.dic_sdi={key: entry.get() for key,entry in self.list_entry}
            print(self.dic_sdi)
    
    
    
    Beta = beta()
    Beta.testa()
    app.mainloop()

    je vous remercie par avance.

    Cordialement,

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par sneck33430 Voir le message
    Tout d'abord désolés je suis nouveau sur le forum et je ne sais pas si je suis au bon endroit.
    Sisi, t'es exactement où il faut.

    Citation Envoyé par sneck33430 Voir le message
    Cependant j'ai beaucoup de formulaires Tkinter, donc pleins d'entry et de StringVar() afin de diminuer mes lignes j'aimerais savoir si je peux utiliser les dictionnaires?
    Bien entendu. Enfin il faudrait que tu saches quoi en faire mais sinon oui, tu peux toujours remplacer toute instruction de type varA="toto"; varB="titi" par var={"A" : "toto", "B" : "titi"}.

    Citation Envoyé par sneck33430 Voir le message
    Par contre je n'arrive pas à supprimer le boutton Valider car je voudrais avoir une incrémentation automatique
    Hum, donc tu voudrais que le formulaire se valide sans bouton "valider". Et donc à quel moment il se validera? Quand tu remplis tous les champs? Et que se passe-t-il si l'utilisateur fait une erreur? Comment peut-il la corriger?
    Bon pour ma part je connais pas Tk (je suis plus Qt) mais quelque chose me dit que cette IHM doit contenir un truc disant "quand champ rempli/modifié alors faire"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Electricien
    Inscrit en
    Septembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Electricien

    Informations forums :
    Inscription : Septembre 2022
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut

    Sisi, t'es exactement où il faut.


    Bien entendu. Enfin il faudrait que tu saches quoi en faire mais sinon oui, tu peux toujours remplacer toute instruction de type varA="toto"; varB="titi" par var={"A" : "toto", "B" : "titi"}.


    Hum, donc tu voudrais que le formulaire se valide sans bouton "valider". Et donc à quel moment il se validera? Quand tu remplis tous les champs? Et que se passe-t-il si l'utilisateur fait une erreur? Comment peut-il la corriger?
    Bon pour ma part je connais pas Tk (je suis plus Qt) mais quelque chose me dit que cette IHM doit contenir un truc disant "quand champ rempli/modifié alors faire"...
    Merci Sve@r pour ton retour et en plus rapide...

    je vais essayer de faire simple dans mon programme j'utilise des frames avec mes formulaires mais des que je change d'onglet ( formulaire) je fais un destroy de la frame.
    quand j'utilise les StringVar l'applis me conserve les réponses des entry et des que l'utilisateur reviens sur le formulaire les valeurs son incrémenter dans les entry sans bouton.
    Mais malheureusement dans le programme j'ai environ une centaine de ENTRY donc beaucoup de StringVar()

    je te remercie.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    Par défaut
    bonjour
    Citation Envoyé par sneck33430 Voir le message
    Cependant j'ai beaucoup de formulaires Tkinter, donc pleins d'entry et de StringVar() afin de diminuer mes lignes j'aimerais savoir si je peux utiliser les dictionnaires?
    Pas compris la question, mais si je comprends, ton code présenté n'a rien a voir avec ton application ? Tu nous demandes comment intégrer ce code dans ton application que nous ne connaissons pas ?
    - Tu utilises déjà un dictionnaire self.dic_sdi donc question pas claire...
    - Tu as 100 formulaires avec 2 entrées ? il faut donc simplement passer le dictionnaire en paramètre de la méthode __init__() ou mieux à la méthode testa(), avec en plus un compteur

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par sneck33430 Voir le message
    donc pleins d'entry et de StringVar() afin de diminuer mes lignes j'aimerais savoir si je peux utiliser les dictionnaires?
    Oui, on peut.


    Par contre je n'arrive pas à supprimer le boutton Valider car je voudrais avoir une incrémentation automatique
    supprimer ou ne plus afficher, c'est des méthodes à appliquer à l'instance de l'objet Button.... or dans votre code, vous ne gardez pas de référence à l'objet.

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Electricien
    Inscrit en
    Septembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Electricien

    Informations forums :
    Inscription : Septembre 2022
    Messages : 5
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    Pas compris la question, mais si je comprends, ton code présenté n'a rien a voir avec ton application ?
    - Tu utilises déjà un dictionnaire self.dic_sdi donc question pas claire...
    - Tu as 100 formulaires avec 2 entrées ? il faut donc simplement passer le dictionnaire en paramètre de la méthode __init__() ou mieux à la méthode testa(), avec en plus un compteur
    Bonjour papajoker,

    désoler c'est difficile d'expliquer quand on est à fond dans le projet.
    le code que j'ai diffusé c'est un test et non mon programme. car je ne peux pas le diffuser il est illisible je suis entrain de l'améliorer.
    Concernant mes formulaire j'ai une dizaine d'onglet dont dans chaque une quinzaine d'entrer.

    Ma question peut-on modifier mon exemple pour que la valeur de chaque entry se génère automatiquement dans le dictionnaire ?
    j'ai essayé avec un entry.bind("<KeyPress>',self.valider) mais impossible.

    auriez-vous des pistes svp?

    merci par avance.

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    Par défaut
    C'est donc a peu près ce que j'avais compris

    Tu as déjà créé 10 formulaires dans 10 onglets ?

    1) comme dit plus haut, tu passes ton dico en parametres à .test(a)
    2) tu peux utiliser ta méthode .valider() pour récupérer les datas du formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    onglets[1] = beta({"client":"", "adresse":""})  # class beta
    onglets[2] = beta({"temps":"", "tarif":""}) 
    ...
    # active un onglet:
    onglet[x].testa(moncompteur)
     
     
    ...
     
    # bouton valider général:
    pour tous onglets:
       onglets[x].valider()
       data = data + onglets[x].dic_sdi

  8. #8
    Membre à l'essai
    Homme Profil pro
    Electricien
    Inscrit en
    Septembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Electricien

    Informations forums :
    Inscription : Septembre 2022
    Messages : 5
    Par défaut
    merci pour ton retour.
    Voici une impression écran du soft.
    Pour info chaque formulaire est différents.

    Nom : Exemple.png
Affichages : 449
Taille : 292,8 Ko

    comme écrit précédemment je suis entrain de le retaper en recommençant depuis le début afin de l'améliorer.

    Voici le fichier main.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from Pages import Page_Accueil,Page_SDI
    from apparence_app import Designe_App
     
    accueil = Page_Accueil()
    accueil.affichage()
     
    Designe_App().window.mainloop()
    fichier apparence.app.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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    from tkinter import Tk, Label, Entry, Frame, Checkbutton, Button, Canvas, PhotoImage
    import tkinter as tk
    import Pages
     
    window = tk.Tk()
     
    class Designe_App:
     
        def __init__(self):
            self.window = window
            self.window.config(bg="#FB9926")
            self.window.geometry("1200x900")
            self.window.minsize(width=800, height=600)
            self.window.maxsize(width=1920, height=1080)
     
            self.couleur_bg_haut = "#FFE5C3"
            self.couleur_bg_milieu = "#FDF5E6"
            self.couleur_bg_bas = "#D84F18"
            self.couleur_bg_milieu_gauche = "#FDF5E6"
            self.couleur_sous_titre = "#FFE5C3"
            self.window.title("FMA")
            self.version_app = ("1.001")
            # on définit le nombres de row et column
            for i in range(3):
                self.window.grid_rowconfigure(i+2, weight=1)
            self.window.grid_columnconfigure(0, weight=1)
     
     
     
     
            self.variable_app()
     
     
        def banniere(self, path_image,rubrique):
            self.rubrique = rubrique
            self.image = PhotoImage(file=path_image)
            self.w, self.h = self.image.width(), self.image.height()
            self.canvas = Canvas(self.frame_haut, width=2200, height=400,highlightthickness=0)
            self.canvas.grid(row=0,column=0)
            self.canvas.create_image((self.w //3, self.h / 2500), image=self.image)
            self.canvas.create_text(200, 150, text="Rapport SSI",fill="black",font="Times 30 bold")
            self.canvas.create_text(250, 365, text=self.rubrique, fill="white", font="Times 15 bold")
     
        def variable_app(self): #Variable + Liste menu tableau de bord
            self.liste_label_tableaudebord = ["DISSI", "SDI", "SMSI", "Check-up", "UGA", "DSF", "SSS", "Observation"]
            self.liste_label_alim_sdi = ["ECS ", "EAE n°1", "EAE n°2", "EAE n°3", "EAE n°4", "EAE n°5", "EAE n°6", "EAE n°7"]
     
            # Variable SDI
     
     
            self.fabricant_sdi = tk.StringVar()
            self.reference_sdi = tk.StringVar()
            self.date_sdi = tk.StringVar()
            self.localisation_sdi = tk.StringVar()
            self.versionsoft_sdi = tk.StringVar()
            self.date_prog_sdi = tk.StringVar()
            self.nb_boucle_sdi = tk.StringVar()
            self.nb_boucle_sdi_equipe = tk.StringVar()
            self.nb_boucle_sdi_utilise = tk.StringVar()
            self.sdi_reseau = tk.BooleanVar()
            self.sdi_maitre = tk.BooleanVar()
            self.sdi_esclave = tk.BooleanVar()
            self.sdi_estampile = tk.BooleanVar()
     
        def frame_principal_app(self):
    #region Haut du APP
     
            self.frame_haut = tk.Frame(self.window, bg=self.couleur_bg_haut)
            self.frame_haut.grid(row=0, column=0, sticky="w")
            self.frame_haut.grid_rowconfigure(0,weight=1)
            self.frame_haut.grid_rowconfigure(1, weight=1)
            for i in range(1):
                self.frame_haut.grid_columnconfigure(0,weight=1)
     
    #endregion
    #region milieu APP
     
            self.frame_milieu = Frame(self.window, bg=self.couleur_bg_milieu)
            self.frame_milieu.grid(rowspan=3, column=0, sticky="nsew")
            self.frame_milieu.grid_rowconfigure(0, weight=1)
            self.frame_milieu.grid_columnconfigure(0, weight=0)
            self.frame_milieu.grid_columnconfigure(1, weight=1)
            self.frame_milieu.grid_columnconfigure(2, weight=0)
     
        #region milieu gauche APP
     
            self.frame_milieu_gauche = Frame(self.frame_milieu, bg=self.couleur_bg_milieu_gauche, highlightthickness = 5, highlightbackground = self.couleur_bg_milieu)
            self.frame_milieu_gauche.grid(row=0, column=0, sticky="nsew")
            for i in range(len(self.liste_label_tableaudebord)+25):
                self.frame_milieu_gauche.grid_rowconfigure(i,weight=1)
            self.frame_milieu_gauche.grid_columnconfigure(0, weight=1)
     
        #endregion
        #region mileu centre APP
     
            self.frame_milieu_centre = Frame(self.frame_milieu, bg=self.couleur_bg_milieu)
            self.frame_milieu_centre.grid(row=0, column=1, sticky="nsew",pady=0)
            for i in range(30):
                self.frame_milieu_centre.grid_rowconfigure(i, weight=1)
            for i in range(5):
                self.frame_milieu_centre.grid_columnconfigure(i, weight=1)
            self.frame_sous_tableaudebord = Frame(self.frame_milieu_centre,bg=self.couleur_bg_milieu)
            self.frame_sous_tableaudebord.grid(row=1,columnspan=10)
            for i in range(len(self.liste_label_alim_sdi)):
                self.frame_sous_tableaudebord.columnconfigure(i,weight=1)
            self.frame_sous_tableaudebord.rowconfigure(0,weight=1)
        #endregion
        #region milieu droite
     
            self.frame_milieu_droite = Frame(self.frame_milieu, bg=self.couleur_bg_milieu)
            self.frame_milieu_droite.grid(row=0, column=2, sticky="nsew",padx=20)
            for i in range(len(self.liste_label_alim_sdi)):
                self.frame_milieu_droite.grid_rowconfigure(i, weight=1)
            self.frame_milieu_droite.grid_columnconfigure(2, weight=1)
     
        #endregion
    #endregion
     
            self.frame_bas = Frame(self.window,bg=self.couleur_bg_bas)
            self.frame_bas.grid(row=4, column=0, sticky="nsew")
            self.frame_bas.grid_rowconfigure(0, weight=1)
            self.frame_bas.grid_columnconfigure(0, weight=1)
        def destroy_frame_principal_app(self):
            self.frame_haut.destroy()
            self.frame_milieu.destroy()
            self.frame_bas.destroy()
     
        def haut_app(self, rubrique=None):
            self.rubrique=rubrique
            self.banniere('banniere.gif', self.rubrique)
            #self.titre = titre
            #self.label_titre = tk.Label(self.frame_haut, bg=self.couleur_bg_haut, text=self.titre,font=("times",30,"bold"))
            #self.label_titre.grid(row=0, column=1,ipadx=100,ipady=130,sticky="nw")
     
     
        def milieu_gauche_app(self):
            for i in range(len(self.liste_label_tableaudebord)):
                Button(self.frame_milieu_gauche,text=self.liste_label_tableaudebord[i],font=("arial",15,"bold"),width=10,bg=self.couleur_bg_haut,fg="black", command=lambda:Pages.Page_SDI.affichage(self)).grid(row=i+10,column=0,pady=10,padx=10)
     
        def milieu_centre_app(self, titre=None, liste_label_entry=None, liste_entry=None,taille_entry=None, liste_label_checkup=None, liste_checkup = None ):
     
            self.liste_label_entry = liste_label_entry
            self.taille_entry = taille_entry
            self.liste_entry = liste_entry
            self.liste_label_checkup = liste_label_checkup
            self.liste_checkup = liste_checkup
            for i in range(len(self.liste_label_alim_sdi)):
                Button(self.frame_sous_tableaudebord, text=self.liste_label_alim_sdi[i], font=("arial", 10, "bold"),bg=self.couleur_bg_milieu, height=1,
                       width=10).grid(row=0, column=i, sticky="n",pady=10)
     
     
            self.rows = 5
     
            if self.liste_entry != None:
                for i in range (len(self.liste_label_entry)):
                    if (i% 2) == 0:
                        Label(self.frame_milieu_centre,bg=self.couleur_bg_milieu, text=self.liste_label_entry[i],font=("arial", 10, "bold")).grid(row=self.rows,column=0,sticky="e",padx=5)
                        Entry(self.frame_milieu_centre,bg=self.couleur_bg_milieu,textvariable=self.liste_entry[i], width=int(self.taille_entry[i]), font=("arial", 10)).grid(row=self.rows,column=1,sticky="w")
                        self.rows += 1
                    else:
                        Label(self.frame_milieu_centre, bg=self.couleur_bg_milieu, text=self.liste_label_entry[i],font=("arial", 10, "bold")).grid(row=self.rows-1,column=2,sticky="e",padx=5)
                        Entry(self.frame_milieu_centre, bg=self.couleur_bg_milieu, textvariable=self.liste_entry[i], width=int(self.taille_entry[i]), font=("arial", 10)).grid(
                            row=self.rows-1, column=3,sticky="w")
                        self.rows += 1
     
            if self.liste_checkup != None:
                for i in range (len(self.liste_label_checkup)):
                    if i <= 4:
                        Checkbutton(self.frame_milieu_centre, bg=self.couleur_bg_milieu, text=self.liste_label_checkup[i],variable=self.liste_checkup[i],onvalue=1,offvalue=0,font=("arial", 10, "bold")).grid(row=self.rows+1,column=i,sticky="nse")
                    elif i >= 5:
                        Checkbutton(self.frame_milieu_centre, bg=self.couleur_bg_milieu, text=self.liste_label_checkup[i],variable=self.liste_checkup[i],onvalue=1,offvalue=0,font=("arial", 10, "bold")).grid(row=self.rows+2, column=i,sticky="nse")
     
        def milieu_droite_app(self, text):
            pass
        def bas_app(self, text="By xxx"):
            self.text = text
            self.label_text = tk.Label(self.frame_bas, bg=self.couleur_bg_bas, fg="white", text=self.text)
            self.label_text.grid(row=0, column=0,ipady=20, ipadx=60,sticky="e")
            self.label_text = tk.Label(self.frame_bas, bg=self.couleur_bg_bas, fg="white", text=f"Version: {self.version_app}")
            self.label_text.grid(row=0, column=0, ipady=20, ipadx=60, sticky="w")
    fichier Pages.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
    import tkinter
     
    from apparence_app import Designe_App
     
     
    class Page_Accueil(Designe_App):
             def __init__(self):
                super().__init__()
                self.entry_petit = 10
                self.entry_grand = 30
                self.taille_entry = [self.entry_grand, self.entry_grand, self.entry_petit, self.entry_grand, self.entry_petit,
                self.entry_petit, self.entry_petit, self.entry_petit, self.entry_petit]
                self.liste_label_entry = ["Fabricant:", "Reférence:", "Date:", "Localisation ECS:", "Version logiciel:",
                                           "Date de programmation:", "Nbre boucles/lignes:",
                                           "Nbre boucles/lignes \n                   équipées:",
                                           "Nbre boucles/lignes \n                     utilisées:"]
                self.liste_entry = [self.fabricant_sdi, self.reference_sdi, self.date_sdi, self.localisation_sdi,
                                     self.versionsoft_sdi, self.date_prog_sdi, self.nb_boucle_sdi, self.nb_boucle_sdi_equipe,
                                     self.nb_boucle_sdi_utilise]
                self.liste_label_checkup = ["ECS en Reseau", "Maître", "Esclave",
                                             "Estampile NF"]
                self.liste_checkup = [self.sdi_reseau, self.sdi_maitre, self.sdi_esclave,
                                       self.sdi_estampile]
     
     
             def affichage(self):
                 self.frame_principal_app()
                 self.haut_app(rubrique="Accueil")
                 self.milieu_gauche_app()
                 self.milieu_droite_app("Sous-menu AES 1 EAE 1....")
                 self.bas_app()
     
    class Page_SDI(Designe_App):
        def __init__(self):
            super().__init__()
            self.entry_petit = 10
            self.entry_grand = 30
            self.taille_entry = [self.entry_grand, self.entry_grand, self.entry_petit, self.entry_grand, self.entry_petit,
                                 self.entry_petit, self.entry_petit, self.entry_petit, self.entry_petit]
            self.liste_label_entry = ["Fabricant:", "Reférence:", "Date:", "Localisation ECS:", "Version logiciel:",
                                      "Date de programmation:", "Nbre boucles/lignes:",
                                      "Nbre boucles/lignes \n                   équipées:",
                                      "Nbre boucles/lignes \n                     utilisées:"]
            self.liste_entry = [self.fabricant_sdi, self.reference_sdi, self.date_sdi, self.localisation_sdi,
                                    self.versionsoft_sdi, self.date_prog_sdi, self.nb_boucle_sdi, self.nb_boucle_sdi_equipe,
                                    self.nb_boucle_sdi_utilise]
            self.liste_label_checkup = ["ECS en Reseau", "Maître", "Esclave",
                                        "Estampile NF"]
            self.liste_checkup = [self.sdi_reseau, self.sdi_maitre, self.sdi_esclave,
                                  self.sdi_estampile]
     
        def affichage(self):
            self.destroy_frame_principal_app()
            self.frame_principal_app()
            self.haut_app(rubrique="SDI")
            self.milieu_gauche_app()
            self.milieu_centre_app(liste_label_entry=self.liste_label_entry, liste_entry=self.liste_entry,
                                   taille_entry=self.taille_entry, liste_label_checkup=self.liste_label_checkup,
                                   liste_checkup=self.liste_checkup)
            self.milieu_droite_app("Sous-menu AES 1 EAE 1....")
            self.bas_app()
    mais j'ai encore beaucoup de boulot les liens ne sont pas encore faits.

    je pense que tu va trouver beaucoup d'erreur.

    je suis preneur afin d'apprendre et d'améliorer mon programme.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par sneck33430 Voir le message
    Ma question peut-on modifier mon exemple pour que la valeur de chaque entry se génère automatiquement dans le dictionnaire ?
    C'est déjà ce qui est fait dans le premier code que vous avez posté.

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

  10. #10
    Invité
    Invité(e)
    Par défaut
    Moi j'ai pas compris mais je propose quand même un truc :
    Sauvegarder les Entry d'un onglet quand tu survoles le bouton d'un onglet, la liste des bind (ici : <Enter>):
    https://stackoverflow.com/questions/...nswer-32289245

    Il suffirait alors d'assigner la valeur des champs dans un dictionnaire si c'est ton souhait :
    Si tu veux pas t'embêter tu peux créer une fonction qui teste quelles sont les Entry visibles : for widget in frame.winfo_children() : if widget.winfo_ismapped() au moment du survol et tu sauves ce qui a été saisi dans un dico.

    A voir, si c'est safe... Je pense qu'il y a plus logique.

    NB : Attention à ne pas utiliser le terme validation à mauvais escient : https://anzeljg.github.io/rin2/book2...alidation.html
    PS : Je ne détruirais pas les onglets quant à moi, mais je les cacherais.

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Si tu veux pas t'embêter tu peux créer une fonction qui teste quelles sont les Entry visibles : for widget in frame.winfo_children() : if widget.winfo_ismapped() au moment du survol et tu sauves ce qui a été saisi dans un dico.
    Si on affiche plusieurs Entry, on doit savoir à quoi chacune d'elle correspond => fabriquer la collection des Entry, collection qui permettra d'y retrouver ses petits que ce soit une liste, un dictionnaire ou un tuple.
    C'est ce qui est déjà réalisé dans le premier code via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        def testa(self):
            self.list_entry=list()
            for key,valeur in self.dic_sdi.items():
                ...
                entry = tkinter.Entry(app)
                ...
                self.list_entry.append((key,entry))
    La question était: "peut on utiliser un dictionnaire?"... à laquelle on ne peut que répondre oui sauf à raconter les difficultés qu'on a rencontré pour le faire.

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

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    Par défaut
    Ta solution par rapport à la capture écran

    En fait, elle n'est pas bonne car tu utilises des formulaires trop complexes:
    - mise en page complexe (2 colonnes + une ligne en dessous + ?)
    - pas que des entées texte simple (checkbox + peut-être ailleurs des listes type combo ?)


    Mais en fait ton code dans apparence.app.py# milieu_centre_app() génère le formulaire depuis un tableau, donc générer depuis un dico ne change pas grand chose...
    Ton problème est plus comment récupérer les données ? mais avec un tableau(actuellement) ou dico(code premier message), cela ne change rien
    --------

    par contre, dans ta page apparence.app.py, oui, tu peux remplacer tous tes self.xxx_sdi par un dictionnaire self.sdi et pas obligé d'utiliser les types tk.xxxVarpeut être plutot un tableau de dictionnaires type self.sdi["onglet1"] = {client:"", adresse:"", } (beaucoup plus pratique pour une modification des entrées ou l'on peut réinjecter les datas dans l'onglet)

  13. #13
    Membre à l'essai
    Homme Profil pro
    Electricien
    Inscrit en
    Septembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Electricien

    Informations forums :
    Inscription : Septembre 2022
    Messages : 5
    Par défaut
    Bonjour,
    Merci pour vos retour.
    Bon je pense que je vais reprendre la totalité de mon code (pas grave cela me forme...)

    Par contre je suis désolé mais j'ai du mal à vous suivre (NOVICE)

    si j'essaie de comprendre tu me dit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # un tableau de dictionnaire exemple
     
    self.tab_onglet={}
    self.dict_sdi = {"Fabricant": "", "Reference":""...}
    self.dict_smsi = {"Fabricant": "", "Reference":""...}
     
    self.tab_onglet = {"onglet sdi":self.dict_sdi, "onglet smsi": self.dict_smsi}
    "beaucoup plus pratique pour une modification des entrées ou l'on peut réinjecter les datas dans l'onglet" La je ne vois pas je suis vraiment désolée.

    Après j'ai pleins de questions comment structurer mon code avec plusieurs class:

    une class Design (avec les différents Frame)
    une class par onglet?
    une class enregistrer les tab en format .TXT
    une class imprimer en PDF


    je suis désolé de vous poser autant de questions...


    en tout cas merci pour vos retour et pour votre patience.

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par sneck33430 Voir le message
    Après j'ai pleins de questions comment structurer mon code avec plusieurs class
    Déjà vous n'êtes pas obligé d'utiliser des "class" pour programmer avec tkinter.

    Ensuite, un class sert d'abord à fabriquer un moule pour créer plusieurs objets semblables et/ou une interface avec l'utilisateur (de la classe) lui rendant un certain nombre de services via ses méthodes.

    Avec tkinter, ce qui apparaît à l'écran a une structure hiérarchique: une fenêtre qui contient des Frame qui contiendront différents widgets. On peut aussi avoir des fenêtres secondaires (un écran de saisie) qui apparaît pour permettre à l'utilisateur d'entrer des informations et de les valider.
    Intuitivement, tant qu'on reste dans la partie GUI, on a intérêt à fabriquer des widgets (i.e. des classes qui héritent de Frame ou de Toplevel).

    Le problème avec les "class" c'est que ce sont des boîtes a priori "étanches" qui ne pourront pas communiquer n'importe comment avec d'autres (instances de) class. C'est ce qui fait que la POO n'est pas intuitive: ça s'apprend... car on ne peut pas découper son code en "class" n'importe comment.

    Par contre je suis désolé mais j'ai du mal à vous suivre (NOVICE)
    Vous n'êtes déjà pas à l'aise avec les dictionnaires qui sont une des structures principales du langage... Comment structurer votre code avec Python? Comment mettre en forme votre GUI avec tkinter? Il ne suffit pas de le vouloir, il faut avoir passer du temps à comprendre, passé du temps dans la documentation pour voir les possibilités des différents widgets et savoir les mettre en oeuvre...

    A défaut, arrivé à un certain niveau de complexité, vous n'allez plus rien maîtriser et comme votre code n'aura pas été pensé, personne ne pourra vous aider (car il faudra ré-écrire tout ou partie ...).

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

Discussions similaires

  1. Récupérer les données des champs cloner et les enregistrer dans table mysql
    Par kerllymay dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 18/01/2020, 14h41
  2. [MySQL] Récupérer les saisies d'un formulaire et les enregistrer dans une table MySQL
    Par dustman dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/07/2019, 10h52
  3. Réponses: 13
    Dernier message: 03/02/2019, 09h12
  4. comment récupérer des resrvations et les enregistrer dans la base de donnée
    Par nizardinho dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 22/09/2015, 07h53
  5. trier les enregistrements dans un sous-formulaire
    Par moicats dans le forum Access
    Réponses: 3
    Dernier message: 30/03/2006, 11h03

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