2016-12-17 3 views
-1

Depuis quelques jours, je suis aux prises avec un problème, à savoir que les paramètres écrits par ma classe de paramètres pour un analyseur ne sont pas persistants lorsque le programme est redémarré. Ce problème se produit uniquement sur Windows, mais dans les environnements Python x86 et x64 et lors de la compilation à l'aide de PyInstaller. Peu importe que le programme soit exécuté en tant qu'administrateur ou non. Lors de la première exécution du programme, write_def(self) est appelée par le constructeur. Cette fonction écrit correctement les valeurs par défaut dans le fichier spécifié. Après cela, read_set(self) est appelé de sorte que les variables de classe sont définies. Ces variables de classe correspondent alors aux valeurs par défaut. Dans un autre fichier, namely frames.py, write_set(self) est appelée et tous les paramètres sont passés en arguments. En utilisant des instructions d'impression, j'ai affirmé que la fonction write_set(self) reçoit les valeurs correctes. Aucune erreur ne se produit lors de l'écriture des paramètres dans le fichier, et lors de l'exécution à nouveau read_set(self), les nouveaux paramètres sont lus correctement et cela est également affiché dans l'interface graphique. Cependant, lorsque vous fermez le programme et que vous le relancez, les paramètres par défaut sont de nouveau affichés. Ce n'est pas le comportement que je m'attendais. Ci-dessous j'ai ajouté la classe de paramètres implémentant cPickle. Lors de l'utilisation pickle le comportement est le même. Lorsque vous utilisez shelve comme dans this file, le comportement est le même. Lorsque vous utilisez dill, le comportement est le même. Lors de l'implémentation d'un ConfigParser.RawConfigParser (dans la branche configparser du référentiel GitHub lié précédemment), le comportement est le même et, en outre, lors de l'affichage du fichier de paramètres dans un éditeur de texte, les paramètres du fichier ne sont pas mis à jour.Les modifications n'ont pas été écrites correctement dans Python 2.7

Lors de l'exécution du même code sous Linux (Ubuntu 16.04.1 LTS avec Python 2.7), tout fonctionne comme prévu avec les versions pickle et shelve. Les paramètres sont correctement enregistrés et chargés à partir du fichier. Est-ce que je fais quelque chose de mal? Est-ce un problème spécifique à Windows avec Python?

Merci d'avance pour toute aide!

RedFantom.

# Written by RedFantom, Wing Commander of Thranta Squadron and Daethyra, Squadron Leader of Thranta Squadron 
# Thranta Squadron GSF CombatLog Parser, Copyright (C) 2016 by RedFantom and Daethyra 
# For license see LICENSE 

# UI imports 
import tkMessageBox 
# General imports 
import getpass 
import os 
import cPickle 
# Own modules 
import vars 

# Class with default settings for in the settings file 
class defaults: 
    # Version to display in settings tab 
    version = "2.0.0_alpha" 
    # Path to get the CombatLogs from 
    cl_path = 'C:/Users/' + getpass.getuser() + "/Documents/Star Wars - The Old Republic/CombatLogs" 
    # Automatically send and retrieve names and hashes of ID numbers from the remote server 
    auto_ident = str(False) 
    # Address and port of the remote server 
    server = ("thrantasquadron.tk", 83) 
    # Automatically upload CombatLogs as they are parsed to the remote server 
    auto_upl = str(False) 
    # Enable the overlay 
    overlay = str(True) 
    # Set the overlay opacity, or transparency 
    opacity = str(1.0) 
    # Set the overlay size 
    size = "big" 
    # Set the corner the overlay will be displayed in 
    pos = "TL" 
    # Set the defaults style 
    style = "plastik" 

# Class that loads, stores and saves settings 
class settings: 
    # Set the file_name for use by other functions 
    def __init__(self, file_name = "settings.ini"): 
     self.file_name = file_name 
     # Set the install path in the vars module 
     vars.install_path = os.getcwd() 
     # Check for the existence of the specified settings_file 
     if self.file_name not in os.listdir(vars.install_path): 
      print "[DEBUG] Settings file could not be found. Creating a new file with default settings" 
      self.write_def() 
      self.read_set() 
     else: 
      try: 
       self.read_set() 
      except: 
       tkMessageBox.showerror("Error", "Settings file available, but it could not be read. Writing defaults.") 
       self.write_def() 
     vars.path = self.cl_path 

    # Read the settings from a file containing a pickle and store them as class variables 
    def read_set(self): 
     with open(self.file_name, "r") as settings_file_object: 
      settings_dict = cPickle.load(settings_file_object) 
     self.version = settings_dict["version"] 
     self.cl_path = settings_dict["cl_path"] 
     self.auto_ident = settings_dict["auto_ident"] 
     self.server = settings_dict["server"] 
     self.auto_upl = settings_dict["auto_upl"] 
     self.overlay = settings_dict["overlay"] 
     self.opacity = settings_dict["opacity"] 
     self.size = settings_dict["size"] 
     self.pos = settings_dict["pos"] 
     self.style = settings_dict["style"] 

    # Write the defaults settings found in the class defaults to a pickle in a file 
    def write_def(self): 
     settings_dict = {"version":defaults.version, 
         "cl_path":defaults.cl_path, 
         "auto_ident":bool(defaults.auto_ident), 
         "server":defaults.server, 
         "auto_upl":bool(defaults.auto_upl), 
         "overlay":bool(defaults.overlay), 
         "opacity":float(defaults.opacity), 
         "size":defaults.size, 
         "pos":defaults.pos, 
         "style":defaults.style 
         } 
     with open(self.file_name, "w") as settings_file: 
      cPickle.dump(settings_dict, settings_file) 

    # Write the settings passed as arguments to a pickle in a file 
    # Setting defaults to default if not specified, so all settings are always written 
    def write_set(self, version=defaults.version, cl_path=defaults.cl_path, 
        auto_ident=defaults.auto_ident, server=defaults.server, 
        auto_upl=defaults.auto_upl, overlay=defaults.overlay, 
        opacity=defaults.opacity, size=defaults.size, pos=defaults.pos, 
        style=defaults.style): 
     settings_dict = {"version":version, 
         "cl_path":cl_path, 
         "auto_ident":bool(auto_ident), 
         "server":server, 
         "auto_upl":bool(auto_upl), 
         "overlay":bool(overlay), 
         "opacity":float(opacity), 
         "size":str(size), 
         "pos":pos, 
         "style":style 
         } 
     with open(self.file_name, "w") as settings_file_object: 
      cPickle.dump(settings_dict, settings_file_object) 
     self.read_set() 

Répondre

0

Parfois, il faut un certain temps pour arriver à une réponse, et je viens de penser à ceci: Que ne se produit pas sur Linux qui ne se produit sur Windows? La réponse à cette question est: Changer le répertoire pour le répertoire des fichiers analysés. Et puis il devient évident: les paramètres sont stockés correctement, mais le dossier où le fichier de paramètres est créé est modifié pendant le programme, donc les paramètres ne sont pas écrits dans le fichier de paramètres d'origine, mais un nouveau fichier de paramètres est créé dans un autre emplacement.