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

PyQt Python Discussion :

Problemes avec Qsettings


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 89
    Par défaut Problemes avec Qsettings
    Bonjour,

    Je developpe ma 1ere application sous Python 3 et QT 5 sous Linux (Tirez pas je suis pas developpeur). Il s'agit d'une GUI pour un logiciel en ligne de commande (dvgrab pour ceux qui connaissent) pour récuperer mes films de mon camescope DV. J'arrive à mes préférences avec deux methodes loadSettings qui me sert à charger mes parametres et saveSettings pour les sauvegarder. J'ai choisi de passer par QT plutot que par configparser et j'ai épluché la doc pour faire le bout de code qui suit. Je ne pensais pas faire d'erreur, j'ai créé ma methode saveSettings sans probleme de lancement de ma Gui. Je me suis attaqué à la methode loadSettings et quand j'ai voulu testé, mon appli crashes avec cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [olivier@thorielle QdvGrab]$ python src/ui/qdvgrab.py 
    Welcome to QDvGrab 0.10. 
    Hope you'll enjoy it. 
    Please report all bugs,features request and comments at olivier@openshot.org
     
    Traceback (most recent call last):
      File "/home/olivier/Developpement/QdvGrab/src/ui/preferences.py", line 272, in loadSettings
        automatic_conversion = settings.value('automatic_conversion').toBool()
    AttributeError: 'NoneType' object has no attribute 'toBool'
    Abandon (core dumped)
    Si quelq'un pouvait m'eclairer, je lui en serais reconnaissant et par avance merci.
    Voici le code des deux methodes en question :

    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
    #===================================================================================================================
        def loadSettings(self):
     
            """
            Here we load user settings and if none a basic config by default is loaded
     
            """
     
            settings = QSettings()
     
            language = settings.value('language').toString()
     
            new_output_path = settings.value('new_output_path').toString()
            name_camcorder = settings.value('name_camcorder').toString()
     
            formats_choose = settings.value('formats_choose').toString()
            automatic_conversion = settings.value('automatic_conversion').toBool()
            detection_scene = settings.value('detection_scene').toBool()
     
            automatic_record = settings.value('automatic_record').toBool()
     
            if language:
                index = self.ui.cmblanguages.itemText(language)
                self.ui.cmblanguages.setCurrentIndex(index)
            else:
                self.ui.cmblanguages.setCurrentIndex(language)
            if new_output_path:
                self.ui.lneoutputfile.setText(new_output_path)
            if name_camcorder:
                self.ui.lnenamecamecorder.setText(name_camcorder)
            if formats_choose:
                index = self.ui.cmbformatcapture.itemText(formats_choose)
                self.ui.cmbformatcapture.setCurrentIndex(index)
            else:
                self.ui.cmbformatcapture.setCurrentIndex(formats_choose)
            if automatic_conversion:
                self.ui.chknone.setChecked(True)
            if detection_scene:
                self.ui.chkdetection.setChecked(True)
            if automatic_record:
                self.ui.chkautomaticrecord.setChecked(True)
     
        #===================================================================================================================
        def saveSettings(self):
     
            """
            Here we save users setting when the application is closed and if none a basic config by default is loaded
     
            """
     
            #MainWindowSettings
            language = QLocale.system().name()
     
            #GeneralSettings
            new_output_path = os.path.join(QDir.homePath() + "/Videos/")
            name_camcorder = self.ui.lnenamecamecorder.text()
            formats_choose = self.ui.cmbformatcapture.setCurrentIndex()
     
            #ConversionSettings
            automatic_conversion = self.ui.chknone.isChecked()
            detection_scene = self.ui.chkdetection.isChecked()
     
            #CaptureSettings
            automatic_record = self.ui.chkautomaticrecord.isChecked()
     
            settings = QSettings(QSettings.SystemScope, 'eCreate', 'qdvgrab')
     
            #settings.beginGroup('MainWindowSettings')
            #settings.setValue()
            #settings.setValue()
            #settings.endGroup()
     
            settings.beginGroup('GeneralSettings')
            settings.setValue('language', language)
            settings.setValue('new_output_path', new_output_path)
            settings.setValue('name_camcorder', name_camcorder)
            settings.endGroup()
     
            settings.beginGroup('ConversionSettings')
            settings.setValue('formats_choose', formats_choose)
            settings.setValue('automatic_conversion', automatic_conversion)
            settings.setValue('detection_scene', detection_scene)
            settings.endGroup()
     
            settings.beginGroup('CaptureSettings')
            settings.setValue('automatic_record', automatic_record)
            settings.endGroup()
     
        #=============================================================================================================

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    QSettings ne fait pas la différence entre bool, int et str.

    Du coup j'ai fait ça perso :
    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
    ### Système de gestion des configurations QSettings
    ## Création ou ouverture du fichier de config
    Configs = QSettings(QSettings.NativeFormat, QSettings.UserScope, "MKV Extractor Qt5")
     
    ## Donne le bon type de variable
    try:
        # Boucle sur les valeurs par défaut
        for Key, Value in DefaultValues.items():
            # Si l'option n'existe pas, on l'ajoute au fichier avec la valeur de base
            if not Configs.contains(Key):
                Configs.setValue(Key, Value)
     
            # Si l'option existe, on la change dans le bon format
            else:
                KeyType = type(Value)
     
                if KeyType is bool: # Dans le cas de vrai ou faux
                    if Configs.value(Key) == "true": Configs.setValue(Key, True)
                    else: Configs.setValue(Key, False)
     
                elif KeyType is int: # Dans le cas de nombre
                    Configs.setValue(Key, int(Configs.value(Key)))
     
    ## S'il y a eu un problème, on réinitialise tout
    except:
        for Key, Value in DefaultValues.items():
            Configs.setValue(Key, Value)
    DefaultValues étant un dico contenant toutes les valeurs par défaut.

    Ca permet d'eviter les plantages car le fichier de config n'a pas toutes les valeurs essentielles ou pas dans le bon format.

    Mais d'autres retours seraient intéressants pour voir si je délire ou non

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    J'écrirais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    automatic_record = settings.value('automatic_record', type=bool)
    et si la clé n'existe pas, pour avoir une valeur par défaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    automatic_record = settings.value('automatic_record', True, type=bool)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 89
    Par défaut
    Salut à vous deux et merci de m'aider. Vous êtes pas sorti de l'auberge avec moi. Outre son usage, cette appli me sert à tester plein de choses et à augmenter mes connaissances sur des choses que je considère essentiel, au moins à ce niveau là.

    Je vais regarder tout ça dans les prochains jours et je vous donnerai un retour de mes progrès bientôt.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 89
    Par défaut
    Pour l'instant, je n'ai fais que la méthode préconiser par wiztricks qui me semble la plus simple et la plus rapide.

    Cependant, j'ai eu des problèmes (int et str) avec mes combobox, d'autres que j'ai résolu facilement. Autant pour les langages sera ne pose pas de problèmes et c'est d'ailleurs plus logique. Autant pour les formats, cela me pose un soucis car je pense que c'est plus logique d’appeler l'index que d’appeler le nom complet. ex 0 au lieu de 'Dv Raw (.dv)'.

    J'aurai peut-être du aussi préciser que dans mes préférences j'avais rempli mon combobox de la manière suivante. J'avais aussi charger le fichier des préférences au démarrage (fonction def loadSettings). Et que dans mon fichier principal j'avais une fonction de chargement des valeurs.

    Voici le code qui semble marcher (au moins je n'ai pas de crash quand je veux ouvrir les preferences.
    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
    def loadSettings(self):
     
            """
            Here we load user settings and if none a basic config by default is loaded
     
            """
     
            settings = QSettings()
     
            language = settings.value('language', type=str)
     
            new_output_path = settings.value('new_output_path', type=str)
            name_camcorder = settings.value('name_camcorder', type=str)
     
            formats_choose = settings.value('formats_choose', True, type=str)
            automatic_conversion = settings.value('automatic_conversion', True, type=bool)
            detection_scene = settings.value('detection_scene', True, type=bool)
     
            automatic_record = settings.value('automatic_record', True, type=bool)
     
            if language:
                value = self.ui.cmblanguages.addItem(language)
                self.ui.cmblanguages.setCurrentText(value)
            else:
                self.ui.cmblanguages.setCurrentText(language)
            if new_output_path:
                self.ui.lneoutputfile.setText(new_output_path)
            if name_camcorder:
                self.ui.lnenamecamcorder.setText(name_camcorder)
            if formats_choose:
                format = self.ui.cmbformatcapture.addItem(formats_choose)
                self.ui.cmbformatcapture.setCurrentText(format)
            else:
                self.ui.cmbformatcapture.setCurrentText(formats_choose)
            if automatic_conversion:
                self.ui.chknone.setChecked(True)
            if detection_scene:
                self.ui.chkdetection.setChecked(True)
            if automatic_record:
                self.ui.chkautomaticrecord.setChecked(True)
    Le code de la fonction saveSettings n'a pas changé.

    Voici ce que j'ai inclus au debut de la fonction init pour remplir ma combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    self.setupUi()
            self.connectActions()
            self.updateUi()
     
            QTimer.singleShot(0, self.loadSettings)
            #QTimer.singleShot(1000, self.dvgrabPath)
     
            format_capture = ['Dv Raw (.dv)', 'DV 2 (.avi)', 'Dv (.avi)', 'Hdv (.m2t)', 'Mpeg 2 (.mpg)', 'Mov (.mov)']
            for format in format_capture:
                self.ui.cmbformatcapture.addItem(format)
                self.ui.cmbformatcapture.setCurrentIndex(0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def connectActions(self):
     
            """
            connection of all events
            """
            self.ui.btncredits.clicked.connect(self.creDits)
            self.ui.btndvgrab.clicked.connect(self.dvgrabPath)
            self.ui.btntranscode.clicked.connect(self.transcodePath)
            self.ui.btnchoosefile.clicked.connect(self.outputPath)
            self.ui.cmblanguages.currentIndexChanged.connect(self.languageSelected)
            self.ui.cmbformatcapture.currentIndexChanged.connect(self.chooseFormatCapture)
            self.ui.chknone.toggled.connect(self.chooseAutomaticConversion)
    Voici le code dans mon fichier principal
    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
    self.setupUi()
            self.connectActions()
            self.updateUi()
     
            QTimer.singleShot(0, self.loadSettings)
    .........................
    ===================================================================================================================
     
        def loadSettings(self):
     
     
            settings = QSettings()
     
            new_output_path = settings.value("output_default_path")
            name_camcorder = settings.value("name_camcorder")
            formats_choose = settings.value("formats_choose")
            automatic_conversion = settings.value("automatic_conversion")
            detection_scene = settings.value("detection_scene")
            automatic_record = settings.value("automatic_record")
     
            if new_output_path:
                self.ui.lneoutputfile.setText(new_output_path)
            if name_camcorder:
                self.ui.lnenamecamecorder.setText(name_camcorder)
            if formats_choose:
                self.ui.cmbformatcapture.setCurrentIndex(formats_choose)
            if automatic_conversion:
                self.ui.chknone.setChecked(True)
            if detection_scene:
                self.ui.chkdetection.setChecked(True)
            if automatic_record:
                self.ui.chkautomaticrecord.setChecked(True)
     
        # ==================================================================================================================
    Je suis en train de creer un dictionnaire defaultValues directement dans les preferences et de voir ce que je peux faire avec.

    J'ai oublié de rajouter le code pour l'enregistrement du fichier à la fermeture de la fenetre principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def closeEvent(self, event):
     
            """
            function run just before the mainwindow is closed and stop all work in progress and save settings
             """
     
            #stop work in progress if there are one
     
     
            #Save all settings if they have done modified
            PreFerences.saveSettings()
     
            event.accept()

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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