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" :
"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 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()
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()
Partager