2017-05-11 2 views
0

J'ai créé une application de peinture dans python 3 en utilisant tkinter. Dans le cadre de l'application je vais sauvegarder le widget qui contient des formes (ovale, ligne, texte, ...). et je les recharge à nouveau. J'utilise le module pickle et il n'y a pas de problème avec save, mais quand je le recharge il me suffit de me renvoyer une liste contenant des entiers de 1 à N. c'est tout. pas d'objets, pas de formes. Comment puis-je reconstruire mes objets? ici est mon deux fonction de sauvegarder et de la charge:Comment reconstruire des objets à partir d'un fichier de vidage - Python 3

def save_project(self): 
    output_file = filedialog.asksaveasfilename(filetypes=[('Text', '*.txt')], title='save project as') 
    try: 
     with open(output_file, 'wb') as output: 
     pickle.dump(self.stack, output) 
     output.close() 
    except FileNotFoundError: 
    self.log("Cancelled save or error in filename") 

def load_project(self): 
    load_file = filedialog.askopenfilename(filetypes=[('Text','*.txt')], title='Load Project') 
    if not load_file: return 
    pickled_file_object = open(load_file, "rb") 
    pickled_file_object.seek(0) 
    try: 
     self.all_patterns = pickle.load(pickled_file_object) 
    except EOFError: 
     self.log("Error: End of file") 
    pickled_file_object.close() 

    try: 
     # The problem is here: 
     print(self.all_patterns) 
     pprint.pprint(self.all_patterns) 
    except: 
     self.log("Error: Project can not be loaded") 

la sortie imprimée est: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14, 15, 16, 17, 18, 20, 21, 22, 23]

tandis que le fichier texte enregistré est:

8003 5d71 0028 4B01 4b02 4b03 4b04 4b05 4b06 4b07 4b08 4b09 4b0a 4b0b 4b0c 4b0d 4b0e 4b0f 4b10 4b11 4b12 4b14 4b15 4b16 4b17 652e

+1

À quoi ressemblait 'self.stack' avant de le décaper? – jasonharper

+0

C'est juste une liste à laquelle j'ajoute tous les objets. En fait, cela fonctionne pour une fonction Annuler. Je peux supprimer les formes basées sur cela. alors il devrait être un moyen de les créer à nouveau –

Répondre

0

Il n'y a aucune fonction dans le canevas pour enregistrer et charger des objets de canevas. Vous devrez écrire du code qui itère sur les éléments, obtenir leurs coordonnées et d'autres attributs, et les enregistrer dans un format que vous pouvez analyser plus tard. Vous devrez alors écrire du code capable de lire ces données et de reconstruire tous les objets de la toile.

+0

Merci pour la réponse. Mon code est déjà de 400 lignes et si je veux le faire, ce serait un gros gâchis je pense. avez-vous une autre solution? comme si je change de toile à autre chose? –

+0

Vous pouvez créer un widget de canevas personnalisé doté d'une méthode qui, étant donné les données que vous avez enregistrées, le dessine sur le canevas. Si le nombre de lignes importe vraiment, utilisez un fichier différent, puis importez-le. – DCPY