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 :

Insérer du code dans un fichier à partir d'un autre fichier [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut 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
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    C'est juste que vous catch la mauvaise exception,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def show_page(self, index):
            if index == Nb-1:
                root.destroy()
            else:
                self.pack(pady=0, side='top', expand=True, fill='both')
                lb_option = ttk.Label(self, text=index, style='option.TLabel')
                lb_option.pack()
                try:
                    print('OK '+str(index))
                    importlib.import_module('page'+str(index))
                except ModuleNotFoundError:  # erreur sur l'exception à catch corrigé
                    print('No '+str(index))
     
                    pass

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut bonsoir fred1599
    J'ai apporté la correction suggérée par fred1599 mais le problème demeure le même.
    La gestion des exceptions ne concerne que le cas où la page pageindex n'existe pas (cas de la page2).
    Mais quand la page pageindex existe, c'est le problème de l'insertion du code de cette page dans la page main.py qui pose problème car elle ne prend pas en compte les informations déjà disponibles sur la page main.py.

    Bien cordialement

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Selon le code que vous aviez donné, la page0 et la page1 sont bien importées.

    EDIT : Par contre votre main_frame n'a rien à faire là, tout ce qui est page0, page1, etc... doivent être importées dans test1.py, et ce qui est dans test1.py n'a pas à être dans vos pages.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    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 744
    Par défaut
    Citation Envoyé par gugurnuk Voir le message
    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.
    import ne fait pas un ajout de lignes de code comme le ferait include.

    Le module importé aura un espace de noms global au module mais pas au delà => si main_frame a été définit dans un autre module, il ne le sera pas (automatiquement) dans un module importé, De même pour l'import de ttk (et la définition de la variable ttk) à refaire.

    Côté "pratique", je vous suggère d'ouvrir le python tutorial sur les modules pour comprendre comment ça fonctionne et apprendre à découper dans un premier temps votre code en classes dans le même script (avant de pousser certaines classes dans des "modules").

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

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut 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

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    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 744
    Par défaut
    Citation Envoyé par gugurnuk Voir le message
    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
    Et non... vous devez faire avec ce que propose le langage (ce qui peut être surprenant lorsqu'on vient avec des habitudes).

    Après vous pouvez ajouter ce genre de fonctionnalité avec une bibliothèque qui permet de fabriquer des Templates comme mako ou bricoler un truc à base d'exec.

    *edit*
    Citation Envoyé par gugurnuk Voir le message
    Au lieu de tout mettre dans main.py dans la fonction show_page en utilisant match/case sous la forme:
    Désolé mais pour l'instant, index est un attribut de la page. Du coup, la méthode show_page n'a aucune raison de récupérer un index qu'elle connaît déjà sans accès à une collection de pages lui permettant de récupérer l'objet correspondant.

    Pour le reste, Si la différence entre les pages se réduit à la valeur de l'index, pas besoin de switch case pour différencier un code qui est juste fonction de self.index. Pour des différences plus complexes, on va peut être sous classer Page pour les réaliser.

    Le soucis est qu'on ne sait pas le problème que vous cherchez à résoudre. Vous montrez les trucs que vous avez essayé et qui ne marchent pas. A partir de là, on peut essayer d'imaginer ce que vous cherchez à faire mais ça irait plus vite (et sans erreur) si vous preniez le temps de l'exprimer.

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

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut 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

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    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 744
    Par défaut
    Citation Envoyé par gugurnuk Voir le message
    Au lieu de mettre tout le code dans main.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.
    C'est à priori tout l'intérêt de l'héritage (ou des sous/classes) sachant qu'il y aura des relations entre cette structure et les widgets "conteneurs" (frame).

    Après pour associer un bouton a une Frame, c'est plus un sujet de conception orientée objet.
    Dire "je veux créer un fichier par page..." est la solution technique que vous envisagez mais on ne voit pas trop quoi ajouter à un héritage de base (et pourquoi vous partez sur plus compliqué).

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. chercher que le premier code dans une fichier
    Par darkman13130 dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/06/2008, 14h13
  2. trouver un code dans un fichier texte
    Par darkman13130 dans le forum C++Builder
    Réponses: 13
    Dernier message: 12/06/2008, 14h26
  3. [DOM] Récupérer du code dans balises fichier XML
    Par Capripot dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 10/04/2008, 23h05
  4. Réponses: 2
    Dernier message: 08/01/2007, 20h26

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