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