Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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(...

Vincent
Oqapy      Qarte      PaQager

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.


Vincent
Oqapy      Qarte      PaQager

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.


Vincent
Oqapy      Qarte      PaQager

Hors ligne