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()