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 :

la différence entre import et avoir le programme dans le fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de eponge
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2017
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2017
    Messages : 76
    Par défaut la différence entre import et avoir le programme dans le fichier
    Bonjour depuis quelques temps je programme en python et quand j'invoque une classe dans un autre fichier via import la classe ne s’exécute pas toujours comme j'aimerais qu'elle le fasse dans ces cas là j'avais trouvé une solution faire une copie de la classe dans mon programme et là tout marche sans problèmes. j'aimerais avoir des éclaircissement sur la différence entre les deux méthodes, j'ai mis l'un de mes programmes qui justement a ce problème(l'un des plus court)
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    import tkinter as tk
     
    #0) lettre+chiff 1)chiff 2)num tel francais 3)lettre
    class Neoclav:
        def __init__(self,ecran=0):
            self.ecran=ecran
            self.caract=["a","z","e","r","t","y","u","i","o","p","q","s","d","f","g","h","j","k","l","m","w","x","c","v","b","n"]
            self.chiff=["0","1","2","3","4","5","6","7","8","9"]
            self.spe=['eff','raz','esp','','']
            self.result=[]
            self.aff=tk.Tk()
            tk.Button(self.aff,text='quitter',bg='red',fg='white',command=self.aff.destroy).grid(row=0,column=5)
            tk.Button(self.aff,text='envoi',command=self.envoi).grid(row=0,column=4)
            self.cla=tk.Canvas(self.aff,width=600,height=300,bg='cyan')
            self.cla.bind('<Button-1>',self.clav)
            self.cla.grid(row=1,column=0,columnspan=6)
            self.choixecran()
            #print(test)
            self.affcont()
            self.liseuse()   
     
        def choixecran(self):
            if(self.ecran==0):
                self.affichagetot()
            elif((self.ecran==1)or(self.ecran==2)):
                self.affichiff()
            elif(self.ecran==3):
                self.afflettre()
     
        def liseuse(self):
            tk.Label(self.aff,text=self.result,width=50).grid(row=0,column=0,columnspan=3)
            self.aff.after(500,self.liseuse)
     
        def affcont(self):
            j=0
            for self.colonne in range(50,550,50):
                j+=1
                co=self.colonne
                if(self.ecran==0)or(self.ecran==3):
                    if(j<=2):
                        self.cla.create_rectangle(co,200,co+30,230,fill='red')
                        self.cla.create_text(co+15,215,text=self.spe[j-1])
                    elif(j>8):
                        j=j-7
                        self.cla.create_rectangle(co,200,co+30,230,fill='red')
                        self.cla.create_text(co+15,215,text=self.spe[j])
                else:
                    if(j<=2):
                        self.cla.create_rectangle(co,5,co+30,35,fill='red')
                        self.cla.create_text(co+15,20,text=self.spe[j-1])
                    elif(j>8):
                        j=j-7
                        co=co-300
                        self.cla.create_rectangle(co,5,co+30,35,fill='red')
                        self.cla.create_text(co+15,20,text=self.spe[j])
     
     
        def affichagetot(self):
            j=0
            for self.ligne in range(50,300,50):
                for self.colonne in range(50,550,50):
                    j+=1
                    li=self.ligne
                    if(li<100):
                        co=self.colonne
                        self.cla.create_rectangle(co,li,co+30,li+30)
                        self.cla.create_text(co+15,li+15,text=self.chiff[j-1])
                    elif(li>=200):
                        co=self.colonne+100
                    else:
                        co=self.colonne
                    if((j>10)and(j<37)):
                        self.cla.create_rectangle(co,li,co+30,li+30)
                        self.cla.create_text(co+15,li+15,text=self.caract[j-11])
     
        def clav(self,event):
            a=0
            b=0
            c=0
            x=event.x
            y=event.y
            # formation des cases de frappes pour chiffres et lettres
            for colonne in range(50,300,50):
                if((y>colonne)and(y<colonne+30)):
                    b=colonne//50
            for ligne in range(50,550,50):
                if((x>ligne)and(x<ligne+30)):
                    a=ligne//50
            if((a==0)or(b==0)):
                self.result.append('')
            if((b==1)and(self.ecran==0)):#chiffres
                self.result.append(self.chiff[a-1])
            if((self.ecran==0)or(self.ecran==3)):#lettres
                if((b==2)or(b==3)):
                    c=10*(b-2)+(a-1)
                    self.result.append(self.caract[c])
                elif(b>3):#lettres clavier court
                    if((a>2)and(a<9)):#limite dernière ligne lettres
                        c=10*(b-2)+(a-3)
                        self.result.append(self.caract[c])
                    elif(a==1):#fonction effacement d'un caratère
                        leng=len(self.result)
                        if(leng>0):
                            sup=leng-1
                            del self.result[sup]
                    elif(a==2):#fonction tout effacer
                        self.result=[]            
                    elif(a==9):#fonction espace
                        self.result.append(' ')
            elif((self.ecran==1)or(self.ecran==2)):#clavier chiffres
                c=b*3+a
                if(self.ecran==2):
                    leng=len(self.result)
                    if((leng==2)or(leng==5)or(leng==8)or(leng==11)):
                        self.result.append('.')
                if((c>3)and(c<=12)):
                    self.result.append(self.chiff[c-3])
                elif(c==14):
                    self.result.append(0)
                elif(c==1):
                    leng=len(self.result)
                    if(leng>0):
                        sup=self.result[leng-2]
                        self.result.remove(sup)
                        self.result.remove('')
                elif(c==2):
                    self.result=[]
                elif(c==3):
                    self.result.append(' ')
            if(self.result.count('')!=0):
                self.result.remove('')                
     
        def affichiff(self):
            j=0
            self.cla.configure(width=200,height=250)
            for self.ligne in range(50,250,50):
                for self.colonne in range(50,200,50):
                    j+=1
                    li=self.ligne
                    co=self.colonne
                    if(j<10):
                        self.cla.create_rectangle(co,li,co+30,li+30)
                        self.cla.create_text(co+10,li+10,text=self.chiff[j])
                    elif(j==10):
                        co=self.colonne+50
                        self.cla.create_rectangle(co,li,co+30,li+30)
                        self.cla.create_text(co+10,li+10,text=self.chiff[0])
     
        def afflettre(self):
            j=0
            for self.ligne in range(100,250,50):
                for self.colonne in range(50,550,50):
                    j+=1
                    li=self.ligne
                    if(li<200):
                        co=self.colonne
                        self.cla.create_rectangle(co,li,co+30,li+30)
                        self.cla.create_text(co+10,li+10,text=self.caract[j-1])
                    elif((li>=200)and(j<27)):
                        co=self.colonne+100
                        self.cla.create_rectangle(co,li,co+30,li+30)
                        self.cla.create_text(co+10,li+10,text=self.caract[j-1])
     
        def envoi(self):
            self.getretour()
            self.fermeture()
     
        def fermeture(self):
            self.aff.destroy()
     
        def getretour(self):
            self.le=''
            leng=len(self.result)
            for i in range(0,leng):
                self.le=self.le+self.result[i]
            print(self.result,self.le)
            return self.le
     
    Neoclav()

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

    Citation Envoyé par eponge Voir le message
    j'ai mis l'un de mes programmes qui justement a ce problème(l'un des plus court)
    Excepté la dernière ligne, s'il y a problème, il mériterait d'être illustré/décrit.

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

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Si vous avez des soucis entre importer et copier la classe dans votre fichier alors :
    1) Je ne suis pas certains que de nous donner toute votre grosse classe soit d'intérêt. Réduisez le problème sur 1 classe toute bateau.
    2) Quelles sont les 2 codes qui vous amène à des différences ? Présentez ces codes. Et présentez les différences.

  4. #4
    Membre actif Avatar de eponge
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2017
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2017
    Messages : 76
    Par défaut
    pour moi une classe c'est un objet avec des fonctions et des caractéristiques précises.
    Là dans le code que j'ai mis c'est un clavier avec différentes fonctions. pour d'autres utilisations ça peut être un calendrier par exemple ou une interface qui fera le lien avec une base de données. je tiens à signaler que certaines de mes classes sont des monstres de plusieurs centaines de lignes. je considère que je devrais pouvoir les utiliser sans à avoir à les copier dans un autre programme, que quelque soit leur fonction je dois pouvoir les utiliser pour étendre les capacités d'un programme du moment que je respecte leur caractéristiques. et ça sans le rendre énorme ou que si je change quoi que ce soit dans la classe importée sans devoir bidouiller les autres programmes qui utilisent ses fonctions pendant quelques minutes pour les adapter. Quant à la question que je pose ce n'est pas forcément "quel est le problème avec le code que j'ai mis" mais c'est quoi la différence entre "importer une classe" en utilisant la fonction 'import' pour utiliser ses fonctions et "faire une copie du programme" qu'elle contient pour utiliser ses fonctionnalités.
    le code que j'ai mis marche quand il est seul mais quand je fais "import", que je lance la classe il n'affiche qu'un clavier inerte où seule la toucher 'quitter' fonctionne et j'aimerais savoir pourquoi. j'aimerais savoir compenser ça.

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

    Citation Envoyé par eponge Voir le message
    c'est quoi la différence entre "importer une classe" en utilisant la fonction 'import' pour utiliser ses fonctions et "faire une copie du programme" qu'elle contient pour utiliser ses fonctionnalités.
    Il ne devrait pas y avoir de différence si le code a bien été écrit.
    Et s'il y a des soucis, ce sont ceux que vous constatez.

    Si on ne peut pas les reproduire, on ne va pas perdre son temps à essayez d'imaginer tous les pièges dans lesquels vous avez bien pu tomber.

    La plupart ne seront pas pertinents: on perdra juste notre temps.
    A vous de voir.

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

  6. #6
    Membre actif Avatar de eponge
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2017
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2017
    Messages : 76
    Par défaut
    merci

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par eponge Voir le message
    je considère que je devrais pouvoir les utiliser sans à avoir à les copier dans un autre programme, que quelque soit leur fonction je dois pouvoir les utiliser pour étendre les capacités d'un programme du moment que je respecte leur caractéristiques. et ça sans le rendre énorme ou que si je change quoi que ce soit dans la classe importée sans devoir bidouiller les autres programmes qui utilisent ses fonctions pendant quelques minutes pour les adapter.
    Ben oui. C'est justement le but des import: pouvoir mutualiser et réutiliser un code écrit une fois.

    Citation Envoyé par eponge Voir le message
    Quant à la question que je pose ce n'est pas forcément "quel est le problème avec le code que j'ai mis" mais c'est quoi la différence entre "importer une classe" en utilisant la fonction 'import' pour utiliser ses fonctions et "faire une copie du programme" qu'elle contient pour utiliser ses fonctionnalités.
    Alors déjà on n'importe pas une classe, on importe un script Python et ce n'est pas tout à fait la même chose.
    Et ensuite, selon la syntaxe employée lors de l'import, soit le contenu du script est importé dans l'espace de nom principal du programme, soit il est importé dans un espace de nom correspondant au nom du script. Et là, ça demande une certaine connaissance de ce que sont les espaces de noms.

    Prenons un script "toto.py" contenant ce simple code: def carre(n): return n**2.

    Si tu l'importes de cette façon: import toto, alors la fonction sera accessible sous l'espace de nom "toto" et ne pourra s'utiliser que si on l'appelle depuis cet espace de nom => print(toto.carre(5)).
    Si tu l'importes de cette façon: from toto import * ou from toto import carre, alors la fonction sera accessible dans l'espace de nom principal du programme et pourra s'utiliser comme si tu l'avais copiée dans ledit programme => print(carre(5)).

    Et le truc se complexifie encore plus si tu crées un dossier "à part" contenant différents scripts à importer, et qu'en plus tu délègues l'import au script "__init__.py" dudit dossier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par eponge Voir le message
    Là dans le code que j'ai mis c'est un clavier avec différentes fonctions. pour d'autres utilisations ça peut être un calendrier par exemple ou une interface qui fera le lien avec une base de données. je tiens à signaler que certaines de mes classes sont des monstres de plusieurs centaines de lignes.
    Justement, si la classe peut être n'importe quoi vous devriez pouvoir nous illustrer le problème avec une classe très simple (et pas aussi compliqué que celle que vous présentez).

    Citation Envoyé par eponge Voir le message
    je considère que je devrais pouvoir les utiliser sans à avoir à les copier dans un autre programme, que quelque soit leur fonction je dois pouvoir les utiliser pour étendre les capacités d'un programme du moment que je respecte leur caractéristiques. et ça sans le rendre énorme ou que si je change quoi que ce soit dans la classe importée sans devoir bidouiller les autres programmes qui utilisent ses fonctions pendant quelques minutes pour les adapter.
    Oui vous pouvez les utiliser. Mais selon la manière dont vous les utilisez les comportements ne sont pas les même. D'où le fait que je réitère ma demande : précisez comment utilisez vous cette classe présente dans un autre fichier ? Présentez le code qui fait l'import et qui utilise la fonction/la classe importée.


    Je suis désolé, mais en l'état on ne peut pas plus vous aider.

  9. #9
    Membre actif Avatar de eponge
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2017
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2017
    Messages : 76
    Par défaut
    au début n'étant pas très sûr de moi je n'ai utilisé que ce code ci dessous l'interface était faite et j'avais fait le lien avec ce programme pour l'un des boutons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def nom(self):
        import nomfichier
        test=nomfichier.Neoclav()
    l'importation se faisait dans un programme qui devait importer le clavier 'à la demande'. c'est là que je me suis retrouvé avec une 'image' du clavier avec seulement le bouton "quitter" qui fonctionnait.
    je voulais créer une base de données avec une interface graphique où tous les domaines étaient des boutons qui provoquaient l'importation d'un clavier adapté aux données exigées. il devait avoir plusieurs programmes suivant le type de données. quand je regarde les tutoriels ce sont toujours des scripts simples or dans les utilisations que je fais les scripts ont très souvent des interfaces graphiques ce qui me gène dans l'adaptation des méthodes à mes programmes car demandant plus de paramètres et donc d'adaptation. je tente aussi de ne faire qu'une 'fonction' ou/et classe dans chaque programme. d'où l'habitude de confondre classe et script.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/10/2010, 16h24
  2. Différence entre "import abcd" et "from abcd import *"
    Par jlg_47 dans le forum Général Python
    Réponses: 6
    Dernier message: 21/05/2010, 14h31
  3. Réponses: 3
    Dernier message: 02/03/2009, 10h34
  4. La différence entre un script et un programme ?
    Par romeio dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 16/09/2007, 14h58
  5. Réponses: 4
    Dernier message: 08/09/2006, 11h21

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