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 :

Retrouver les paramètres de l'appli avant fermeture & Ajustement taille interface


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Points : 23
    Points
    23
    Par défaut Retrouver les paramètres de l'appli avant fermeture & Ajustement taille interface
    #Python 3.4 / PyQt4

    Bonjour ,

    J'essaie de coder une petite application qui sert à ouvrir une image et à effectuer quelques changements. mon problème : je souhaite à chaque fois que je ferme l'application , enregistrer les paramètres et au prochain lancement retrouver les mêmes paramètres et avec la dernière image enregistrée ouverte.
    Voici comment je m'y prends :

    Dans le constructeur :
    j'essaie de récupérer la liste des fichiers récents , pour les remettre dans le menu File et aussi la dernière géométrie et état de la fenêtre.

    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
     
            settings = QSettings()
            self.recentFiles = settings.value("RecentFiles")
            if isinstance(self.recentFiles , QVariant):
                self.recentFiles = self.recentFiles.toStringList()
            else:
                self.recentFiles = []
     
            Geometry = settings.value("Geometry")
            if isinstance(Geometry , QVariant):
                Geometry.toByteArray()
                self.restoreGeometry(Geometry)
     
            State = settings.value("MainWindow/State")
            if isinstance(State,QVariant):
                State.tyoByteArray()
                self.restoreState(State)
            QTimer.singleShot(0, self.loadInitialFile)
    le code pour charger la dernière image ouverte avant fermeture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def loadInitialFile(self):
            settings = QSettings()
            fname = settings.value("LastFile")
            p = True
            if p:
                if isinstance(fname,QVariant):
                    fname.toString()
                else:
                    fname = False
            if fname and QFile.exists(fname):
                self.loadFile(fname)
    Voici Mon CloseEvent , qui permet de les enregistrer :

    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
        def closeEvent(self,event):
            if self.okToContinue():
                settings = QSettings()
                if self.filename is not None:
                    settings.setValue("LastFile", self.filename)
                if self.filename is None:
                    pass
                settings.setValue("LastFile", self.filename)
                if self.recentFiles:
                    settings.setValue("RecentFiles", self.recentFiles)
                if not self.recentFiles:
                    pass
                settings.setValue("RecentFiles", self.recentFiles)
                settings.setValue("Geometry" , self.saveGeometry())
                settings.setValue("MainWindow/State",self.saveState())
            else:
                event.ignore()
    dans la documentation de PyQt4 : il est dit que SetValue ( QString , QValue ) prend un QValue en second argument , sauf qu'à chaque fois que j'essaie d'en mettre , j'obtiens le message d'erreur durant l'exécution : QVariant represents a mapped type and cannot be instantiated.

    Une autre question : Comment ajuster la taille de mon application en fonction de l'image importé ? , des fois l'image est trop grande et la taille de mon application est petite , je dois donc cliquer sur le carreau windows ( Agrandir ) pour agrandir l'interface et pouvoir tout voir.

    Bien Cordialement,

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 465
    Points : 9 254
    Points
    9 254
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour QSettings, il faut regarder la doc de PyQt: http://pyqt.sourceforge.net/Docs/PyQ...qsettings.html.

    Les données à enregistrer sont fournies un peu comme un dictionnaire: .setValue("cle", valeur). La valeur peut être une donnée en Python pure (12, 6.345, "toto", [1,2,3], ...) ou une donnée Qt (QtCore.QPoint(20,30), ...).

    La récupération des données se fait comme suit: .value("cle", valeurpardefaut, type=). La valeur par défaut est renvoyée quand la cle n'existe pas. Le type peut être le type d'une donnée Python ou le type d'une donnée Qt entre guillements (il y a d'ailleurs une erreur dans l'exemple fournie dans la doc: il faut mettre QPoint entre guillemets). Cela permet de garantir que la donnée récupérée a le bon type, quelque soit la méthode de stockage.

    A mon avis, il vaut mieux éviter QVariant: il est bien dit dans la doc que PyQt (4 ou 5) se débrouille pour faire des conversions automatiques QVariant <=> type Python.

    Petit complément: en ce qui me concerne, j'utilise un fichier .ini placé dans mon home. Je le programme comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            configini = os.path.join(os.path.expanduser('~'), ".monprogramme.ini")
            settings = QtCore.QSettings(configini, QtCore.QSettings.IniFormat)
    Le grand avantage est que je peux le retrouver facilement dans le disque, et l'éditer voire le modifier hors cession avec un simple éditeur de texte. J'ai bien peur que la version "fichier de registre" par défaut sous Windows soit moins pratique... Un autre avantage est que plusieurs utilisateurs du même programme sur le même PC auront donc des fichiers de configuration différents.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci , ça marche maintenant mis à part la geométrie , bien que j'utilise saveGeometry() comment deuxième argument du setValue() , quand je réouvre l'application : je retrouve la dernière image mais pas la dernière géomètrie (dimensions de la fenêtre ).

    Pouvez-vous développer plus votre idée du ficher Ini svp ? vous l'écrivez à chaque fois que vous quittez l'application pour enregistrer les paramètres et puis vous le relisez dans le constructeur ?

    Bien cordialement,

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 465
    Points : 9 254
    Points
    9 254
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un petit exemple d'utilisation. Je me suis contenté d'exploiter l'exemple de la doc: http://pyqt.sourceforge.net/Docs/PyQ...qsettings.html

    Au 1er lancement, le fichier ini n'existe pas: il est donc nécessaire de placer une valeur par défaut (2ème argument de .value).

    L'enregistrement des données à conserver se fait à la fermeture de la fenêtre, qui exécute automatiquement la méthode closeEvent: il suffit donc de la surcharger.

    C'est en PyQt5, mais le remplacement de "QtWidgets" par "QtGui" devrait suffire pour que ça marche sous PyQt4.

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    """
    Exemple d'utilisation de QSettings
    """
     
    import sys
    import os
    from PyQt5 import (QtWidgets, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.resize(300, 200)
     
            configini = os.path.join(os.path.expanduser('~'), ".test03.ini")
            settings = QtCore.QSettings(configini, QtCore.QSettings.IniFormat)
     
            int_value = settings.value('int_value', 99, type=int)
            point_value = settings.value('point_value', QtCore.QPoint(5, 5), type="QPoint")
            list_value = settings.value('list_value', [], type=int)
            dict_value = settings.value('dict_value', {}, type=int)
            toto = settings.value('toto', 'abcd', type=str) # la clé 'toto' n'existe pas!
     
            QtWidgets.QMessageBox.information(self, 
                    "Données de QSettings", 
                    ("int_value: %s\n" % repr(int_value))+\
                    ("point_value: %s\n" % repr(point_value))+\
                    ("list_value: %s\n" % repr(list_value))+\
                    ("dict_value: %s\n" % repr(dict_value))+\
                    "toto: %s\n" % toto)
     
        def closeEvent(self, event):
     
            configini = os.path.join(os.path.expanduser('~'), ".test03.ini")
            settings = QtCore.QSettings(configini, QtCore.QSettings.IniFormat)
     
            settings.setValue('int_value', 42)
            settings.setValue('point_value', QtCore.QPoint(10, 12))
            settings.setValue('list_value', [1, 2, 3])
            settings.setValue('dict_value', {'one': 1, 'two': 2})
     
            # This will write the setting to the platform specific storage.
            del settings
     
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fenetre = Fenetre()
        fenetre.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fenetre.show()
        sys.exit(app.exec_())
    Ok?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Parfait , j'ai résolu le problème , avec votre méthode en plus.

    Merci énormément pour vos conseils

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

Discussions similaires

  1. Retrouver les paramètres d'un dégradé radial
    Par Celelibi dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 23/03/2013, 17h51
  2. Retrouver les paramètres d'une checkbox sur une page fille
    Par Amokrane dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 31/07/2008, 13h28
  3. Réponses: 2
    Dernier message: 09/01/2008, 08h50
  4. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42
  5. Réponses: 1
    Dernier message: 23/08/2005, 14h07

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