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

Python Discussion :

Découper son programme en plusieurs fichiers et appeler des fonctions [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de lagratteCchouette
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut Découper son programme en plusieurs fichiers et appeler des fonctions
    Bonjour,

    Pouvez-vous s'il vous plaît m'aider...
    J'ai un fichier main.py qui est mon interface graphique en Tkinter. Dans cette page je test l'utilisation d'insertion de données dans ma database (cela marche quand tout est dans le même fichier).
    Je souhaite comme dans le PHP utiliser la notion "INCLUDE" mais alors que que j'importe mon 2ème fichier cela ne marche pas.


    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    # -*- coding: utf-8 -*-
     
    from tkinter import *
    import os
    from database import enregister # syntaxe pour appeller un autre fichier py + fonction
    from tkinter import font
     
     
    #================== Création du constructeur graphique =================================
    fenetre =Tk() # Création d'un constructeur
    #champ_label = Label(fenetre, text="Menu") # Création d'un label
    #champ_label.pack() # création de l'impression du label
     
    #======== Dimensionnement de la fenetre =================================================
    # Fonction centrer fenêtre
    screen_x = int(fenetre.winfo_screenwidth())
    screen_y = int(fenetre.winfo_screenheight())
     
    #fenetre_x = 1600
    #fenetre_y = 900
     
    fenetre_x = 800
    fenetre_y = 600
     
    pos_x = (screen_x // 2) - (fenetre_x // 2)
    pos_y = (screen_y // 2) - (fenetre_y // 2)
     
    # Attention le 1er facteur est x ensuite +
    geo = "{}x{}+{}+{}".format(fenetre_x, fenetre_y, pos_x, pos_y)
    fenetre.geometry(geo)
     
    #============= FENETRE FIN ==============================================================
    fenetre.iconbitmap("img/search.ico") ### Changement de l'icone de la fenêtre [l'icone doit être placé dans le répertoire racine de l'application ou un autre répertoire img/...]
     
    #=================== Création d'un menu =================================================
    menubar = Menu(fenetre) # Création de la FRAME pour placer les menus
     
    menuFichier = Menu(menubar, tearoff=0) # Création du menu "Fichier"
    menubar.add_cascade(label="Fichier", menu=menuFichier) # Rattachement des commandes au menu "Fichier"
    menuFichier.add_command(label="Créer")
    menuFichier.add_command(label="Ouvrir",)
    menuFichier.add_command(label="Editer")
    menuFichier.add_separator() # Ligne de séparation
    menuFichier.add_command(label="Quitter", command=fenetre.quit)
     
    menuEdition = Menu(menubar, tearoff=0)
    menubar.add_cascade(label="Edition", menu=menuEdition)
    menuEdition.add_command(label="Couper")
    menuEdition.add_command(label="Copier")
    menuEdition.add_command(label="Coller")
     
    menuAide = Menu(menubar, tearoff=0)
    menubar.add_cascade(label="Aide", menu=menuAide)
    menuAide.add_command(label="A propos")
     
    #=================== Création d'un GRID ================================================
     
    labelAuteur = Label(fenetre, text="Auteur", font=("Arial", 12), width="30", height="5")
    labelAuteur.grid(row = 1, column=1, padx = 20)
    entreeAuteur = Entry (fenetre,  width="30")
    entreeAuteur.grid(row = 1, column = 2,) 
     
    labelInfos = Label(fenetre, text="Infos", font=("Arial", 12))
    labelInfos.grid(row = 2, column=1, padx = 20)
    entreeInfos = Entry (fenetre)
    entreeInfos.grid(row = 2, column = 2) 
     
    boutonEnregistrer = Button (fenetre, text=' Valider ', command=enregister)
    boutonEnregistrer.grid (row = 1, column = 8, padx = 30)
     
    #================== FERMETURE DES BOUCLES ==============================================
    fenetre.config(menu=menubar) # Configuration et print menu
    fenetre.mainloop() # Boucle principale
    Dans mon 2ème fichier datbase.py se trouve le codes pour insérer les données dans ma database.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # -*- coding: utf-8 -*-
    import sqlite3
     
    #=================== Insertion des données dans database ================================================
    def enregister():
     
        connection = sqlite3.connect('mnesis.db') # Connection à la BdD
        cursor = connection.cursor() # création du curseur
        new_auteur = (cursor.lastrowid, entreeAuteur.get(),entreeInfos.get()) # Récupération des valeurs des boutons
        cursor.execute('INSERT INTO tb_auteur VALUES(?,?,?)',new_auteur) # les (?,?,?) représentent les valeurs qui sont renseignées dans la variable new_auteur 
        print("Enregistrement effectué")
        cursor.close()
        connection.commit() # Valider l'enregistrement dans la database
        connection.close() ## Fermeture de la connection
    Mais cela ne marche pas et voici la message dans mon débogueur :

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\charlelie\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:\DevPython_Santiago\menesis_database_work\database.py", line 9, in enregister
        new_auteur = (cursor.lastrowid, entreeAuteur.get(),entreeInfos.get()) # Récupération des valeurs des boutons
    NameError: name 'entreeAuteur' is not defined
    Comme je débute, je n'arrive pas à comprendre ce qui se passe et en PHP il suffisait simplement d'appeler le fichier.
    Voilà... merci par avance pour vos lumières.

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Le module database n'a pas connaissance des variables de ton fichier l'important.

    Si la fonction enregistrer a besoin d'accéder à tels objets, il faut lui fournir en paramètres, le mieux étant de lui fournir les valeurs textes des objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boutonEnregistrer = Button (fenetre, text=' Valider ', command=lambda :enregister(entreeAuteur.get(), entreeInfos.get()))
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def enregister(auteur, infos):
        connection = sqlite3.connect('mnesis.db') # Connection à la BdD
        cursor = connection.cursor() # création du curseur
        new_auteur = (cursor.lastrowid, auteur, infos)
        # ... reste du code
    Il serait mieux plutôt que d'utiliser une fonction lambda dans le button, créer une autre fonction dans le fichier principal assurant que les valeurs des widgets ont été définies avant d'appeler la fonction enregistrant les valeurs dans la bdd.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par lagratteCchouette Voir le message
    Je souhaite comme dans le PHP utiliser la notion "INCLUDE" mais alors que que j'importe mon 2ème fichier cela ne marche pas.
    La notion d'include, c'est comme répartir ses instructions dans plusieurs fichiers pour les concaténer avant l'exécution... Avec Python on peut faire çà avec "exec":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data = '''
    def f():
        print(a)
    '''
     
    exec(data)
    a = 'aaa'
    f()
    mais (outre que ce soit une instruction dangereuse), "import" est complétement autre chose supposant avoir vu ce que sont modules et portée des variables.

    Pas facile de programmer avec Python en pensant "comme en PHP".

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

  4. #4
    Membre confirmé Avatar de lagratteCchouette
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut Fonction principale plutôt que fonction lambda
    Merci à tous les deux.

    Pour bistouille
    - Mais comme je suis en train de migrer sur Python pourriez-vous m'expliquer plus précisément ce que vous voulez dire par :

    Il serait mieux plutôt que d'utiliser une fonction lambda dans le button, créer une autre fonction dans le fichier principal assurant que les valeurs des widgets ont été définies avant d'appeler la fonction enregistrant les valeurs dans la bdd.
    Pour wiztricks - Je vais regarder les tutos et je vais tester après je reviendrai.

  5. #5
    Membre confirmé Avatar de lagratteCchouette
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut Code résolu
    Merci à tous et je mets à disposition mon code :

    frontend.py
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    # -*- coding: utf-8 -*-
     
    from tkinter import *
    from main import * # syntaxe pour appeller un autre fichier py + fonction
    from tkinter import font
     
     
    #================== Création du constructeur graphique =================================
    fenetre =Tk() # Création d'un constructeur
    #champ_label = Label(fenetre, text="Menu") # Création d'un label
    #champ_label.pack() # création de l'impression du label
     
    #======== Dimensionnement de la fenetre =================================================
    # Fonction centrer fenêtre
    screen_x = int(fenetre.winfo_screenwidth())
    screen_y = int(fenetre.winfo_screenheight())
     
    #fenetre_x = 1600
    #fenetre_y = 900
     
    fenetre_x = 800
    fenetre_y = 600
     
    pos_x = (screen_x // 2) - (fenetre_x // 2)
    pos_y = (screen_y // 2) - (fenetre_y // 2)
     
    # Attention le 1er facteur est x ensuite +
    geo = "{}x{}+{}+{}".format(fenetre_x, fenetre_y, pos_x, pos_y)
    fenetre.geometry(geo)
     
    #============= FENETRE FIN ==============================================================
    fenetre.iconbitmap("img/search.ico") ### Changement de l'icone de la fenêtre [l'icone doit être placé dans le répertoire racine de l'application ou un autre répertoire img/...]
     
    #=================== Création d'un menu =================================================
    menubar = Menu(fenetre) # Création de la FRAME pour placer les menus
     
    menuFichier = Menu(menubar, tearoff=0) # Création du menu "Fichier"
    menubar.add_cascade(label="Fichier", menu=menuFichier) # Rattachement des commandes au menu "Fichier"
    menuFichier.add_command(label="Créer")
    menuFichier.add_command(label="Ouvrir",)
    menuFichier.add_command(label="Editer")
    menuFichier.add_separator() # Ligne de séparation
    menuFichier.add_command(label="Quitter", command=fenetre.quit)
     
    menuEdition = Menu(menubar, tearoff=0)
    menubar.add_cascade(label="Edition", menu=menuEdition)
    menuEdition.add_command(label="Couper")
    menuEdition.add_command(label="Copier")
    menuEdition.add_command(label="Coller")
     
    menuAide = Menu(menubar, tearoff=0)
    menubar.add_cascade(label="Aide", menu=menuAide)
    menuAide.add_command(label="A propos")
     
    #=================== Création d'un GRID ================================================
     
    labelAuteur = Label(fenetre, text="auteur", font=("Arial", 12), width="30", height="5")
    labelAuteur.grid(row = 1, column=1, padx = 20)
    entreeAuteur = Entry (fenetre,  width="30")
    entreeAuteur.grid(row = 1, column = 2,) 
     
    labelInfos = Label(fenetre, text="infos", font=("Arial", 12))
    labelInfos.grid(row = 2, column=1, padx = 20)
    entreeInfos = Entry (fenetre)
    entreeInfos.grid(row = 2, column = 2) 
     
    boutonEnregistrer = Button (fenetre, text='Valider', command=lambda : enregister(entreeAuteur.get(), entreeInfos.get()))
    boutonEnregistrer.grid (row = 1, column = 8, padx = 30)
     
    #================== FERMETURE DES BOUCLES ==============================================
    fenetre.config(menu=menubar) # Configuration et print menu
    fenetre.mainloop() # Boucle principale
    main.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # -*- coding: utf-8 -*-
    import sqlite3
     
    #=================== Insertion des données dans database ================================================
    def enregister(auteur, infos):
     
            connection = sqlite3.connect('mnesis.db') # Connection à la BdD
            cursor = connection.cursor() # création du curseur
            new_auteur = (cursor.lastrowid, auteur, infos) # Récupération des valeurs des boutons
            cursor.execute('INSERT INTO tb_auteur VALUES(?,?,?)',new_auteur) # les (?,?,?) représentent les valeurs qui sont renseignées dans la variable new_auteur 
            cursor.close()
            connection.commit() # Valider l'enregistrement dans la database
            connection.close() ## Fermeture de la connection
    Et cela marche très très bien.

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

Discussions similaires

  1. Partager son programme en plusieurs fichiers
    Par akuma8 dans le forum Arduino
    Réponses: 2
    Dernier message: 14/12/2014, 13h30
  2. Compiler un petit programme avec plusieurs fichiers avec g++
    Par Ourcoulouncoulou dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 16/12/2008, 13h48
  3. répartir son code dans plusieurs fichiers
    Par peuf23 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/09/2008, 12h00
  4. decomposer son programme en plusieurs unit
    Par Art19 dans le forum Langage
    Réponses: 5
    Dernier message: 17/07/2007, 17h08
  5. Découper une classe en plusieurs fichiers de code
    Par Christophe_ dans le forum Visual Studio
    Réponses: 1
    Dernier message: 21/06/2007, 20h54

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