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 :

Convaincu par PyQt, mais des questions


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Enseignant
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 32
    Points
    32
    Par défaut Convaincu par PyQt, mais des questions
    Salut à tous,

    La seule chose que je maîtrisais jusqu'à présent était Tkinter, mais je l'avoue celui-ci n'est pas très esthétique .

    J'ai pu faire quelques essais de pyQt (pour l'instant Qt3) avec QT Designer, puis en rajoutant une fonction avec boucle pour mettre en action une barre de progression . J'aime vraiment QT Designer et je trouve la syntaxe PyQt pas aussi compliquée que ce que je m'imaginais . Voilà ce que j'ai pu obtenir :

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'activerProgressBar.ui'
    #
    # Created: jeu sep 20 01:28:41 2007
    #      by: The PyQt User Interface Compiler (pyuic) 3.17
    #
    # WARNING! All changes made in this file will be lost!
     
     
    '''
    Generer le *.py a partir du fichier .ui de QT Designer :
    pyuic -x activerProgressBar.ui -o activerProgressBar.py
    '''
     
     
    import sys
    from qt import *
     
     
    class activerProgressBar(QDialog):
        def __init__(self,parent = None,name = None,modal = 0,fl = 0):
            QDialog.__init__(self,parent,name,modal,fl)
     
            if not name:
                self.setName("activerProgressBar")
     
            self.setSizeGripEnabled(1)
     
     
            LayoutWidget = QWidget(self,"Layout1")
            LayoutWidget.setGeometry(QRect(10,40,490,33))
            Layout1 = QHBoxLayout(LayoutWidget,0,6,"Layout1")
     
            self.boutActiverProgresseBar = QPushButton(LayoutWidget,"ActiverProgresseBar")
            self.boutActiverProgresseBar.setAutoDefault(1)
            self.boutActiverProgresseBar.setDefault(1)
            Layout1.addWidget(self.boutActiverProgresseBar)
     
            self.Fermer = QPushButton(LayoutWidget,"Fermer")
            self.Fermer.setAutoDefault(1)
            Layout1.addWidget(self.Fermer)
     
            self.progressBar1 = QProgressBar(self,"progressBar1")
            self.progressBar1.setGeometry(QRect(10,110,491,25))
     
            self.languageChange()
     
            self.resize(QSize(511,182).expandedTo(self.minimumSizeHint()))
            self.clearWState(Qt.WState_Polished)
     
            self.connect(self.boutActiverProgresseBar,SIGNAL("clicked()"),self.foncBoucleBarre)
            self.connect(self.Fermer,SIGNAL("clicked()"),self.close)
     
     
        def languageChange(self):
            self.setCaption(self.__tr("MyDialog"))
            self.boutActiverProgresseBar.setText(self.__tr("&Activer ProgressBar"))
            self.boutActiverProgresseBar.setAccel(QKeySequence(self.__tr("Alt+A")))
            self.Fermer.setText(self.__tr("&Fermer"))
            self.Fermer.setAccel(QKeySequence(self.__tr("Alt+F")))
     
     
        def __tr(self,s,c = None):
            return qApp.translate("activerProgressBar",s,c)
     
     
        # Fonction perso rajoutee (activation 
        # de la barre de progression) .
        def foncBoucleBarre(self) :
     
    	l=[y for y in range(81278)]
     
    	compt=1
     
    	for parc in range(len(l)) :
     
    		print parc
     
    		# --------------------------------------------
    		# La barre de progression fait bien son boulot
    		self.progressBar1.setProgress(compt)
     
    		self.progressBar1.setTotalSteps(len(l))
     
    		compt=compt+1
    		# --------------------------------------------
     
    	#self.progressBar1.setProgress(100)
    	# Remise a l'etat de depart de la barre
    	self.progressBar1.reset()
     
     
    if __name__ == "__main__":
        a = QApplication(sys.argv)
        QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
        w = activerProgressBar()
        a.setMainWidget(w)
        w.show()
        a.exec_loop()
    J'avoue que je ne connais pas bien la gestion des classes ... .

    Ce que je voudrais faire ici (mais aussi dans d'autres exemples qui viendront plus tard) c'est séparer l'interface et le reste, c'est à dire ici que la fonction foncBoucleBarre ne fasse plus partie de la classe activerProgressBar, mais soit par exemple dans une autre classe ou par une fonction séparée de cette classe activerProgressBar (et que tout fonctionne parfaitement évidemment), pouvez-vous m'aider svp ? . Excusez-moi je suis un gros naze dans la gestion des classes .

    Existe-t-il des documentations sur PyQt (en français et présentant avec des images une grande quantité de widgets ... et la syntaxe associée ...) ? .

    Que pensez-vous de ce bouquin : http://www.amazon.fr/Rapid-Gui-Progr.../dp/0132354187

    (il est en anglais, je pense que je peux comprendre un peu quand même) ? . Est-il didactique, bien imagé ? ... . Existe-t-il des livres en français traitant de PyQt et QT Designer ? .

    Je reviendrais avec d'autres questions un peu plus tard ... .

    a+

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 27
    Points : 29
    Points
    29
    Par défaut
    il faut que tu fasse un autre script ou tu vas importer ta classe .
    dans ce script tu va faire un peut ce qui se passe dans le if __name__ de ta classe, mais tu vas redefinir dans cet ordre d'idée .. (de tete et sans tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            taclasse.connect(taclasseapellée.boutActiverProgresseBar,SIGNAL("clicked()"),nouvellefonctionlocale)
            taclasse.connect(taclasseapellée.Fermer,SIGNAL("clicked()"),self.close)
    je ne sais si c'est le mieux mais j'ai deja reussi a faire comme ca..
    parcontre ca a tendence a faire des print 'la fonction n'est pas implementée' enfin le texte pardefaut avant que tu remplisse par ton code (tu vois de quoi je parle)

  3. #3
    Nouveau membre du Club
    Enseignant
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    Merci pour ta réponse .

    Je ne comprend pas vraiment ce que tu veux dire . Peux-tu s'il te plaît reprendre mon code et me montrer par a+b (un exemple) ce que tu veux dire ? . Je te remercie d'avance .

    a+

  4. #4
    Nouveau membre du Club
    Enseignant
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 32
    Points
    32
    Par défaut
    Bon et bien je suis très content !, j'ai trouvé la solution tout seul comme un grand . En fin de compte c'est relativement simple .

    J'ai en fait le script activerProgressBar_parent.py qui correspond à l'interface :

    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'activerProgressBar.ui'
    #
    # Created: jeu sep 20 01:28:41 2007
    #      by: The PyQt User Interface Compiler (pyuic) 3.17
    #
    # WARNING! All changes made in this file will be lost!
     
     
    '''
    Generer le *.py a partir du fichier .ui de QT Designer :
    pyuic -x activerProgressBar.ui -o activerProgressBar.py
    '''
     
     
    #import sys
    from qt import *
     
     
    class activerProgressBar(QDialog):
        def __init__(self,parent = None,name = None,modal = 0,fl = 0):
            QDialog.__init__(self,parent,name,modal,fl)
     
            if not name:
                self.setName("activerProgressBar")
     
            self.setSizeGripEnabled(1)
     
     
            LayoutWidget = QWidget(self,"Layout1")
            LayoutWidget.setGeometry(QRect(10,40,490,33))
            Layout1 = QHBoxLayout(LayoutWidget,0,6,"Layout1")
     
            self.boutActiverProgresseBar = QPushButton(LayoutWidget,"ActiverProgresseBar")
            self.boutActiverProgresseBar.setAutoDefault(1)
            self.boutActiverProgresseBar.setDefault(1)
            Layout1.addWidget(self.boutActiverProgresseBar)
     
            self.Fermer = QPushButton(LayoutWidget,"Fermer")
            self.Fermer.setAutoDefault(1)
            Layout1.addWidget(self.Fermer)
     
            self.progressBar1 = QProgressBar(self,"progressBar1")
            self.progressBar1.setGeometry(QRect(10,110,491,25))
     
            self.languageChange()
     
            self.resize(QSize(511,182).expandedTo(self.minimumSizeHint()))
            self.clearWState(Qt.WState_Polished)
     
            self.connect(self.boutActiverProgresseBar,SIGNAL("clicked()"),self.foncBoucleBarre)
            self.connect(self.Fermer,SIGNAL("clicked()"),self.close)
     
     
        def languageChange(self):
            self.setCaption(self.__tr("MyDialog"))
            self.boutActiverProgresseBar.setText(self.__tr("&Activer ProgressBar"))
            self.boutActiverProgresseBar.setAccel(QKeySequence(self.__tr("Alt+A")))
            self.Fermer.setText(self.__tr("&Fermer"))
            self.Fermer.setAccel(QKeySequence(self.__tr("Alt+F")))
     
     
        def __tr(self,s,c = None):
            return qApp.translate("activerProgressBar",s,c)
    ... et le script activerProgressBar_enfant.py qui correspond au moteur :

    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
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from qt import *
     
    from activerProgressBar_parent import *
     
     
    class Moteur(activerProgressBar):
        # ----------------------------------------
        # La classe Moteur devient une classe 
        # enfant de la classe activerProgressBar .
        # La classe Moteur est une sous-classe de
        # la classe activerProgressBar et herite en
        # consequence de toutes les caracteristiques
        # de la classe parente .
        # ----------------------------------------
     
        # Fonction perso rajoutee (activation 
        # de la barre de progression) .
        def foncBoucleBarre(self) :
     
    	l=[y for y in range(81278)]
     
    	compt=1
     
    	for parc in range(len(l)) :
     
    		print parc
     
    		# --------------------------------------------
    		# La barre de progression fait bien son boulot
    		self.progressBar1.setProgress(compt)
     
    		self.progressBar1.setTotalSteps(len(l))
     
    		compt=compt+1
    		# --------------------------------------------
     
    	# Remise a l'etat de depart de la barre
    	self.progressBar1.reset()
     
     
     
    if __name__ == "__main__":
        a = QApplication(sys.argv)
        QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
        # ----------------------------------------------
        # Au depart voila ce qu'il y avait :
        #w = activerProgressBar()
        # Voici apres ajout de la classe enfant Moteur :
        w=Moteur()
        # ----------------------------------------------
        a.setMainWidget(w)
        w.show()
        a.exec_loop()
    Quand j'éxécute activerProgressBar_enfant.py tout fonctionne parfaitement .

    Je vais pouvoir passer mon logiciel EKD de Tkinter à PyQt (PyQt4 j'espère) ça va me demander pas mal de temps je pense, et pour cela il va aussi falloir que j'aprenne à mieux me servir de Qt Designer et que je maîtrise la syntaxe des widgets qui me serviront (par exemple je ne connais pas le widget qui sert à ouvrir une boîte de dialogue pour sélectionner plusieurs fichiers, celui qui correspond à askopenfilenames [avec un s] en syntaxe Tkinter) .

    Je pense que je vais aussi avoir pas mal de questions à poser dans les temps qui viennent .

    a+

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pyprog Voir le message
    ...(par exemple je ne connais pas le widget qui sert à ouvrir une boîte de dialogue pour sélectionner plusieurs fichiers
    C'est la classe QFileDialog(). Soit tu instancies un objet de cette classe puis tu l'affiches et tu jongles avec les méthodes pour récupérer le fichier sélectionné, soit tu appelles la méthode statique "QFileDialog.getOpenFileNames" qui t'affiche une sous-fenêtre de choix avec divers boutons (c'est paramétré lors de l'appel) et te renvoie le ou les noms des fichiers choisis si tu cliques sur "ok"

    Va voir les divers exemples PyQt...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. répondre à des questions envoyée par mail
    Par sousou1108 dans le forum Entretien
    Réponses: 2
    Dernier message: 09/01/2012, 22h13
  2. [MySQL] Classer par ordre mais avec des séparations
    Par Vinuto dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/02/2010, 11h13
  3. Réponses: 22
    Dernier message: 18/05/2007, 17h46
  4. [CR]grouper des dates par semaines, mais semaines FR !
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 18/05/2004, 20h43

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