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 :

action d'une autre classe lors du clic


Sujet :

PyQt Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut action d'une autre classe lors du clic
    Bonjour à tous

    Je débute sur PyQt donc ma question va vous sembler très basique
    Pour m'initier à PyQT, je simule un RPG très simple (pas très original mais instructif)

    J'ai donc une classe Frame pour ma fenêtre
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Frame(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.resize(600,500)
            self.btn_attaque = QtGui.QPushButton("Attaque",self)
            self.btn_attaque.move(100,400)
            self.btn_attaque.clicked.connect(self.attaque_clic)
         def attaque_clic(self):

    Une classe Personnage
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Personnage(object):
    	def __init__(self,**args):
    		self.vie = 100
     
    	def attaquer(self, perso):
    		perso.vie = perso.vie - 10

    et un main
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from PySide import QtGui, QtCore
     
    from perso2 import Personnage
    from frame2 import Frame
     
    hero = Personnage()
    monstre = Personnage()
    frame = Frame()
    frame.show()

    Je cherche à lancer la méthode attaquer (hero.attaquer(monstre)) lors de l'appui sur le bouton attaquer mais je n'arrive pas à trouver comment faire ?
    Mes recherches m'ont amener vers les signaux mais à chaque fois on ne "mixe" pas 2 classes

    Merci d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Si ton Personnage (donc l'instance hero) est dans l'espace global, cela devrait fonctionner mais il semble que tu uses de modules (fichiers) différents et que cela cafouille à ce niveau là.


    Sinon, il n'est pas interdit de passer référence d'une instance d'une classe à une autre instance. C'est même assez courant.

    Donc, avec ton scénario:
    main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    frame = Frame(hero)
    frame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Frame(QtGui.QWidget):
        def __init__(self, pers, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.pers = pers
    et dans ta méthode attaque_clic() tu devrais pouvoir utiliser self.pers.attaquer()[/i]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Bonjour
    ta solution semble fonctionner mais me perturbe un peu
    En effet, j'ai un fichier par classe d’où mon problème
    Par contre, conceptuellement parlant, ça signifie que mon objet frame est constituée d'une hero et d'un monstre (il a fallu que je passe les 2 du coup)
    Ça me parait peu logique

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Pour demo, ton code fonctionne comme ceci:
    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
     
    # -*- coding: utf-8 -*-
     
    import sys
     
    from PyQt4.QtGui import QApplication, QWidget, QPushButton
     
    class MainWin(QWidget):
        def __init__(self, parent=None):
            super(MainWin, self).__init__(parent)
            self.resize(200,100)
            self.btn_attaque = QPushButton("Attaque",self)
            self.btn_attaque.move(50,40)
            self.btn_attaque.clicked.connect(self.attaque_clic)
     
        def attaque_clic(self):
            hero.attaquer()
     
    class Personnage(object):
        def __init__(self):
            super(Personnage, self).__init__()
            self.vies = 100
     
        def attaquer(self):
            self.vies -= 10
            print '%s vies restantes' % self.vies
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        hero = Personnage()
        mw = MainWin()
        mw.show()
        sys.exit(app.exec_())
    Pour un petit script comme celui-ci ce n'est évidemment pas important, mais on préfèrera la deuxième méthode comme décrite dans mon post précédent.


    P.S. Il y a une méprise dans ton code Personnage(), ce doit-être:
    et non pas:
    même si ça marche aussi.

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Je comprend que cela ne te paraisse pas logique mais c'est dût à la simplicité du code.

    Pour avoir quelque chose de plus pro, crées une classe Main()
    À l'interieure de celle-ci, crées ta fenêtre, connectes les boutons de cette fenêtre vers des fonctions située dans la classe Main qui, elles, sauront vers où rediriger les actions.

    Ta classe Main ayant connaissance des diverses instances de fenêtre et personnages elle fera office de controlleur et, de plus, ce code restera facile à maintenir.

    Pour info, il est inutile de créer un fichier par classe en Python.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Merci pour toutes ces explications
    Je crois que je vais tenter la classe main comme tu le suggère.
    En effet, même si pour le moment il s'agit d'un petit script, j'aurai à manipuler / créer des projets plus ambitieux donc je souhaite faire les choses de manière professionnelle dès le départ (avec des mauvaises bases c'est toujours plus compliqué de faire bien )

    Merci pour le PS. En effet, tu as raison puisque je vais utiliser la même méthode quand monstre va riposter

    Pour le découpage des classes en fichier, tu l'aura compris je pense, mes vielles habitudes d'autres langages sont tenaces

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/10/2013, 12h19
  2. Réponses: 7
    Dernier message: 03/02/2012, 17h15
  3. Réponses: 9
    Dernier message: 18/08/2009, 14h20
  4. Détecter une action d'une classe dans une autre classe
    Par Pirokkk dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 12/05/2008, 12h14
  5. Acces a un control depuis une autre classe
    Par schnito dans le forum MFC
    Réponses: 5
    Dernier message: 25/01/2004, 22h14

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