Pages : 1
#1 Le 26/06/2011, à 14:58
- toitoinebzh
pyQt ouvrir fenetre dialog
Bonjour,
j'essaye d’apprendre python et pyqt
je rencontre un soucis pour l'ouverture d'une fenêtre de dialog avec pyQt
j'ai créé un programme avec une fenetre principale et une boite de dialog
je souhaite afficher la boite de dialogue lorsque je clique sur le bouton télécharger de ma boite principale
et qu elle se referme a la fin d'une fonction
voila le code
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#
#
#!/usr/bin/python
import sys, os, time, urllib
from PyQt4 import QtGui,QtCore
class MainWindow(object):
""" Class doc """
def __init__ (self):
""" Class initialiser """
self.directory=os.getcwd()
self.url=''
# fenetre principale
self.window = QtGui.QWidget()
self.window.setWindowTitle('Dowloader')
self.label_titre = QtGui.QLabel(u"Télécharger ")
self.label_url = QtGui.QLabel("Url : ")
self.editor_url = QtGui.QLineEdit(self.url)
self.label_destination = QtGui.QLabel("Destination : ")
self.editor_destination = QtGui.QLineEdit(self.directory)
self.editor_destination.setReadOnly(True)
self.chemin_destination = QtGui.QToolButton(text='Parcourir')
self.bouton_telecharger = QtGui.QPushButton(u"Télécharger")
self.bouton_quitter = QtGui.QPushButton(u"Quitter")
self.layout = QtGui.QVBoxLayout(self.window)
self.layout.addWidget(self.label_titre)
self.layout.addWidget(self.label_url)
self.layout.addWidget(self.editor_url)
self.layout.addWidget(self.label_destination)
self.layout.addWidget(self.editor_destination)
self.layout.addWidget(self.chemin_destination)
self.layout.addWidget(self.bouton_telecharger)
self.layout.addWidget(self.bouton_quitter)
# fenetre attente
self.please_wait=QtGui.QDialog(self.window)
self.please_wait.setWindowTitle('Patienter ...')
self.txt=QtGui.QLabel(u"Merci d'attendre la fin du téléchargement")
self.fond = QtGui.QVBoxLayout(self.please_wait)
self.fond.addWidget(self.txt)
self.window.show()
def telecharger(self):
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
print self.editor_url.text()
self.url=self.editor_url.text()
print self.directory+os.sep
self.window.hide()
print 'Merci de patienter'
self.please_wait.show()
print 'Merci de patienter' # la deuxieme fenetre n'apparait pas !!
time.sleep(10)
self.please_wait.close()
print u'Terminé'
self.url=''
self.editor_url.setText(self.url)
self.window.show()
def change_directory(self):
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
default_path=self.directory
path=QtGui.QFileDialog.getExistingDirectory(self.window,u'Sélectionner un répertoire', default_path) # pb pour avoir un string
#print path.__str__()
self.directory=path.__str__()
#print type(self.directory)
#print str(self.directory.encode('utf-8'))
self.directory=str(self.directory.encode('utf-8'))
#print self.directory
#print type(self.directory)
self.editor_destination.setText(self.directory.decode('utf-8'))
def main():
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
pass
if __name__ == '__main__':
application_object = QtGui.QApplication(sys.argv)
mon_app=MainWindow()
application_object.connect(mon_app.bouton_quitter, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
application_object.connect(mon_app.bouton_telecharger, QtCore.SIGNAL('clicked()'), mon_app.telecharger)
application_object.connect(mon_app.chemin_destination, QtCore.SIGNAL('clicked()'), mon_app.change_directory)
sys.exit(application_object.exec_())
merci de votre aide
Hors ligne
#2 Le 26/06/2011, à 23:27
- VinsS
Re : pyQt ouvrir fenetre dialog
Salut,
C'est un peu moins simple que ça.
Ajoutes cette classe à ton code.
class Waiting(object):
def __init__(self, Dialog):
Dialog.setWindowTitle("Patientez")
self.layout = QtGui.QVBoxLayout(Dialog)
self.label = QtGui.QLabel(Dialog)
self.label.setText("Blabla")
self.layout.addWidget(self.label)
Dialog.show()
time.sleep(10) # Pas sur que ce soit une bonne idée
Dialog.accept()
Et dans ta fonction télécharger:
def telecharger(self):
...
...
Dialog = QtGui.QDialog()
wait = Waiting(Dialog)
Dialog.exec_()
Je ne sais pas ce que tu veux faire, mais tu dois savoir que time.sleep(x) est bloquant, donc si tu comptais que du code s'exécute pendant ce délai ça ne marchera pas. avec time.sleep tu mets tout ton code à l'arrêt.
Pour ton ouverture de dossier, utilises plutôt:
path = unicode(QtGui.QFileDialog.getExistingDirectory(...
Hors ligne
#3 Le 29/06/2011, à 18:19
- toitoinebzh
Re : pyQt ouvrir fenetre dialog
salut
merci de ton aide, ce n'est pas exactement ce que je recherche
avec ton code, la fonction sleep s’exécute puis la fenêtre de dialog s'affiche
en faite ce que je recherche c'est
1 - ouvrir la boite de dialog
2 - lancer une fonction, ici un sleep pour l'exemple
3 - fermer la boite de dialog, une fois la fonction terminée
pour l'instant je bloque au point 2-3
une fois que la fenetre est affichée je peux lancer une fonction par contre je ne trouve pas comment fermer cette boite de dialog
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, time, urllib
from PyQt4 import QtGui,QtCore
class Waiting(object):
def __init__(self, Dialog):
Dialog.setWindowTitle("Patientez")
self.layout = QtGui.QVBoxLayout(Dialog)
self.label = QtGui.QLabel(Dialog)
self.label.setText("Blabla")
self.layout.addWidget(self.label)
Dialog.show()
#time.sleep(10) # Pas sur que ce soit une bonne idée
Dialog.accept()
class MainWindow(object):
""" Class doc """
def __init__ (self):
""" Class initialiser """
self.directory=os.getcwd()
self.url=''
# fenetre principale
self.window = QtGui.QWidget()
self.window.setWindowTitle('Dowloader')
self.label_titre = QtGui.QLabel(u"Télécharger")
self.label_url = QtGui.QLabel("Url : ")
self.editor_url = QtGui.QLineEdit(self.url)
self.label_destination = QtGui.QLabel("Destination : ")
self.editor_destination = QtGui.QLineEdit(self.directory)
self.editor_destination.setReadOnly(True)
self.chemin_destination = QtGui.QToolButton(text='Parcourir')
self.bouton_telecharger = QtGui.QPushButton(u"Télécharger")
self.bouton_quitter = QtGui.QPushButton(u"Quitter")
self.layout = QtGui.QVBoxLayout(self.window)
self.layout.addWidget(self.label_titre)
self.layout.addWidget(self.label_url)
self.layout.addWidget(self.editor_url)
self.layout.addWidget(self.label_destination)
self.layout.addWidget(self.editor_destination)
self.layout.addWidget(self.chemin_destination)
self.layout.addWidget(self.bouton_telecharger)
self.layout.addWidget(self.bouton_quitter)
self.window.show()
def telecharger(self):
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
print self.editor_url.text()
self.url=self.editor_url.text()
print self.directory+os.sep
self.window.hide()
print 'Merci de patienter'
Dialog = QtGui.QDialog()
wait = Waiting(Dialog)
Dialog.exec_() # la fenetre de dialog s'affiche
time.sleep(10) # fonction bidon
# fermer la boite de dialog automatiquement ?
print u'Terminé'
self.url=''
self.editor_url.setText(self.url)
self.window.show()
def change_directory(self):
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
default_path=self.directory
path=QtGui.QFileDialog.getExistingDirectory(self.window,u'Sélectionner un répertoire', default_path) # pb pour avoir un string
#print path.__str__()
self.directory=path.__str__()
#print type(self.directory)
#print str(self.directory.encode('utf-8'))
self.directory=str(self.directory.encode('utf-8'))
#print self.directory
#print type(self.directory)
self.editor_destination.setText(self.directory.decode('utf-8'))
def main():
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
pass
if __name__ == '__main__':
application_object = QtGui.QApplication(sys.argv)
mon_app=MainWindow()
application_object.connect(mon_app.bouton_quitter, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
application_object.connect(mon_app.bouton_telecharger, QtCore.SIGNAL('clicked()'), mon_app.telecharger)
application_object.connect(mon_app.chemin_destination, QtCore.SIGNAL('clicked()'), mon_app.change_directory)
sys.exit(application_object.exec_())
Hors ligne
#4 Le 30/06/2011, à 06:08
- VinsS
Re : pyQt ouvrir fenetre dialog
Ben oui, c'était bien ce que je disais à propos du time.sleep().
La procédure que je t'ai indiqué pour l'ouverture d'une boite de dialogue est celle que j'utilise toujours et n'empêche pas une autre action en même temps. Pour une temporisation, tu devras peut-être faire appel à un thread sinon, et je pense que ce serait préférable, tu fermes ton dialogue à la fin de ta tâche.
Quelque chose comme ça:
...
Dialog = QtGui.QDialog()
wait = Waiting(Dialog)
Dialog.exec_()
reply = doSomething()
Dialog.accept()
Donc, il faut enlever 'Dialog.accept()' de la classe du dialogue puisque c'est cela qui ferme le dialogue.
Il faut aussi mettre le retour de ta tâche secondaire (que j'ai appelée doSomething()) dans une variable pour que le code attende qu'elle soit finie avant de fermer le dialogue.
Hors ligne
#5 Le 30/06/2011, à 19:41
- toitoinebzh
Re : pyQt ouvrir fenetre dialog
salut
il y a surement quelque chose que j'ai pas compris
j'ai pris en compte tes remarques et je bloque toujours au niveau de "Dialog.exec_()"
je pense pas que ce soit un bug de python ou qt
ce script fonctionne bien chez toi ?
chez moi je suis obligé de fermer la boite de dialogue avec la souris
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, time, urllib
from PyQt4 import QtGui,QtCore
def doSomething():
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
print 'on va maintenant fermer la fenetre de dialogue'
pass
class Waiting(object):
def __init__(self, Dialog):
Dialog.setWindowTitle("Patientez")
self.layout = QtGui.QVBoxLayout(Dialog)
self.label = QtGui.QLabel(Dialog)
self.label.setText("Blabla")
self.layout.addWidget(self.label)
Dialog.show()
class MainWindow(object):
""" Class doc """
def __init__ (self):
""" Class initialiser """
self.directory=os.getcwd()
self.url=''
# fenetre principale
self.window = QtGui.QWidget()
self.window.setWindowTitle('Downloader')
self.label_titre = QtGui.QLabel(u"Télécharger")
self.label_url = QtGui.QLabel("Url : ")
self.editor_url = QtGui.QLineEdit(self.url)
self.label_destination = QtGui.QLabel("Destination : ")
self.editor_destination = QtGui.QLineEdit(self.directory)
self.editor_destination.setReadOnly(True)
self.chemin_destination = QtGui.QToolButton(text='Parcourir')
self.bouton_telecharger = QtGui.QPushButton(u"Télécharger")
self.bouton_quitter = QtGui.QPushButton(u"Quitter")
self.layout = QtGui.QVBoxLayout(self.window)
self.layout.addWidget(self.label_titre)
self.layout.addWidget(self.label_url)
self.layout.addWidget(self.editor_url)
self.layout.addWidget(self.label_destination)
self.layout.addWidget(self.editor_destination)
self.layout.addWidget(self.chemin_destination)
self.layout.addWidget(self.bouton_telecharger)
self.layout.addWidget(self.bouton_quitter)
self.window.show()
def telecharger(self):
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
print self.editor_url.text()
self.url=self.editor_url.text()
print self.directory+os.sep
self.window.hide()
Dialog = QtGui.QDialog()
wait = Waiting(Dialog)
Dialog.exec_() # la fenetre de dialog s'affiche, et on reste bloqué là
reply = doSomething()
Dialog.accept()
print u'Terminé'
self.url=''
self.editor_url.setText(self.url)
self.window.show()
def change_directory(self):
""" Function doc
@param PARAM: DESCRIPTION
@return RETURN: DESCRIPTION
"""
default_path=self.directory
path=QtGui.QFileDialog.getExistingDirectory(self.window,u'Sélectionner un répertoire', default_path) # pb pour avoir un string
#print path.__str__()
self.directory=path.__str__()
#print type(self.directory)
#print str(self.directory.encode('utf-8'))
self.directory=str(self.directory.encode('utf-8'))
#print self.directory
#print type(self.directory)
self.editor_destination.setText(self.directory.decode('utf-8'))
if __name__ == '__main__':
application_object = QtGui.QApplication(sys.argv)
mon_app=MainWindow()
application_object.connect(mon_app.bouton_quitter, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
application_object.connect(mon_app.bouton_telecharger, QtCore.SIGNAL('clicked()'), mon_app.telecharger)
application_object.connect(mon_app.chemin_destination, QtCore.SIGNAL('clicked()'), mon_app.change_directory)
sys.exit(application_object.exec_())
Hors ligne
#6 Le 01/07/2011, à 14:15
- VinsS
Re : pyQt ouvrir fenetre dialog
Oui c'est normal, j'avais oublié que tu avais besoin d'une boite non modale pour cela et ces boites ne s'exécutent pas avec exec_() mais uniquement avec show().
Toutefois, cette façon de faire amène d'autres difficultés d'affichage.
Dans ton cas, un progressDialog sera plus adapté et est en plus très simple à mettre en place.
Cet exemple est fonctionnel:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
from PyQt4 import QtCore, QtGui
class MainWin(object):
def __init__(self, MainWindow):
self.centralwidget = QtGui.QWidget(MainWindow)
self.layout = QtGui.QVBoxLayout(self.centralwidget)
self.button = QtGui.QPushButton("Run", self.centralwidget)
self.layout.addWidget(self.button)
MainWindow.setCentralWidget(self.centralwidget)
self.button.clicked.connect(self.telecharger)
MainWindow.show()
def telecharger(self):
self.wait = QtGui.QProgressDialog("Patientez", "cancel", 0, 5)
self.wait.setWindowModality(QtCore.Qt.WindowModal)
self.doSomething()
def doSomething(self):
for i in range(1, 6):
time.sleep(1)
self.wait.setValue(i)
if (self.wait.wasCanceled()):
break
self.wait.setValue(5)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
main = MainWin(MainWindow)
sys.exit(app.exec_())
L'instance
QtGui.QProgressDialog("Patientez", "cancel", 0, 5)
comporte deux entiers: le minimum de la barre de progression et le maximum, lorsque celui-ci est atteint la boite se ferme d'elle même.
La seule difficulté qui peut se présenter est de ne pas connaître d'avance la durée du travail. Si il s'agit de téléchargement, la taille du fichier qui se charge peut aider.
Si l'utilisateur cancel l'opération il suffit de mettre la valeur de la progressBar à son maximum pour fermer la boite.
Hors ligne
Pages : 1