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

GUI Python Discussion :

Mettre à jour combobox via une fenetre de dialogue [Python 3.X]


Sujet :

GUI Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 42
    Points : 37
    Points
    37
    Par défaut Mettre à jour combobox via une fenetre de dialogue
    Bonjour,
    Je souhaite permettre à l'utilisateur d'ajouter un élément à un combobox. Il clique sur un bouton à côté, une fenêtre de dialogue s'ouvre lui demandant d'entrer un nouveau thème.
    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
     
    class FenetreAjouterTheme (Toplevel):
        def __init__(self,couleur,liste):
            Toplevel.__init__(self,bg="black",bd=2)
     
            self.listethemes = liste
            self.container = Frame(self,bg=couleur)
            self.lbl_nouveau_theme = Label(self.container,text="Veuillez entrer ci-dessous un nouveau thème :",bg=couleur).grid(row=0,column=0,sticky="w")
            self.saisie_nouveau_theme = Entry(self.container,font="Arial 10",width=40)
            self.saisie_nouveau_theme.grid(row=1,column=0)
            self.fen_boutons = Frame(self.container,bg=couleur)
            self.btn_valider_nouveau_theme = Button(self.fen_boutons,text="Valider",command=self.valider)
            self.btn_valider_nouveau_theme.grid(row=0,column=0,padx=20,pady=20)
            self.btn_Annuler_nouveau_theme = Button(self.fen_boutons,text="Annuler",command=self.annuler)
            self.btn_Annuler_nouveau_theme.grid(row=0,column=1)
            self.fen_boutons.grid(row=2,column=0)
            self.container.pack()
     
        def valider(self):
            test="valide"
            for e in self.listethemes:
                if(e==self.saisie_nouveau_theme.get()):
                    showerror("Saisie d'un nouveau thème", "Ce thème est déjà dans la liste")
                    test="non valide"
            if (test=="valide"):
                self.listethemes.append(self.saisie_nouveau_theme.get())
                self.destroy()
     
        def annuler(self):
            self.destroy()
    Ces lignes de code concernent ma fenêtre dans laquelle la personne entre un nouveau thème.
    J'ai appelé lors de la construction une liste qui contient les éléments de mon combobox.
    Je vérifie si ce qui est entré n'est pas présent dans la liste et dans ce cas j'ajoute dans la liste variable de mon objet FenêtreAjouterTheme.
    Le souci est: comment faire passer cette liste à mon combobox présent dans une autre fenêtre?
    Je mets ci-dessous le code qui ouvre ma fenêtre de dialogue, j'imagine que tout se joue dans cette partie. Pour info le nom du combobox est "self.cbx_themes".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def ajouter_theme(self):
            self.fenetre_saisie_nouveau_theme = FenetreAjouterTheme('#DCDCDC',self.liste_themes)
            centrer(fen=self.fenetre_saisie_nouveau_theme,w=288,h=111)
            self.fenetre_saisie_nouveau_theme.overrideredirect(1)
            self.fenetre_saisie_nouveau_theme.grab_set()
            self.fenetre_saisie_nouveau_theme.focus_set()
    J'ai pensé à un self.liste.themes=self.fenetre_saisie.nouveau_theme.listethemes mais sans succes.
    Bref si quelqu’un a une idée je suis preneur. En espérant avoir été clair.
    Merci par avance.

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

    In fine, vous ne pourrez mettre à jour la combobox qu'en passant la nouvelle liste: cbx_themes['values'] = listethemes.
    Pour le reste c'est bien joli de s'initier à la POO mais vous ne montrez pas du tout à quelles classes correspondent les différents "self"...

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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 42
    Points : 37
    Points
    37
    Par défaut
    Merci d'abord pour ta réponse.
    c'est bien joli de s'initier à la POO mais vous ne montrez pas du tout à quelles classes correspondent les différents "self"...
    Heu...j'espère que ce n'est pas de l'agacement que je lis. J'essaye en effet de m'initier à la POO, de comprendre les self, les variables globales, .... et je suis désolé si mon post n'a pas été formulé dans les règles..
    Je pensais que la classe en question importait peu:
    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
     
    # coding: utf8
    from tkinter import *
    from tkinter.ttk import Combobox
    from centrer import *
    from fenetre_ajouter_theme import *
     
    class Competences_Ajouter(Toplevel):
        def __init__(self,fenetre):
            couleur='#DCDCDC'
            Toplevel.__init__(self,bg="black",bd=2)
            self.fenetre=fenetre
     
            #-------------------DIVISION----------------------------
            self.labelframe_division = LabelFrame(self,text="Division",bg=couleur,font="Times 10 bold")
            self.choix_division = StringVar()
            self.rtbn_5 = Radiobutton(self.labelframe_division,text="Cinquième",variable=self.choix_division,value=5,bg=couleur)
            self.rtbn_4 = Radiobutton(self.labelframe_division,text="Quatrième",variable=self.choix_division,value=4,bg=couleur)
            self.rtbn_3 = Radiobutton(self.labelframe_division,text="Troisième",variable=self.choix_division,value=3,bg=couleur)
            self.rtbn_5.select()
            self.rtbn_5.grid(row=0,column=0,padx=10)
            self.rtbn_4.grid(row=0,column=1,padx=10)
            self.rtbn_3.grid(row=0,column=2)
            self.labelframe_division.pack(fill=BOTH,expand=1)
     
            #-------------------THEME----------------------------
            self.labelframe_theme = LabelFrame(self,text="Thème",bg =couleur,font="Times 10 bold")
            self.theme_selectionne = StringVar()
            self.liste_themes = ['---liste des thèmes---']
            self.cbx_themes = Combobox(self.labelframe_theme,values=self.liste_themes, textvariable=self.theme_selectionne,state='readonly',width=40)
            self.cbx_themes.current(0)
            self.cbx_themes.grid(row=0,column=0,padx=10)
            self.btn_ajouter_theme = Button(self.labelframe_theme,text="+",command=self.ajouter_theme)
            self.btn_ajouter_theme.grid(row=0,column=1)
            self.labelframe_theme.pack(fill=BOTH, expand=1)
            #------------SOUS-PARTIE------------------
            self.labelframe_sous_partie = LabelFrame(self,text="Sous-partie",bg =couleur,font="Times 10 bold")
            self.sous_partie_selectionnee = StringVar()
            self.liste_sous_partie = ['---liste des sous-parties---']
            self.cbx_sous_partie = Combobox(self.labelframe_sous_partie,textvariable=self.sous_partie_selectionnee,values=self.liste_sous_partie,state='readonly',width=40)
            self.sous_partie_selectionnee.set(self.liste_sous_partie[0])
            self.cbx_sous_partie.grid(row=0,column=0,padx=10)
            self.cbx_sous_partie.configure(state='disable')
            self.btn_ajouter_sous_partie = Button(self.labelframe_sous_partie,text="+")
            self.btn_ajouter_sous_partie.grid(row=0,column=1)
            self.btn_ajouter_sous_partie.configure(state='disable')
            self.labelframe_sous_partie.pack(fill=BOTH,expand=1)
            #-------------------INTITULE-------------------------
            self.labelframe_intitule = LabelFrame(self,text="Intitulé du savoir",bg =couleur,font="Times 10 bold")
            self.saisie_intitule = Entry(self.labelframe_intitule,font="Arial 10",width=40)
            self.saisie_intitule.grid(row=0,column=1,padx=10)
            self.saisie_intitule.configure(state='disable')
            self.labelframe_intitule.pack(fill=BOTH, expand=1)
     
            #-------------------VALIDER--------------------------
            self.btn_valider = Button(self,text="Valider",background ='#8FA3AD',font="Times 12")
            self.btn_valider.configure(state='disable')
            self.btn_valider.pack(fill=BOTH,expand=1)
     
            #-------------------QUITTER---------------------------
            btn_Quitter=Button(self,text="Quitter et revenir au menu",bg ='#66CC80',command=self.retour,font="Times 12")
            btn_Quitter.pack(fill=BOTH,ipady=2, expand=1)
     
        def retour(self):
            self.fenetre.deiconify()
            self.destroy()
     
        def themesDivisionChoisie(self):
            pass
     
        def ajouter_theme(self):
            self.fenetre_saisie_nouveau_theme = FenetreAjouterTheme('#DCDCDC',self.liste_themes)
            self.cbx_themes['values']=self.fenetre_saisie_nouveau_theme.listethemes
     
            centrer(fen=self.fenetre_saisie_nouveau_theme,w=288,h=111)
            self.fenetre_saisie_nouveau_theme.overrideredirect(1)
            self.fenetre_saisie_nouveau_theme.grab_set()
            self.fenetre_saisie_nouveau_theme.focus_set()
    Je ne maitrise pas en effet la POO et suis prêt à entendre évidemment tout conseil...
    J'ai fait quelques tests en demandant d'afficher le contenu du combobox "cbx_themes": en fait il ne récupère pas la liste de la fenêtre qui est détruite après validation du thème ajouté.
    Je me suis rendu compte que le programme affichait ma fenêtre "self.fenetre_saisie_nouveau_theme = FenetreAjouterTheme('#DCDCDC',self.liste_themes)",ensuite dans la foulée effectutait la fin de la fonction "def ajouter theme(self)" puis terminait après la partie du code qui gère l'ajout du thème.
    Je me suis dit qu'il fallait peut être que je gère mon combobox comme variable globale afin que je modifie directement lors de l'ajout du thème vu que n'arrive pas à récupérer l'élément ajouté une fois la fenêtre détruite.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par kerlouan Voir le message
    Heu...j'espère que ce n'est pas de l'agacement que je lis. J'essaye en effet de m'initier à la POO, de comprendre les self, les variables globales, .... et je suis désolé si mon post n'a pas été formulé dans les règles..
    Je pensais que la classe en question importait peu:
    Une règle à respecter est de poster suffisamment de bouts de code pour qu'on puisse comprendre ce que vous racontez, ce qui est un préalable pour que quelqu'un essaie/puisse vous aider. Dans votre dernier message, vous montrez un peu plus de choses et si le soucis est probablement par là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def ajouter_theme(self):
            self.fenetre_saisie_nouveau_theme = FenetreAjouterTheme('#DCDCDC',self.liste_themes)
            self.cbx_themes['values']=self.fenetre_saisie_nouveau_theme.listethemes
    vous ne montrez rien de "FenetreAjouterTheme", ni de ce que çà retourne.

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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 42
    Points : 37
    Points
    37
    Par défaut
    Heu si j'ai montré....dans le premier post
    Je recopie le code de la classe:
    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
     
     
    class FenetreAjouterTheme (Toplevel):
        def __init__(self,couleur,liste):
            Toplevel.__init__(self,bg="black",bd=2)
     
            self.listethemes = liste
            self.container = Frame(self,bg=couleur)
            self.lbl_nouveau_theme = Label(self.container,text="Veuillez entrer ci-dessous un nouveau thème :",bg=couleur).grid(row=0,column=0,sticky="w")
            self.saisie_nouveau_theme = Entry(self.container,font="Arial 10",width=40)
            self.saisie_nouveau_theme.grid(row=1,column=0)
            self.fen_boutons = Frame(self.container,bg=couleur)
            self.btn_valider_nouveau_theme = Button(self.fen_boutons,text="Valider",command=self.valider)
            self.btn_valider_nouveau_theme.grid(row=0,column=0,padx=20,pady=20)
            self.btn_Annuler_nouveau_theme = Button(self.fen_boutons,text="Annuler",command=self.annuler)
            self.btn_Annuler_nouveau_theme.grid(row=0,column=1)
            self.fen_boutons.grid(row=2,column=0)
            self.container.pack()
     
        def valider(self):
            test="valide"
            for e in self.listethemes:
                if(e==self.saisie_nouveau_theme.get()):
                    showerror("Saisie d'un nouveau thème", "Ce thème est déjà dans la liste")
                    test="non valide"
            if (test=="valide"):
                self.listethemes.append(self.saisie_nouveau_theme.get())
                self.destroy()
     
        def annuler(self):
            self.destroy()
    Je pense comprendre l'idée du problème.
    >Je crée un objet de la classe "FenetreAjouterTheme" nommé "self.fenetre_saisie_nouveau_theme".
    > Cet objet se charge de récupérer le nouvel élément.
    > Mon combobox, ou une liste qui lui serait associé, doit interroger mon objet "self.fenetre_saisie_nouveau_theme" pour lui demander ce qui a été entré.
    Hélas comme je détruis mon objet(car cette fenêtre a évidemment vocation à s'en aller une fois la saisie faite) à priori ca coince.
    Quand j'avais testé java, j'utilisais une fenêtre de dialogue spécifique qui retournait une chaine de caractère tout en détruisant la fenêtre.
    Je suis entrain de réfléchir à cela: demander simplement quand je clique sur valider de retourner la chaine de caractère et demander de détruire mon objet "self.fenetre_saisie_nouveau_theme".
    Je pense que mon problème est un souci d'organisation.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 42
    Points : 37
    Points
    37
    Par défaut
    Bon j'ai trouvé je pense. J'ai modifié de la façon suivante:
    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
     
    class FenetreAjouterTheme (Toplevel):
        def __init__(self,couleur,liste,cbx):
            Toplevel.__init__(self,bg="black",bd=2)
     
            self.listethemes = liste
            self.cbx = cbx###AJOUT d'un combobox comme paramètre. Je donne lors de la création le combobox qui doit être mis à jour.
            self.container = Frame(self,bg=couleur)
            self.lbl_nouveau_theme = Label(self.container,text="Veuillez entrer ci-dessous un nouveau thème :",bg=couleur).grid(row=0,column=0,sticky="w")
            self.saisie_nouveau_theme = Entry(self.container,font="Arial 10",width=40)
            self.saisie_nouveau_theme.grid(row=1,column=0)
            self.fen_boutons = Frame(self.container,bg=couleur)
            self.btn_valider_nouveau_theme = Button(self.fen_boutons,text="Valider",command=self.valider)
            self.btn_valider_nouveau_theme.grid(row=0,column=0,padx=20,pady=20)
            self.btn_Annuler_nouveau_theme = Button(self.fen_boutons,text="Annuler",command=self.annuler)
            self.btn_Annuler_nouveau_theme.grid(row=0,column=1)
            self.fen_boutons.grid(row=2,column=0)
            self.container.pack()
     
     
        def valider(self):
            test="valide"
            for e in self.listethemes:
                if(e==self.saisie_nouveau_theme.get()):
                    showerror("Saisie d'un nouveau thème", "Ce thème est déjà dans la liste")
                    test="non valide"
            if (test=="valide"):
                self.listethemes.append(self.saisie_nouveau_theme.get())
                self.cbx['values']=self.listethemes#Actualisation du combobox
                self.destroy()
     
     
        def annuler(self):
            self.destroy()
    Création de l'objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def ajouter_theme(self):
            self.fenetre_saisie_nouveau_theme = FenetreAjouterTheme('#DCDCDC',self.liste_themes,self.cbx_themes)
            centrer(fen=self.fenetre_saisie_nouveau_theme,w=288,h=111)
            self.fenetre_saisie_nouveau_theme.overrideredirect(1)
            self.fenetre_saisie_nouveau_theme.grab_set()
            self.fenetre_saisie_nouveau_theme.focus_set()
    Ca fonctionne. Quand la fenêtre est détruite, mon combobox est à jour. J'ai du mal à tout comprendre et j'aimerai être certain de mon raisonnement:
    >"self.cbx=cbx" indique que self.cbx et cbx pointent vers la même référence
    >En modifiant l'objet "self.cbx" par une méthode lui appartenant je modifie aussi l'objet appelé "cbx" qui est le combobox qui doit être mis à jour.
    Est cela?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par kerlouan Voir le message
    Hélas comme je détruis mon objet(car cette fenêtre a évidemment vocation à s'en aller une fois la saisie faite) à priori ca coince.
    Quand j'avais testé java, j'utilisais une fenêtre de dialogue spécifique qui retournait une chaine de caractère tout en détruisant la fenêtre.
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import tkinter as tk
    >>> class A(tk.Toplevel):
    ...     def __init__(self, liste):
    ...         super().__init__()
    ...         self.liste = liste
    ...     def append(self, elt):
    ...         self.liste.append(elt)
    ...
    On crée la Toplevel avec une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> L = [1, 2, 3]
    >>> a = A(L)
    La fenêtre s'affiche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> a.append('z')
    >>> a.destroy()
    La liste initiale est modifiée puisqu'elle a été passée en référence et on accède toujours à l'attribut "liste" de l'instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> L
    [1, 2, 3, 'z']
    >>> a.liste
    [1, 2, 3, 'z']
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 42
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup encore une fois. Ca me donne à réfléchir. Vos exemples sont d'une simplicité déconcertante.
    Merci encore.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/06/2009, 10h53
  2. Affichage combobox dans une boite de dialogue
    Par Tof_06 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 05/02/2008, 12h22
  3. [2.0][VB] Selection d'une valeur via une fenetre popup
    Par mout1234 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 23/11/2006, 23h41
  4. Mettre un scroled sur une fenetre
    Par mcdonald dans le forum Tkinter
    Réponses: 2
    Dernier message: 19/10/2006, 07h57
  5. [D6][MSSQL]Mettre un combobox lié à une table dans un DBGrid
    Par david_chardonnet dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/05/2005, 12h06

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