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

GUI Python Discussion :

Problème d'enregistrement de texte sur le widget Text()


Sujet :

GUI Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Problème d'enregistrement de texte sur le widget Text()
    Bonsoir,

    Je suis débutant en Python et pour m'entrainer je code un petit pseudo Bloc-note.

    Mon problème se situe au moment d'enregistrer le fichier en effet quand j'utilise la méthode get() du widget Text(),

    python me relève cette erreur :

    File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.2032.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
    File "C:\Users\showtek\Desktop\projet1\objet.py", line 86, in save_as
    self.text = self.text.get("1.0", END)
    AttributeError: 'str' object has no attribute 'get'

    Je ne comprend pas pourquoi car j'ai testé avec l'interpréteur python et cela marche sans problème sauf que là,
    je ne sais pas pourquoi mon objet Text est convertie en string.
    Cela fait des jours que je cherche une solution, sur stack overflow , sur les forums , la documentation etc.. mais aucune réponse à mon problème.

    Voici mon 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
    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
    #-*-coding: Utf-8-*-
    from tkinter import *
    from tkinter.filedialog import *
    import os
    from os.path import * # pour récupèrer le nom des fichiers.
     
    class Note():
        """classe pour créer notre GUI"""
        def __init__(self):
     
            self.win = Tk()
            self.win.title("NoteBook") # titre de l'application
            self.win.geometry("500x500") # taille de l'application
            self.win.iconbitmap('icone.ico') # logo de l'application
     
            # barre de menu
     
            self.mainmenu = Menu(self.win)
     
            # menu option
     
            self.option = Menu(self.mainmenu)
            self.option.add_command(label="nouveau", command=self.new_windows)
            self.option.add_command(label="ouvrir", command=self.open)
     
            # ajoute du menu à menubar.
     
            self.mainmenu.add_cascade(label="option", menu=self.option)
     
            # affichage du menu
     
            self.win.config(menu=self.mainmenu)
     
        def run(self):
            """boucle pour lancer la fenêtre."""
            self.win.mainloop()
     
        def new_windows(self):
            """commande nouvelle fenêtre"""
            self.windows = Toplevel(self.win) # nouvelle fenêtre 
            self.windows.title("nouveau")
            self.windows.geometry("500x500") # taille interface
            self.windows.iconbitmap('icone.ico') 
     
            # affichage du menu
     
            self.windows.config(menu=self.menubar)
     
            # création d'un widget pour éditer du texte.
     
            self.text = Text(self.windows,height=500, width=500) 
            self.text.bind('<Control-KeyPress-s>',self.save_as)
            self.text.pack() # affichage du widget
     
     
     
        def open(self):
            fichier = askopenfile(filetypes=[("Text Files", "*.txt")]) # ouverture d'un fichier 
            txt = fichier.read() # on range le texte du fichier dans une variable.
            titre = basename(fichier.name) # os.basename récupère le nom du fichier
                                           # grâce à son attribut name qui donne le chemin.
     
     
            # nouvelle fenêtre dans le widget parent.
            self.windows = Toplevel(self.win) 
            self.windows.title(titre) # on utilise la variable titre.
            self.windows.geometry("500x500") # taille interface
            self.windows.iconbitmap('icone.ico') # logo de l'interface 
     
            # affichage du menu
     
            self.windows.config(menu=self.menubar)
     
            # création d'un widget pour éditer du texte.
     
            self.text = Text(self.windows,height=500, width=500) 
            self.text.insert("1.0", txt) #affichage du texte du fichier.
            self.text.bind('<Control-KeyPress-S>',self.new_text)
            self.text.pack() # affichage du widgets
     
     
     
     
     
        def save_as(self, event):
            """commande pour enregistrer-sous"""
            self.text = self.text.get("1.0", END)
            self.text.asksaveasfilename(filetype=[("*.txt")])
     
        def menubar(self):
            """méthode créer une barre de menu."""
     
            self.menubar = Menu(self.windows)
     
            # menu option
     
            self.option = Menu(self.menubar)
            self.option.add_command(label="nouveau", command=self.new_windows)
            self.option.add_command(label="ouvrir", command=self.open)
            self.option.add_command(label="Enregistrer sous")
            self.option.add_command(label="supprimer")
     
            # ajout du menu option à menubar.
     
            self.menubar.add_cascade(label="option", menu=self.option)
    Merci pour votre aides

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Wuzei Voir le message
    je ne sais pas pourquoi mon objet Text est convertie en string.
    L'objet Text n'est pas converti en string.
    Par contre si vous assignez un string à l'attribut/variable associé à ce widget, l'accès suivant à cet attribut/variable récupèrera ce string.

    Et c'est ce que vous faites ligne 87.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                      self.text = self.text.get("1.0", END)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    re,

    donc quand j'essaye de récupérer le texte j'associe un string à mon attribut ,

    comment faire pour éviter cette erreur alors car dans tous les cas le texte récupérer par get()

    renvoi un string et parfois des entiers ...

    il faut je convertisse le texte renvoyé par get() en Text() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.text = self.text.get("1.0", END)
    self.text = Text(self.Text)
    Je crois que ça va créer une erreur non ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Pardon, j'avais pas remarqué que vous étiez lycéen.
    Citation Envoyé par Wuzei Voir le message
    comment faire pour éviter cette erreur alors car dans tous les cas le texte récupérer par get() renvoi un string et parfois des entiers ...
    Ce que retourne la méthode .get dépend de l'objet auquel on l'applique.
    Pour un widget Text, çà retournera toujours du texte (ou vous me montrez un exemple qui ferait autre chose).

    Après si après avoir décidé que l'attribut self.text permet d'accéder à l'instance de widget Text utilisée... Rien ne vous empêche d'utiliser une variable locale (ou un autre attribut différent). Python s'en fout: vous avez le droit de changer d'avis et d'assigner à self.text autre chose, c'est vous qui programmez.

    Citation Envoyé par Wuzei Voir le message
    il faut je convertisse le texte renvoyé par get() en Text() :
    A la ligne en question, çà se contente de récupérer le contenu du widget Text pour le sauvegarder dans un fichier.
    note: vous êtes supposé comprendre le code que vous avez écrit...

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ce n'est pas grave .

    Donc je peux ranger le texte du widget dans une variable et l'enregistrer dans un fichier .txt avec le module pickle ??

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Wuzei Voir le message
    Donc je peux ranger le texte du widget dans une variable et l'enregistrer dans un fichier .txt avec le module pickle ??
    Vous pouvez mais c'est un peu "idiot".
    pickle sert à sérialiser des objets Python.
    Là, c'est juste une chaine de caractères.

    Ceci dit, vous pouvez car une chaine de caractères est aussi un objet Python.
    Mais c'est utiliser une massue pour attraper une mouche.
    Disproportionné!
    Tout comme utiliser des "class" sans être à l'aise avec les variables.

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

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Oui cela est vrai je vais donc continuer mes recherches merci pour votre aide.

    PS : Je suis en terminale S, je n'est pas toujours le temps de me plonger dans l'informatique même si je suis passionné...
    donc cela ne sert à rien de me prendre de haut en disant que je ne sais pas utiliser de "class", j'apprends...
    Encore heureux que je ne sois pas fort du jour au lendemain en Python, sinon où serait le plaisir d'apprendre ?
    Je suis déjà content à mon âge d'avoir des bases en code.

    Bonne soirée.

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    As-tu résolu ton problème finalement ?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Wuzei Voir le message
    donc cela ne sert à rien de me prendre de haut en disant que je ne sais pas utiliser de "class", j'apprends...
    Les "class" sont juste une façon d'organiser son code un peu différemment. Ça n'apporte aucune fonctionnalité à votre application sinon de rendre le code un peu plus compliqué à comprendre et à mettre au point lorsqu'on ne maîtrise pas trop.

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

Discussions similaires

  1. [AC-2007] Problème d'enregistrement d'information sur un formulaire
    Par Yanley dans le forum IHM
    Réponses: 2
    Dernier message: 01/08/2012, 22h39
  2. Problème d'enregistrement des modifications sur dephi7
    Par crepinus83 dans le forum Débuter
    Réponses: 7
    Dernier message: 28/09/2009, 12h15
  3. Réponses: 15
    Dernier message: 03/03/2008, 09h25
  4. Réponses: 3
    Dernier message: 01/03/2007, 10h18
  5. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30

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