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 :

Récupérer une valeur depuis un module qui lance une fenêtre Toplevel - Tkinter + Classes


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Récupérer une valeur depuis un module qui lance une fenêtre Toplevel - Tkinter + Classes
    Bonjour à vous,

    Je me suis lancé un défi : construire une application avec python qui comprend une GUI + une base de données MySQL, un truc qui soit un peu aboutit.
    Pour ma GUI, j'utilise Tkinter, avec une fenêtre principale dans un module principal. Puis je fais appel à des modules contenant mes pages secondaires.
    Dans une de mes pages secondaires, je fais appel à une fenêtre Toplevel qui d'afficher une Listbox me permettant de faire un choix.
    Pour faire ce choix, j'utilise la méthode .curselection() associée à Listbox.
    Mon problème est de revenir à mon module principal, tout en récupérant la variable du module secondaire !
    J'ai réussi à faire passer une variable depuis mon module principal vers un module secondaire, et cela fonctionne très bien.
    Mais là je voudrais faire l'inverse.

    J'ai vu un cas ressemblant à mon problème dans le forum, mais celui-ci faisait appel à une boite de dialogue...
    Mais je n'ai pas encore assez d'expérience pour parvenir à adapter les solutions proposées à mon cas.

    Jusqu'à présent, j'ai toujours réussi à me débrouiller, à chercher, laisser mariner le problème, puis trouver !
    Mais sur ce coup là je suis bloqué, j'ai retourné le problème dans tous les sens (que je connais), mais là je cale !

    Il se pourrait également que je m'y prenne mal, à un endroit ou un autre dans l'utilisation des classes ou des instances...
    Je suis ouvert à toute critique me permettant d'améliorer ma pratique.

    Merci pour votre aide !
    Doms.

    Voici les codes allégés des deux modules : le principal, et le secondaire
    Il y a tout pour exécuter les scripts.

    "main_window" :

    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
    from tkinter import *
    from category_top_window import *
    #from category_top_window import Category_top_window
     
    # master page: ################################################################
     
    class Main_window: # # create main window and associated frame
        def __init__(self):
            self.window = Tk()
            self.window.geometry("300x100")
            self.frame = Frame(self.window)
            self.frame.pack(expand= YES)
            Category(self.frame) # call "Category" function
     
    #######################################################################################
     
    class Category():
        def __init__(self, frame):
            self.frame = frame
            self.category_field() # execute "category_field" function when initializing
     
        def category_field(self):
            # button definition:
            self.category_button = Button(self.frame, text= 'category')
            self.category_button.grid(row= 1, column = 1)
     
            # execute "category_command" function when button is pressed
            self.category_button.bind("<ButtonRelease-1>",self.category_command)
     
            # entry definition
            self.category_field_entry = Entry(self.frame)
            self.category_field_entry.grid(row= 1, column= 2)
     
        def category_command(self, event):
     
            # Voici ce que je souhaiterai faire pour récupérer la valeur du second module
            # mais ce genre de chose fonctionne avec une "fonction", pas avec un objet Tk !
            self.cat = Category_top_window()
            self.category_field_entry.insert(0, self.cat)
            # le résultat de cette commande est :
            # <category_top_window.Category_top_window object at 0x7f431f31e978>
     
     
    if __name__ == '__main__':
        main_page = Main_window()
        main_page.window.mainloop()
    "category_top_window" :

    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
    from tkinter import *
     
    class Category_top_window():
     
        def __init__(self): # create Toplevel window and associated frame
            self.top_window = Toplevel()
            self.top_window.geometry("200x400")
            self.frame = Frame(self.top_window)
            self.frame.pack(expand= YES)
            Select_category(self.frame, self.top_window)
     
    #############################################################
     
    class Select_category():
     
        def __init__(self, frame, top_window):
            self.frame = frame
            self.top_window = top_window
            self.category_field() # call "category_field" function
            self.select_button() # call "select_button" function
     
    ########################################################################
     
        def category_field(self): # create a Scrollbar + Listbox for selection of the category
            Label(self.frame, text= 'Category').grid(row= 1, column= 1)
     
            category_list = ['Poésie', 'Peinture', 'Musique', 'Philosophie', 'Linguistique', 'Histoire']
     
            self.scrollbar = Scrollbar(self.frame)
            self.scrollbar.grid(row= 2, column= 1,sticky= 'w')
     
            self.category_box = Listbox(self.frame, yscrollcommand = self.scrollbar.set)
            for category in category_list:
                self.category_box.insert(END, category)
            self.category_box.grid(row= 2, column= 1,sticky= 'w')
     
    ############################################################################
     
        def select_button(self): # create selection button to get the selected item in "category_list"
     
            # button definition:
            self.selection_button = Button(self.frame, text= "select a category")
            self.selection_button.grid(row= 3, column= 1)
     
            # execute "select_command" function when button is pressed
            self.selection_button.bind("<ButtonRelease-1>",self.select_command)
     
        def select_command(self,event): 
            # get the selected item in "category_list"
            self.selected_category = self.category_box.get(self.category_box.curselection())
            print(self.selected_category)
            # Voici la variable que je souhaite retourner vers le module "main_window" !!
            # je ne souhaite pas simplement l'imprimer, mais la récupérer et l'utiliser dans le module principal
     
            # Enfin, je remerme la fenêtre secondaire Toplevel        
            self.top_window.destroy()

  2. #2
    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
    Salut,

    Citation Envoyé par Domsdev Voir le message
    Mon problème est de revenir à mon module principal, tout en récupérant la variable du module secondaire !
    Essayez d'abord de simplifier: comme vous faites from category_top_window import *, autant tout avoir dans un seul script (au moins dans un premier temps).

    Cela fait, c'est un soucis de POO qui n'a rien à voir avec tkinter.

    Imaginez deux classes A et B.
    Pour que l'exécution d'une méthode de A modifie/appelle une méthode d'une instance de B, il faut que l'instance de A sache retrouver l'instance de B.
    La méthode la plus simple est de stocker l'objet instance de B dans un de ses attributs de A.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A:
        def __init__(self, b):
             self.b = b
        def update(self, s):
             self.b.update(s)
     
    class B:
        def update(self, s):
             print (s)
     
    b = B()
    a = A(b)
    a.update('foo')
    Pour le reste, si vous ne savez pas trop utiliser la POO, vous n'avez pas trop besoin de l'utiliser pour programmer avec tkinter (et c'est une chance puisque vous pouvez l'apprendre plus tard).

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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Merci pour votre réponse rapide !!
    J'ai plutôt envie d'utiliser les classes en fait,
    Car ce projet est aussi pour moi un support d'apprentissage !!

    Je vais regarder de plus près votre proposition faisant appel aux classes et essayer de trouver comment l'adapter à mon code.
    Je pense avoir compris le principe !

    Je posterai alors ma nouvelle version de code !

    Merci encore !
    Doms.

  4. #4
    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
    Salut,

    Citation Envoyé par Domsdev Voir le message
    J'ai plutôt envie d'utiliser les classes en fait,
    Car ce projet est aussi pour moi un support d'apprentissage !!
    Regardez aussi les tutoriels d'effbot sur les boites de dialogues.
    Çà ne répond pas à la question posée mais à comment récupérer des informations d'une boite de dialogue.

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

Discussions similaires

  1. Récupérer l'information sur le user qui lance le trigger
    Par frantz44 dans le forum Développement
    Réponses: 5
    Dernier message: 13/05/2019, 10h47
  2. Récupérer la valeur depuis TextView
    Par Zalawy dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 08/06/2013, 21h15
  3. Réponses: 2
    Dernier message: 09/09/2008, 21h59
  4. Récupérer une fenêtre
    Par vg-matrix dans le forum Débuter
    Réponses: 2
    Dernier message: 21/01/2008, 08h43
  5. [VBScript] Récupérer une fenêtre IE
    Par jenesuispasunrobot dans le forum VBScript
    Réponses: 1
    Dernier message: 28/12/2006, 11h21

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