3 pièce(s) jointe(s)
Insérer du code dans un fichier à partir d'un autre fichier
Bonjour,
Cette discussion fait suite à la discution 'Créé une classe de boutons de menu avec la class ttk.Button' mais aborbe un autre point.
Pour faciliter la gestion du projet, je souhaite que le code de chaque page appelée par chaque bouton de la classe Option soit sur un ficher séparé.
Quand on clique sur un bouton, il transmet son paramètre index à la fonction Page.show_page qui doit inclure le code le la page concernée nomméé page+index.
Pour ce faire, j'importe le module importlib qui permet de convertir la variable nom de la page ('page'+str(index) de type string en variable module de type fichier.
PROBLEME: Dans chaque page, je fait référence à des informations déjà existantes dans le fichier main.py du type: ttk.Button et main_frame.
Le print(index) et le message 'Page index' des pages 0 et 1 montre que cela fonctionne. Mais j'obtiens les erreurs (NameError: name 'ttk' is not defined) et (name 'main_frame' is not defined) pour afficher un boutton, alors que dans main.py j'ai fait (from tkinter import ttk) et défini (option_frame = tk.Frame(root, bg=FRMO_COLOR)).
Et si je les définis dans chaque page, il me demande de définir zoot qui est la fenêtre définie dans main.py. On ne s'en sort pas!
C'est comme si chaque page devait être validée en soi avant de fonctionner, ce qui ne fait plus l'affaire.
Or ce qui m'intéresse c'est uniquement d'insérer à cet endroit le code correspondant à la page à la façon de l'instruction #include que j'utilisais en asp.
Faut t-il utiliser un format précis pour les fichiers pageindex autre que .py ( j'ai bien essayé sans extention ou .txt mais sans succès?
Faut t-il avoir recours à une autre instruction que import?
Autres solutions...?
(J'utilise PyCharm 2024.1.4.)
MERCI POUR VOTRE AIDE
Précision sur l'objectif de la question
Au lieu de tout mettre dans main.py dans la fonction show_page en utilisant match/case sous la forme:
def show_page(self, index):
if index == len(list_menu_names) - 1:
quit_application()
else:
self.pack(pady=0, side='top', expand=True, fill='both')
lb_option = ttk.Label(self, text=list_menu_names[index], style='option.TLabel')
lb_option.pack()
#------------------------------------------------------------------------------------------------
match index:
case 0:
print(0)
but = ttk.Button(main_frame, text='Page 0', compound='center')
but.place(x=200, y=100, width=200, height=30)
case 1:
print(1)
but = ttk.Button(main_frame, text='Page 1', compound='center')
but.place(x=200, y=100, width=200, height=30)
case ....:
#------------------------------------------------------------------------------------------------
je cherche une solution du type:
#------------------------------------------------------------------------------------------------
try:
INSERER DU CODE PROVENANT DU FICHIER pageindex
except ModuleNotFoundError: # erreur si le fichier pageindex n'existe pas
print('Erreur No ' + str(index))
#------------------------------------------------------------------------------------------------
Manifestement, import n'est pas adéquat.
Et si import ne fait pas un ajout de lignes de code comme le ferait #include, y a t'il une instruction qui le fasse dans python.
La solution est peut être de la proposition de wiztricks.
Je vais l'étudier.
Merci à tous
Objectif de l'application
J'essaie de construire un canevas général pour des applications avec un menu composé de boutons placés dans le frame option_frame.
Un click sur un bouton donné fera apparaitre un frame issu de la classe Page qui sera placé dans le frame main_frame.
Pour le moment, j'ai obtenu obtenu cette structure et elle fonctionne parfaitement.
Maintenant, sur chaque page, il y aura un ensemble de button, combobox, entry ... permettant de gérer des données en relation avec une bd mySQL.
Au lieu de mettre tout le code dans test1.py, je veux créer un fichier par page correspondant à chaque bouton sans avoir à chaque fois a redéfinir la structure de base (option_frame avec ses boutons et main_frame) dans chaque page.
Dans le code que je pose dans le forum, je ne met que le minimum nécessaire pour montrer le problème auquel je suis confronté, à savoir, le code pour remplacer dans la classe Page les instructions suivantes:
match index:
case 0:
but = ttk.Button(main_frame, text='Page 0', compound='center')
but.place(x=200, y=100, width=200, height=30)
.......
case 1:
but = ttk.Button(main_frame, text='Page 1', compound='center')
but.place(x=200, y=100, width=200, height=30)
.......
case ....:
par des instructions basées sur l'index de la page du type (ou autre):
try:
INSERER DU CODE PROVENANT DU FICHIER pageindex
except ModuleNotFoundError: # erreur si le fichier pageindex n'existe pas
print('Erreur No ' + str(index))
J'espère que ces explications apporteront plus de clarté à ma problématique.
Entretemps, j'explore la voie "python tutorial sur les modules" et les autres suggestions que vous avez proposées.
Merci pour votre patience
et pourquoi vous partez sur plus compliqué
En fait, ce canevas sera valable pour générer divers applications différentes et indépendante l'une de l'autre.
Par contre, on pourra retrouver des interfaces (frame Page) réutilisables dans plusieurs applications.
Par exemple, la gestion d'un annuaire, la gestion d'un découpage administratif....
Il sera alors facile de faire une copie des fichiers élaborés dans un projet et de les mettre dans le répertoire d'un nouveau projet.
Et puis surtout, pourquoi faire simple quand on peut faire compliqué!