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 :

problème d'attribution d'un texte dans un widget text


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut problème d'attribution d'un texte dans un widget text
    Bonjour,

    voila mon problème est le suivant. Je veux lire et écrire dans une fichier texte et pour cela j'e choisi de passer par le widget 'text' de Tkinter.

    Voici mon code, je pense qu'il y a plusieurs soucis mais étant débutant, je n'arrive pas à en venir à bout:
    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
    # -*- coding: UTF-8 -*-
    from Tkinter import *
    from os import *
     
    def ouvrir ():
        global fichier
        mon_txt = 'c:/'+ Entree.get()+'.txt'
        text1.configure(text = mon_txt)
        if os.path.isfile(mon_txt) == True:
            fichier = open(mon_txt, 'r')
            zonetext.configure(text = fichier)
            text1.configure(text = 'le fichier texte est chargé')
        if os.path.isfile(mon_txt) == False:  
            fichier = open(mon_txt, 'w')
            text1.configure(text = 'le fichier texte est créer')
     
    def fermer ():
        global fichier
        enregistrer()
        fichier.close()
        fen1.destroy()
     
    def enregistrer():
        global fichier
        fichier.write(zonetext.get(0.0,END))
     
    fichier = ''
    mon_txt = ''
    fen1 = Tk()
    Entree = Entry(fen1, text='Indiquez le fichier à ouvrir ou créer')
    Entree.grid(row = 1, column =0)
    text1 = Label(fen1, text='')
    text1.grid(row = 0, column =0) 
    bouton_ouvrir = Button(fen1, text = 'Ouvrir', command = ouvrir)
    bouton_ouvrir.grid(row = 1, column =1)
    bouton_fermer = Button(fen1, text ='Fermer', command = fermer)
    bouton_fermer.grid(row = 1, column =2)
    bouton_enregistrer = Button(fen1, text='enregistrer', command = enregistrer)
    bouton_enregistrer.grid(row = 1, column = 3) 
    zonetext = Text(fen1, height = 400, width = 400)
    zonetext.grid(row =2, column =4, columnspan =4, padx=5, pady=5)
    fen1.mainloop()
    Voici l'erreur

    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
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
        return self.func(*args)
      File "C:\Python25\traitement_text", line 9, in ouvrir
        if os.path.isfile(mon_txt) == True:
    NameError: global name 'os' is not defined
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
        return self.func(*args)
      File "C:\Python25\traitement_text", line 19, in fermer
        enregistrer()
      File "C:\Python25\traitement_text", line 25, in enregistrer
        fichier.write(zonetext.get(0.0,END))
    AttributeError: 'str' object has no attribute 'write'
    A priori, le problème viendrait de os.path.isfile(mon_txt) == True mais je ne sais pas comment faire autrement
    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File "C:\Python25\traitement_text", line 9, in ouvrir
        if os.path.isfile(mon_txt) == True:
    NameError: global name 'os' is not defined
    Il existe deux façons d'importer des modules :
    from module import ...
    import module

    Avec la première méthode, le contenu de module est inclut dans l'espace de nommage principal, si tu as une fonction foobar dans module, tu y accèdes simplement avec :
    foobar()

    Avec la deuxième méthode, l'espace de nommage principal est préservé, et tu accèdes aux éléments de module en les préfixant du nom du module. Ainsi, le même exemple devient :
    module.foobar()

    Dans ton code, tu as importé le module os dans l'espace de nommage principal, mais tu tentes d'accéder à path.isfile() en le préfixant du nom du module.
    Soit tu mets import os à la place de from os import *
    Soit tu mets path.isfile à la place de os.path.isfile


    Tant que j'y suis, il existe des façons bien plus simples d'ouvrir des fichiers avec une interface graphique.
    Tkinter est livré avec quelques modules annexes, dont tkFileDialog.
    Tu y trouveras les fonctions askopenfile() (renvoit un objet fichier en mode lecture), et askopenfilename() (renvoit le path du fichier dans une chaîne de caractères)
    Pour l'enregistrement, tkFileDialog dispose de asksaveasfile() et de asksaveasfilename()
    (Même principe, la première renvoie un objet fichier et la deuxième une chaîne, à toi de choisir)
    Tu n'as plus qu'à lier ces fonctions à un bouton
    <3 Debian
    [ C | C++ | PHP | Python ]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut
    Merci Haze pour tout ces éléments de réponse. Maintenant je comprend mieux mon erreur.

    @+ et encore merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut encore un problème
    Re bonjour,
    Etant un débutant en programmation et en python,
    j'apprecie beaucoup toutes vos réponses encore merci.
    J'ai encore quelques problèmes concernant cet algo et je suis bloqué.
    L'algo n'a pratiquement pas changé mais des problèmes subsistent.

    code:
    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
    Traceback (most recent call last):
      File "E:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
        return self.func(*args)
      File "E:\Documents and Settings\Administrateur\Bureau\traitement_text.py", line 14, in ouvrir
        fichier = open(mon_txt, 'w')
    TypeError: an integer is required
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "E:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
        return self.func(*args)
      File "E:\Documents and Settings\Administrateur\Bureau\traitement_text.py", line 19, in fermer
        enregistrer()
      File "E:\Documents and Settings\Administrateur\Bureau\traitement_text.py", line 25, in enregistrer
        fichier.write(zonetext.get(0.0, END))
    AttributeError: 'str' object has no attribute 'write'

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Tu as sans doute fait :
    from os import *
    Tout comme le module standard (nommé __builtins__, et qui contient tout ce qui est importé automatiquement), le module os comprend lui aussi une fonction nommée open.
    Donc, en important dans l'espace de nommage principal le module os, la fonction os.open() a écrasé __builtins__.open()

    Par conséquent, open, qui correspondait avant à __builtins__.open, se réfère désormais à la fonction open du module os.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fichier = open(mon_txt, 'w')
    TypeError: an integer is required
    Comme os.open prend des paramètres différents (puisque ce n'est plus la même fonction), alors tu obtiens une erreur (elle attend un entier en paramètre et non un nom de fichier).

    Avec la syntaxe import os, on conserve l'espace de nommage principal, tu es sûr que rien ne sera "écrasé" (on parle de collisions de noms).
    Cependant, on peut y objecter les points suivants :
    - Tout le module est chargé en mémoire
    - Il faut à chaque fois préfixer avec nom_module.nom_fonction, ce qui peut donner des noms à rallonge plus longs à taper.

    Dans ton cas, tu n'as besoin que d'une seule fonction parmi le module os : isfile()
    La syntaxe la mieux adaptée est sûrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from os.path import isfile
    Ainsi tu importes uniquement la fonction isfile parmi tout le module os.path (path étant lui même un module dans le module os).
    Si tu as besoin de plusieurs fonctions, tu peux mettre des virgules :
    from module import element1, element2, element3

    Pour terminer, il est important de savoir quelle est la façon la plus adéquate d'importer un module selon tes besoins.
    - Dans le cas ou tu utilises un grand nombre d'éléments d'un module, autant l'importer en entier dans l'espace de nommage principal.
    C'est souvent le cas avec les bibliothèques d'interfaces graphiques, vu que tu es susceptible d'utiliser n'importe quel widget ou variable de configuration :
    - Si tu utilises quelques fonctions d'un module :
    Comme ça tu préserves l'espace de nommage principal. Note que plus un projet est gros, plus le risque d'avoir des collisions entre deux éléments qui portent le même nom et issus de deux modules est grand. Donc plus ton projet est gros, plus tu dois favoriser cette syntaxe. Tu peux aussi utiliser un alias (un raccourci) grâce au mot-clef as :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    import un_module_avec_un_long_nom as mod
    L'alias peut ensuite être directement utilisé :
    - Dernier cas, plus rare : tu es sûr de n'utiliser qu'un ou deux éléments d'un module, alors autant les importer directement, sans charger tout le reste du module avec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from module import element1, element2
    Évidemment, il faut s'assurer auparavant que rien ne correspond au nom "element1" dans l'espace de nommage principal.
    <3 Debian
    [ C | C++ | PHP | Python ]

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut celui qui éclaire mon chemin
    bonjour Haze,

    ça y est, je pense avoir compris cette fois . Merci encore de prendre le temps de m'expliquer patiemment tout ça.



    Je n'ai plus qu'à revoir mon algo.
    Merci

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

Discussions similaires

  1. Récupération de texte dans un widget Text
    Par zinky dans le forum Tkinter
    Réponses: 3
    Dernier message: 18/07/2013, 16h04
  2. [2008] Problème affichage attribut table de fait dans un cube
    Par cana13 dans le forum SSAS
    Réponses: 6
    Dernier message: 01/04/2013, 12h50
  3. sélectionner du texte dans un widget Text
    Par Ruyneau dans le forum Tkinter
    Réponses: 1
    Dernier message: 27/02/2012, 13h31
  4. Attribution des valeurs lues dans un fichier texte
    Par law56100 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/05/2008, 16h07
  5. modifier la couleur d'un texte dans un input text
    Par mic79 dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 05/01/2005, 16h45

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