Supra débutant SVP (QT - PYTHON)

Supra débutant SVP (QT - PYTHON) - Python - Programmation

Marsh Posté le 05-06-2010 à 18:51:40    

Bonjour.
J'ai le pack QT avec QTDesigner
Donc j'ai remarqué qu'on pouvait  intégrer de magnifiques formulaires avec tout un tas de boutons  
on sauvegarde ça sous le format .UI
 
donc j'ai plusieurs questions :
 
1/ Comment met-on du code sur les boutons et autres (je suis un "ancien" de visual basic)
2/ Peut-on créer un EXE avec ces trucs
 
Merci


---------------
http://www.ypikay.com
Reply

Marsh Posté le 05-06-2010 à 18:51:40   

Reply

Marsh Posté le 05-06-2010 à 21:31:35    

erwan83 a écrit :

Bonjour.
J'ai le pack QT avec QTDesigner
Donc j'ai remarqué qu'on pouvait  intégrer de magnifiques formulaires avec tout un tas de boutons  
on sauvegarde ça sous le format .UI
 
donc j'ai plusieurs questions :
 
1/ Comment met-on du code sur les boutons et autres (je suis un "ancien" de visual basic)
2/ Peut-on créer un EXE avec ces trucs
 
Merci


 
Hum, gros débutant en Qt..
 
Je vais pas te dire "il faut faire comme-ci, il faut faire comme ça" car chacun a sa propre façon de penser. Mais personnellement, je ne supporte pas QDesigner. Je l'utilise parfois pour voir comment il organise certains trucs mais ensuite je fais mes widget à la main avec un simple éditeur.
 
Ce qu'il faut savoir dans Qt, c'est que chaque objet possède en natif différents signaux. Par exemple un bouton possèdera le signal "clicked()" émit lorsqu'on clique dessus, le signal "pressed()" émit lorsqu'on le presse etc. Les signaux sont associés à la nature de l'objet. Par exemple un QTextEdit possèdera le signal "textChanged()" émit chaque fois que le texte change mais un QLabel n'aura pas ce signal.
 
Ensuite tu peux associer chaque signal de l'objet à une fonction écrite par toi (ce qu'on appelle "slot" ). Ainsi, quand le signal est émit, la fonction est alors appelée.
Certains objets possèdes des slots déjà écrits qu'on peut alors relier directement. Par exemple une fenêtre possède le slot "close()" qui la ferme.
 
Voici un petit code de démo

Code :
  1. #!/usr/bin/env python
  2. # coding: UTF-8 -*-
  3.  
  4. import sys
  5. try:
  6.     from PyQt4.QtCore import *
  7.     from PyQt4.QtGui import *
  8. except:
  9.     import time
  10.     for i in range(10):
  11.         print "PyQt non installé - A vérifier (%d/10)" % (i + 1)
  12.     time.sleep(5)
  13.     sys.exit(1)
  14.  
  15. class QtAppli(QApplication):
  16.     "Fenêtre de l'application"
  17.  
  18.     # Constructeur fenêtre
  19.     def __init__(self,
  20.             argv):
  21.  
  22.         # Message de contrôle
  23.         print "QtAppli (qt v%s, pyqt_v%s)" % (QT_VERSION_STR, PYQT_VERSION_STR)
  24.  
  25.         # Appel constructeur de l'objet hértié
  26.         QApplication.__init__(self, argv)
  27.  
  28.         # Widget principale
  29.         self.__mainWid=QMainWindow()
  30.         self.__mainWid.setCentralWidget(QWidget(self.__mainWid))
  31.         self.__mainWid.statusBar()
  32.  
  33.         # Titre
  34.         self.__mainWid.setWindowTitle(
  35.             QString.fromUtf8("Vérification Qt (v%s)" % QT_VERSION_STR)
  36.         )
  37.  
  38.         # Un espace de rangement
  39.         mainLayout=QVBoxLayout(self.__mainWid.centralWidget())
  40.  
  41.         # Le bouton
  42.         btn=QPushButton(
  43.             QString.fromUtf8("Surtout ne pas cliquer là !!!" )
  44.         )
  45.         self.connect(btn, SIGNAL("clicked()" ), self.slotAction)
  46.         mainLayout.addWidget(btn)
  47.  
  48.         # Le bouton version
  49.         ver=QPushButton(
  50.             QString.fromUtf8("A propos de Qt" )
  51.         )
  52.         self.connect(ver, SIGNAL("clicked()" ), self.slotQt)
  53.         mainLayout.addWidget(ver)
  54.  
  55.         # Pour quitter
  56.         quit=QPushButton(
  57.             QString.fromUtf8("Quitter" )
  58.         )
  59.         self.connect(quit, SIGNAL("clicked()" ), self.__mainWid, SLOT("close()" ))
  60.         mainLayout.addWidget(quit)
  61.     # __init__()
  62.  
  63.     # Affichage et lancement application
  64.     def run(self):
  65.         self.__mainWid.show()
  66.         self.exec_()
  67.     # run()
  68.  
  69.     # Slot qui affiche une fenêtre avec un texte
  70.     def slotAction(self):
  71.         print "test"
  72.  
  73.         dial=QDialog(self.__mainWid.centralWidget())
  74.         dial.setModal(True)
  75.         dial.setWindowTitle(
  76.             QString.fromUtf8("Félicitations, Qt fonctionne parfaitement !!!" )
  77.         )
  78.  
  79.         mainLayout=QVBoxLayout(dial)
  80.  
  81.         lab=QLabel(
  82.             QString.fromUtf8("<center><font size='+5'>C'était écrit <u><font color='red'>SURTOUT</font></u> ne pas cliquer !!!</font></center>" )
  83.         )
  84.         mainLayout.addWidget(lab)
  85.  
  86.         btn=QPushButton(
  87.             QString.fromUtf8("Félicitations, Qt fonctionne parfaitement !!!" )
  88.         )
  89.         btn.connect(btn, SIGNAL("clicked()" ), dial, SLOT("close()" ))
  90.         mainLayout.addWidget(btn)
  91.         dial.show()
  92.     # slotAction()
  93.  
  94.     # Slot qui affiche la version de Qt
  95.     def slotQt(self):
  96.         print "qt"
  97.  
  98.         # Fenêtre "A propos de Qt"
  99.         QMessageBox.aboutQt(
  100.             self.__mainWid,
  101.             "à propos de Qt...",
  102.         )
  103.     # slotQt()
  104. # class QtAppli
  105.  
  106. Appli=QtAppli(sys.argv)
  107. Appli.run()


 
Donc voilà. Toutefois faut pas hésiter à ouvrir la doc. Perso je fais du Qt depuis 4 ans mais j'ai en permanence la doc ouverte sur mon navigateur et j'arrête pas d'aller dessus pour voir les méthodes et propriétés possibles pour mes objets.
 
Concernant l'exécutable, c'est possible. Te faut juste télécharger et installer py2exe. Ensuite il y a qq trucs à faire mais les tutos te l'expliqueront.
Sinon j'ai aussi ce petit script qui automatise certains trucs...

Code :
  1. #!/usr/bin/env python
  2. # coding: UTF-8 -*-
  3.  
  4. import sys
  5. from distutils.core import setup
  6. import py2exe
  7.  
  8. # Préparation environnement
  9. if len(sys.argv) < 2:
  10.     sys.argv.append("py2exe" )
  11. else:
  12.     if sys.argv[1] != "py2exe": sys.argv[1]="py2exe"
  13.  
  14. # Paramètres
  15. pgm="nom_du_programme python.py"      # Ici mettre le nom de son programme
  16.  
  17. # Création exécutable
  18. setup(
  19.     console=[{"script" : "%s" % pgm}],
  20.     options={
  21.         "py2exe" : {
  22.             "includes":
  23.                 [
  24.                     "sip",
  25.                     "numpy",
  26.                     "PyQt4.QtCore",
  27.                     "PyQt4.QtSvg"
  28.                 ]
  29.             }
  30.         }
  31. )


La création de l'exécutable créera deux sous-dossiers "dist" et "utils". Le sous-dossier "utils" ne sert que pendant la création et peut être supprimé ensuite. Le sous-dossier "dist" contient l'exécutable proprement dit (plus les librairies Python). A noter que si ton programme fait appel à des fichiers divers (comme une image de fond d'écran par exemple) il faudra recopier ledit fichier dans le sous-dossier "dist".


Message édité par Sve@r le 05-06-2010 à 21:36:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-06-2010 à 22:44:02    

Je te remercie, c'est vraiment sympa de ta part !


---------------
http://www.ypikay.com
Reply

Marsh Posté le 11-06-2010 à 09:27:53    

Alors voila j'ai installé PY2EXE à grand peine, déjà pour trouver la version compatible.... y'en a quelques unes  :pt1cable:  
j'ai donc suivi les instructions, il a trouvé python 2.5 donc ok il s'est installé cependant il m'a retourné trois erreurs :
 
Could not create...
py2exe-2.5
 
Could not set key...
Python 2.5 py2exe-0.6.8
 
Could not set key value....
"C:\python25\Removepy2exe.exe"-u "C:\python25\p2yexe-wininst.log"
 
py2exe is now installed on your machine.
There are some samples in the 'samples' subdirectory.
 
Ensuite, lors du premier lancement, j'ai eu une rafale de codes d'erreur :
 

Code :
  1. running py2exe
  2. creating C:\Python25\build
  3. creating C:\Python25\build\bdist.win32
  4. creating C:\Python25\build\bdist.win32\winexe
  5. creating C:\Python25\build\bdist.win32\winexe\collect-2.5
  6. creating C:\Python25\build\bdist.win32\winexe\bundle-2.5
  7. creating C:\Python25\build\bdist.win32\winexe\temp
  8. creating C:\Python25\dist
  9. *** searching for required modules ***
  10. Traceback (most recent call last):
  11.   File "C:/Python25/python to exe.py", line 31, in <module>
  12.     "PyQt4.QtSvg"
  13.   File "C:\Python25\lib\distutils\core.py", line 151, in setup
  14.     dist.run_commands()
  15.   File "C:\Python25\lib\distutils\dist.py", line 974, in run_commands
  16.     self.run_command(cmd)
  17.   File "C:\Python25\lib\distutils\dist.py", line 994, in run_command
  18.     cmd_obj.run()
  19.   File "C:\Python25\Lib\site-packages\py2exe\build_exe.py", line 228, in run
  20.     self._run()
  21.   File "C:\Python25\Lib\site-packages\py2exe\build_exe.py", line 281, in _run
  22.     self.find_needed_modules(mf, required_files, required_modules)
  23.   File "C:\Python25\Lib\site-packages\py2exe\build_exe.py", line 1202, in find_needed_modules
  24.     mf.import_hook(mod)
  25.   File "C:\Python25\Lib\site-packages\py2exe\mf.py", line 716, in import_hook
  26.     return Base.import_hook(self,name,caller,fromlist,level)
  27.   File "C:\Python25\Lib\site-packages\py2exe\mf.py", line 136, in import_hook
  28.     q, tail = self.find_head_package(parent, name)
  29.   File "C:\Python25\Lib\site-packages\py2exe\mf.py", line 204, in find_head_package
  30.     raise ImportError, "No module named " + qname
  31. ImportError: No module named numpy


 
Je vais essayer de lancer à nouveau l'insall du môssieur en mode admin et je vous tiens au courant de l'évolution


---------------
http://www.ypikay.com
Reply

Marsh Posté le 11-06-2010 à 09:29:17    

Ha !!!!!!
Saloperie de Vista !
en mode admin ca s'installe sans problème !
 
Cependant :

Code :
  1. running py2exe
  2. *** searching for required modules ***
  3. Traceback (most recent call last):
  4.   File "C:/Python25/python to exe.py", line 31, in <module>
  5.     "PyQt4.QtSvg"
  6.   File "C:\Python25\lib\distutils\core.py", line 151, in setup
  7.     dist.run_commands()
  8.   File "C:\Python25\lib\distutils\dist.py", line 974, in run_commands
  9.     self.run_command(cmd)
  10.   File "C:\Python25\lib\distutils\dist.py", line 994, in run_command
  11.     cmd_obj.run()
  12.   File "C:\Python25\Lib\site-packages\py2exe\build_exe.py", line 228, in run
  13.     self._run()
  14.   File "C:\Python25\Lib\site-packages\py2exe\build_exe.py", line 281, in _run
  15.     self.find_needed_modules(mf, required_files, required_modules)
  16.   File "C:\Python25\Lib\site-packages\py2exe\build_exe.py", line 1202, in find_needed_modules
  17.     mf.import_hook(mod)
  18.   File "C:\Python25\Lib\site-packages\py2exe\mf.py", line 716, in import_hook
  19.     return Base.import_hook(self,name,caller,fromlist,level)
  20.   File "C:\Python25\Lib\site-packages\py2exe\mf.py", line 136, in import_hook
  21.     q, tail = self.find_head_package(parent, name)
  22.   File "C:\Python25\Lib\site-packages\py2exe\mf.py", line 204, in find_head_package
  23.     raise ImportError, "No module named " + qname
  24. ImportError: No module named numpy

Message cité 1 fois
Message édité par erwan83 le 11-06-2010 à 09:33:14

---------------
http://www.ypikay.com
Reply

Marsh Posté le 11-06-2010 à 22:14:14    

erwan83 a écrit :

Saloperie de Vista !


Hé oui. Et malgré leur pub de neuneu où ils montrent que maintenant, avec Seven, on peut comparer 2 factures sur 2 fenêtres ou sortir de la veille en moins de 7 secondes, ce sera pareil.
 
Pour l'instant, rien ne remplace un bon vieux XP (hormis Linux bien évidemment)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed