Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > GUI > PySide et PyQt
PySide et PyQt Forum d'entraide sur PySide et PyQt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/02/2013, 17h20   #1
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Par défaut Incompatibilité de type de variable (apparement) avec PyQt

Bonjour tout le monde ! Depuis quelques jours, j'éprouve quelques problèmes quant au fonctionnement de mon code. J'ose espérer que vous avez la solution, ou quelque chose qui pourrait m'aider à la résolution du problème. Voici les codes en question :

main.py :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
from globalui import *
 
def main():
	#Tous le code principal ici
	app = QtGui.QApplication(sys.argv)
	print("lolilol")
	frmMain.show()
 
	sys.exit(app.exec_())
 
 
if __name__ == "__main__":
	main()
puis globalui.py :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
# -*- coding: utf-8 -*
from frmMain_ui import *
from frmTrajets_ui import *
 
class frmMain(QtGui.QWidget):
	def __init__(self, parent=None):
		super(frmMain, self).__init__(parent)
		self.ui = Ui_frmMain()
		self.ui.setupUi(self)
		self.ui.cmdAddTrajet.clicked.connect(self.ouvrir)
Le tout génère ainsi cette erreur, je cite :

Code :
1
2
3
4
5
6
7
8
9
10
 
Démarrage*: python3 /home/florian/Documents/Programmation/demo/main.py
lolilol
Traceback (most recent call last):
  File "/home/florian/Documents/Programmation/demo/main.py", line 16, in <module>
    main()
  File "/home/florian/Documents/Programmation/demo/main.py", line 10, in main
    frmMain.show()
TypeError: QWidget.show(): first argument of unbound method must have type 'QWidget'
*** Terminé avec code de retour*: 1 ***
Merci par avance, cela fait depuis plusieurs jours que je tâche de résoudre le problème sans succès.
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 17h37   #2
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Salut,

Voici un exemple typique où import * participe à l'illisibilité du code, en tous cas à l'incompréhension du lecteur de passage.

Il eut été préférable de :
Code :
1
2
 
from globalui import frmMain, frmTrajets
Pour ton problème, comment frmMain, arrive-t-il dans ton code main() ? grâce à l'import de globalui ? Ce n'est pas suffisant pour en utiliser la méthode show(), à ce stade de ton code frmMain n'est qu'un nom.

Il faut l'instancier pour l'utiliser.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 17h41   #3
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Citation:
Envoyé par VinsS Voir le message
Salut,

Voici un exemple typique où import * participe à l'illisibilité du code, en tous cas à l'incompréhension du lecteur de passage.

Il eut été préférable de :
Code :
1
2
 
from globalui import frmMain, frmTrajets
Pour ton problème, comment frmMain, arrive-t-il dans ton code main() ? grâce à l'import de globalui ? Ce n'est pas suffisant pour en utiliser la méthode show(), à ce stade de ton code frmMain n'est qu'un nom.

Il faut l'instancier pour l'utiliser.
D'accord, donc l'instancier, signifie ainsi

quelquechose = frmMain
puis
quelquechose.show()

(Si j'ai bien compris ?)

EDIT : Quoi qu'il en soit, ça ou pas, j'ai essayé ça ne marche pas non plus, l'erreur se fait au niveau du show dans

Code :
1
2
	prout = frmMain()	
	prout.show()
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 17h52   #4
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
À la réflexion, en regardant ton code:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
# -*- coding: utf-8 -*
from frmMain_ui import *
from frmTrajets_ui import *
 
class frmMain(QtGui.QWidget):
	def __init__(self, parent=None):
		super(frmMain, self).__init__(parent)
		self.ui = Ui_frmMain()
		self.ui.setupUi(self)
		self.ui.cmdAddTrajet.clicked.connect(self.ouvrir)
Ui_frmMain semble tout droit sortir de Qt Designer et il y a de fortes chances qu'elle hérite de QMainWindow, tu m'arrêtes si je me trompe, donc deux questions se posent:

.1 Pourquoi la classe frmMain doit-elle hériter de QWidget ?
.2 Pourquoi frmMain.show() alors que ce devrait être frmMain.ui.show() ?


Ça c'est pour commencer.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h07   #5
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Déjà je voulais tout de même te remercier pour tes réponses ^^

Bon reprenons :

Oui ça sort bien de QtDesigner
1 : Parce qu'avec QtGui.QMainWindow c'est le même problème :

J'oubliais de préciser globalui.py
Code :
1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*
from frmMain_ui import *
 
class frmMain(QtGui.QMainWindow):
	def __init__(self, parent=None):
		super(frmMain, self).__init__(parent)
		self.ui = Ui_frmMain()
		self.ui.setupUi(self)
		self.ui.cmdAddTrajet.clicked.connect(self.ouvrir)
J'ai toujours, je cite :

Code :
1
2
3
4
5
6
7
8
9
Démarrage*: python3 /home/florian/Documents/Programmation/demo/main.py
lolilol
Traceback (most recent call last):
  File "/home/florian/Documents/Programmation/demo/main.py", line 17, in <module>
    main()
  File "/home/florian/Documents/Programmation/demo/main.py", line 11, in main
    frmMain.show()
TypeError: QWidget.show(): first argument of unbound method must have type 'QWidget'
*** Terminé avec code de retour*: 1 ***
2 : Heu non parce que frmMain.ui permet l'accès aux widgets disposés sur la fenêtre, comme tu peux le constater :

NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h15   #6
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
La présence du centralWidget semble confirmer ce que je dis, c'est à dire que Ui_frmMain() est une QMainWindow.

Donc, c'est bien sur l'ui que s'applique la méthode show().

Quelque chose comme ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 # -*- coding: utf-8 -*
from frmMain_ui import *
from frmTrajets_ui import *
 
class frmMain(object):
	def __init__(self):
		super(frmMain, self).__init__()
		self.ui = Ui_frmMain()
		self.ui.setupUi(self)
                self.ui.show()
		self.ui.cmdAddTrajet.clicked.connect(self.ouvrir)
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h19   #7
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Citation:
Envoyé par VinsS Voir le message
La présence du centralWidget semble confirmer ce que je dis, c'est à dire que Ui_frmMain() est une QMainWindow.

Donc, c'est bien sur l'ui que s'applique la méthode show().

Quelque chose comme ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 # -*- coding: utf-8 -*
from frmMain_ui import *
from frmTrajets_ui import *
 
class frmMain(object):
	def __init__(self):
		super(frmMain, self).__init__()
		self.ui = Ui_frmMain()
		self.ui.setupUi(self)
                self.ui.show()
		self.ui.cmdAddTrajet.clicked.connect(self.ouvrir)
Ouais mais là y a un problème : Je fais comment pour l'ouvrir ? x)
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h31   #8
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Je corrige mon post précédent.


Si Ui_frmMain() se présente comme ceci:
Code :
1
2
3
4
 
class Ui_frmMain(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName( ....
Alors utilises la comme ceci:
Code :
1
2
3
4
5
6
7
8
9
 
class frmMain(object):
	def __init__(self):
		super(frmMain, self).__init__()
                MainWindow = QtGui.QMainWindow()
		self.ui = Ui_frmMain()
		self.ui.setupUi(MainWindow)
                self.ui.show()
		self.ui.cmdAddTrajet.clicked.connect(self.ouvrir)
Mais nous sommes bien d'accord que pour accéder à tes widgets à partir de ton tout premier code tu devras toujours faire self.frmMain.ui.monWidget
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h40   #9
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Elle commence par ceci :

Code :
1
2
3
4
 
class Ui_frmMain(object):
    def setupUi(self, frmMain):
        frmMain.setObjectName(_fromUtf8("frmMain"))
Mais je suis vraiment désolé, mais je ne comprend pas vraiment comment l'afficher du coup
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h46   #10
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Là c'est que tu as modifié MainWindow par frmMain dans le script produit par pyuic4, chose qu'il ne fallait pas faire.

Tu génères une confusion avec frmMain et l'instance de QMainWindow qui sont deux choses bien différentes.

Remets MainWindow à la place de frmMain dans le script de l'interface et essayes mon dernier code.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 18h55   #11
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Ouais j'ai modifié mais je ne sais toujours pas comment faire pour l'afficher depuis main.py
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 19h25   #12
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Comme tu as plusieurs fichiers semble-t-il pour une même chose, ton problème vient peut-être de là.

Un exemple basique:

Ceci sort du Designer et de la moulinette pyuic4
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
from PyQt4 import QtCore, QtGui
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(609, 432)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.verticalLayout = QtGui.QVBoxLayout()
....
Mon code pour le lancer, 1ère version:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
import sys
 
from PyQt4 import QtCore, QtGui
 
from ui_myapp import Ui_MainWindow
 
class MyApp(object):
    def __init__(self):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(main)
        main.show()
 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = QtGui.QMainWindow()
    myapp = MyApp()
    sys.exit(app.exec_())
Deuxième version:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
import sys
 
from PyQt4 import QtCore, QtGui
 
from ui_myapp import Ui_MainWindow
 
class MyApp(object):
    def __init__(self):
        self.main = QtGui.QMainWindow()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self.main)
        self.main.show()
 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myapp = MyApp()
    sys.exit(app.exec_())

Toi, tu as un tout premier code (qui ne possède qu'une fonction d"ailleurs) et qui instancie quelque chose qui instancie enfin l'interface. Si ce script ne sert qu'à ça, supprimes le, il est à l'origine de ta confusion.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 19h39   #13
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Ouhlà je suis perdu >< Par « Fonctions inutile » tu parles bien de frmMain de « globalui.py » ?

J'en profite pour dire que l'application finale sera en multifenêtrage, donc que plusieurs fonctions vont fleurir dedans.

Mais là je suis complètement paumé... J'ai passé presque 2 jours à essayer de résoudre ce problème, donc je ne dois pas être spécialement en forme non plus (j'avoue que je suis presque sur le point d'avoir envie de défenestrer mon ordinateur). Puis je débute un peu dans pyQt je n'ai pas trouvé de tutoriaux assez « clairs » pour me permettre de faire des applications en multifenêtrage...

Et là je suis au même point qu'il y a deux jours : Qu'est ce que je fais ? Je suis désolé de te faire perdre du temps mais là je suis paumé
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 19h56   #14
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
Je pense que si tu simplifes ton application tu verras les choses plus clairement.

Combien de fichier as-tu, à quoi servent-ils ?

Dans l'état actuel, je dirais un fichier main pour l'appli elle-même et un fichier pour l'interface. J'ai vu une instance de frmTrajets, mais je n'ai pas saisi à quoi cela servait.

Quoiqu'il en soit, commence par construire ton appli avec ces deux fichiers dont je parle en te basant sur mon exemple, après ce sera plus simple.

Le multifenêtrage je ne sais pas ce que ça veut dire, par contre. Avec Qt on a une main window et le reste ce sont des boîtes de dialogue.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 20h01   #15
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Alors c'est vrai que présenté ainsi, le « multifenetrage » ce n'est pas très claire ^^

En fait, ce que je voulais dire, c'est tout simplement qu'il y aurait plusieurs boîtes de dialogue dans mon application. Tu fais bien de me dire pour les Dialogues d'ailleurs.

Concernant frmTrajets, c'est la 2ème fenêtre justement, j'avais pas envie de complexifier la lecture pour que l'on puisse m'aider plus rapidement, donc j'ai estimé futile l'ajout des classes concernant frmTrajets. Et l'import qui reste fut un oubli de ma part ^^

Quoi qu'il en soit, je te remercie beaucoup, je garde ton exemple sous le coude, et je ferais tout ça à tête plus reposée tranquillement o/
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2013, 02h10   #16
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Alors là ... Je ne sais pas ce que vous vous pouvez diagnostiquer mais :


Code :
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
import sys
from PyQt4 import QtGui
import frmMain_ui
import frmSecond_ui
 
####################################################
 
class frmMain_objet(QtGui.QMainWindow):
	def __init__(self):
		super(frmMain_objet, self).__init__()
		self.ui = frmMain_ui.Ui_frmMain()
		self.ui.setupUi(self)
		####################################
		self.ui.cmdCliquer.clicked.connect(self.pushButton_onClick)
	def pushButton_onClick(self):
		instance = frmSecond_objet()
		instance.show()
 
class frmSecond_objet(QtGui.QDialog):
	def __init__(self):
		super(frmSecond_objet, self).__init__()
		self.ui = frmSecond_ui.Ui_frmSecond()
		self.ui.setupUi(self)
 
###################################################
 
app = QtGui.QApplication(sys.argv)
 
frmMain = frmMain_objet()
frmMain.show()
 
sys.exit(app.exec_())
Ça, ça ne marche pas ! instance.show n'affiche pas la seconde fenêtre... Par CONTRE si j'ajoute ceci juste après :

Code :
print("prout").capitalize()
Celà générre une erreur sur la ligne print, cependant ... Attention : instance s'affiche ahaha .... C'est drôle... Comment j'ai trouvé ça ? Ça me soulait tellement que je me suis mis à faire n'importe quoi x)
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2013, 07h50   #17
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 939
Points : 1 406
Points : 1 406
C'est normal que ça ne marche pas.

Dans ce script, appellons le main, tu crées une classe qui hérite de QMainWindow sans raison et qui instancie ta fenêtre principale qui elle devrait hériter directement de QMainWindow.

Ce n'est pas du tout ainsi que je le montre dans mon exemple.

Montres nous les entêtes des deux classes importées, la fenêtre principale et la boîte de dialogue.

Ce que tu veux faire est beaucoup simple que ce que fais en réalité.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2013, 11h57   #18
NeuhNeuh
Invité de passage
 
Homme
Étudiant
Inscription : juillet 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2012
Messages : 12
Points : 2
Points : 2
Bon j'efface tout ça pour dire que finalement ça marche (j'ai trouvé comment résoudre le problème).

Merci beaucoup encore une fois VinS et je met résolu du coup ^^
NeuhNeuh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h41.


 
 
 
 
Partenaires

Hébergement Web