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 :

pickle instance de tk [Python 3.X]


Sujet :

Python

  1. #1
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut pickle instance de tk
    Bonjour, avec pickle j'ai l'erreur suivante:

    _pickle.PicklingError: Can't pickle <class 'tkapp'>: attribute lookup tkapp on __main__ failed

    Voici mon code:

    start.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from ob2 import ob2
    from tkinter import *
    import pickle
     
    root = Tk()
    root.withdraw()
    monObj=ob2(root)
    savefile = open('save.tmp','wb')
    pickle.dump(monObj, savefile)
    root.mainloop()
    et ob2.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import tkinter as Tk
     
    class ob2():
     
     
        def __init__(self, tkinstance):
     
            self.tkinstance=tkinstance
            self.root = Tk.Toplevel(self.tkinstance)
            self.root.wm_title("Ma fenetre")

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Il semblerait que la solution soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Whatever(object):
     
      def __getstate__(self):
        state = self.__dict__.copy()
        del state['view']
        return state
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    J'ai un peu du mal a comprendre la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Whatever(object):
     
      def __getstate__(self):
        state = self.__dict__.copy()
        del state['view']
        return state
    Je vois pas a quoi ce code correspond, qu'es ce que state = self.__dict__.copy() et del state['view'] ? sa correspond a quoi ?

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Ça veut dire qu'il faut mettre la main dans le cambouis, en implémentant ta propre classe où tu auras une méthode __getstate__ qui retournera tous les attributs de ton instance Tk, sauf l'attribut tkapp (donc le supprimer avec del), pour faire une sauvegarde avec pickle, mais tu vas en avoir besoin par la suite.

    Pour récupérer cet attribut tkapp, il faudra dans cette classe créée, ajouter la méthode __setstate__ (récupérera les attributs de ta classe - unpickle) où tu implémenteras cet attribut manquant tkapp en le recréant.

    Question, pourquoi faire cela ? Pourquoi sauvegarder une instance Tk ? Que veux-tu faire exactement ?

    Là on va vraiment chercher loin quelque chose qui est peut-être simple à résoudre...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Inactif  

    Homme Profil pro
    NR
    Inscrit en
    Juin 2013
    Messages
    3 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : NR
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 3 715
    Points : 1 184
    Points
    1 184
    Billets dans le blog
    9
    Par défaut
    Donc en gros faut que je crée une méthode ou je vais mettre mes variables dans une liste par exemple puis stocker la liste dans un fichier binaire.
    Et une 2eme méthode pour recrée l'objet a partir des variables contenue dans le fichier binaire.

    Faut y faire manuellement donc.

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    C'est à peu près ça... Il faut avec __getstate__ sauvegarder (faire une copie) les attributs de ta classe sauf l'objet tkapp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from tkinter import *
    >>> root = Tk()
    >>> root.__dict__
    {'master': None, '_tclCommands': ['tkerror', 'exit', '139933186508232destroy'], 'tk': <tkapp object at 0x7f44b9e97308>, '_tkloaded': 1, 'children': {}}
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/10/2003, 10h22
  2. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24
  3. [VB6] [DLL] DLL à instance unique
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/09/2003, 08h07
  4. [VB6]Passer le focus à une instance précedente
    Par Jeremiah dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 16/09/2003, 10h01
  5. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56

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