[Python] désactivation temporaire d'un bouton
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

[Python] désactivation temporaire d'un bouton



  1. #1
    Scryper

    [Python] désactivation temporaire d'un bouton


    ------

    Bonjour,

    Je travaille sur un projet, qui avance bien mais j'ai rencontré un petit problème. En gros c'est un jeu des bombardes, avec des canons qui tirent à tour de rôles, mais j'aimerais aussi faire en sorte qu'on ne puisse pas mitrailler l'adversaire non plus. C'est donc pourquoi j'ai pensé a une désactivation temporaire du bouton de tir (le temps du vol de l'obus). J'ai donc créé deux fonctions à cet effet (voir plus bas). Mais d'abord voici quelques infos pour bien comprendre le problème : je possède deux classes : canon (crée le canon, gère le tir, etc...) et bureau (un "outil" qui se rapporte à un canon en particulier et qui gère l'orientation du canon, le score, etc...). Puisque le bouton doit être désactivé pendant le vol de l'obus, je déclenche une fonction qui va désactiver le bouton (il sera réactivé lorsque l'obus aura touché une cible). Comme je ne sais pas accéder directement à Bureau() depuis Canon(), j'ai créé une fonction "intermédiaire" qui est libre de toute classe et qui va déclencher une méthode de maclasse Bureau(), voici les fonctions en questions :

    Code:
    def changer_etat_btir(self) :   # méthode de Bureau()
        if self.b_tir[state] == "NORMAL" :
            self.b_tir[state] = "DISABLED"
        else :
            self.b_tir[state] = "NORMAL"
    Code:
    def etat_btir() :   # fonction déclenchée au moment du tir
        Bureau.changer_etat_btir()
    Mais c'est à ce moment que survient le problème : si je laisse comme ça j'obtiens un TypeError (missing 1 required positional argument: 'self'), mais si je retire self de changer_etat_btir, j'ai un NameError (name 'self' is not defined). Donc je suis bloqué vu que je ne sais pas comment arriver à modifier l'état du bouton de tir.

    N'hésitez pas si vous ne comprenez pas totalement mais je pense que l'essentiel est là.
    Merci.

    -----

  2. #2
    bisou10

    Re : [Python] désactivation temporaire d'un bouton

    Je comprends que tu définis une fonction mais que tu ne passes pas le bon paramètre.

    Sans connaitre Python, c'est quoi self ?

  3. #3
    Ikhar84
    Animateur Informatique

    Re : [Python] désactivation temporaire d'un bouton

    San connaitre python (aussi), tu déclares une fonction qui prend un paramètre, self:
    Code:
    def changer_etat_btir(self)
    et quand tu l'appelles, tu ne lui donnes aucun paramètre, en désaccord avec sa définition donc...
    Code:
    Bureau.changer_etat_btir()
    D'où l'erreur:
    (missing 1 required positional argument: 'self')
    "Un argument positionnel requis est absent: self (à peu près...)"

    Self ici est l'equivalent de "this" dans d'autres langages (ou un genre d'autoréference) ?
    Dernière modification par Ikhar84 ; 12/10/2017 à 13h58.

  4. #4
    Scryper

    Re : [Python] désactivation temporaire d'un bouton

    Oui, en python le self équivaut à this (en java par exemple). Mais je ne mets pas le self dans ma fonction intermédiaire car ce n'est pas une méthode, c'est une fonction. La différence entre les deux c'est qu'une méthode est une fonction qui fait partie d'une classe. En python, toutes les fonctions qui vont agir sur des objets de la même classe mais définis dans d'autre méthode doivent avoir self en paramètre. Sinon on obtient une NameError (que j'ai expliqué dans mon message principal). C'est pour ça que je suis bloqué, je dois garder le self dans ma méthode mais ne pas la mettre dans ma fonction.
    Merci.

  5. A voir en vidéo sur Futura
  6. #5
    bisou10

    Re : [Python] désactivation temporaire d'un bouton

    Toujours sans connaitre Python, les arguments automatiques ne sont pas forcément supportés dans tous les languages. Que tu utilises self, ou pas, il faudrait un argument à ta fonction (même s'il ne sert à rien dans ta fonction). Ca résoudrait une erreur au moins.

  7. #6
    Ikhar84
    Animateur Informatique

    Re : [Python] désactivation temporaire d'un bouton

    Citation Envoyé par bisou10 Voir le message
    Toujours sans connaitre Python, les arguments automatiques ne sont pas forcément supportés dans tous les languages. Que tu utilises self, ou pas, il faudrait un argument à ta fonction (même s'il ne sert à rien dans ta fonction). Ca résoudrait une erreur au moins.
    Oui pour moi l'erreur explicite clairement une absence d'un argument attendu.

  8. #7
    Scryper

    Re : [Python] désactivation temporaire d'un bouton

    Je viens de réessayer en rajoutant bur come argument de changer_etat_btir, puisque normalement lorsque l'on fait objet.methode(argument) objet est passé en premier argument de la méthode (si j'ai bien compris ce que j'ai lu). Mais ça ne fonctionne toujours pas...
    J'ai aussi fait comme vous avez dit :
    Code:
    def changer_etat_btir(self, x) :
        #code
    
    def modifier_etat_btir() :
        Bureau.changer_etat_btir(42)
    Mais là, il met 42 dans self et alors j'obtiens la même erreur qu'avant mais pour l'argument x.

  9. #8
    Calvert

    Re : [Python] désactivation temporaire d'un bouton

    Comment est initié "Bureau" qui apparaît dans cette ta fonction "etat_btir" ? Il n'est pas initié dans cette fonction, vient-il d'ailleurs ? Sinon, comment sait-il qui est bureau ?

  10. #9
    Scryper

    Re : [Python] désactivation temporaire d'un bouton

    Citation Envoyé par Calvert Voir le message
    Il n'est pas initié dans cette fonction, vient-il d'ailleurs ? Sinon, comment sait-il qui est bureau ?
    Je ne comprends pas bien ta question.
    Sinon voici ma classe bureau si ça peut aider :
    Code:
    class Bureau :
        """Création d'une classe pour le placement du "bureau" du joueur
        Le bureau comprend : - un widget Scale pour l'orientation de la buse
                             - un bouton pour déclencher le tir"""
        def __init__(self, can, fra1, f, nom = "") :
            # Placement du nom du joueur
            nom_joueur = Label(fra1, text = nom, font = ('Arial', 13)).grid(row = 1, column = 1, pady = 2)
            # Placement du widget scale pour l'orientation de la buse
            orient = Scale(fra1, from_ = 0, to = 360, orient = VERTICAL, command = can.orientation)
            orient.grid(row = 2, column = 1, pady = 2)
            # Placement du bouton pour tirer
            self.b_tir = Button(fra1, text = "FEU !", width = 5, command = can.feu)
            self.b_tir.grid(row = 3, column = 1, pady = 2)
    
        def changer_etat_btir(self) :
            if self.b_tir[state] == "NORMAL" :
                self.b_tir[state] = "DISABLED"
            else :
                self.b_tir[state] = "NORMAL"

  11. #10
    Calvert

    Re : [Python] désactivation temporaire d'un bouton

    Tu ne peux pas appeler "etat_btir" comme tu le fais. Il te faux créer ("instancier") un objet de type ta classe bureau, par exemple:

    Code:
    MyBureau = Bureau() #créé un objet MyBureau, instance de la classe Bureau
    et ensuite tu pourras utiliser les méthodes que tu as définies pour Bureau:

    Code:
    MyBureau.changer_etat_btir()
    print MyBureau.b_tir
    Note aussi que "state" n'est défini nul part, il va râler.
    Dernière modification par Calvert ; 16/10/2017 à 20h28.

  12. #11
    Scryper

    Re : [Python] désactivation temporaire d'un bouton

    Effectivement il a râlé, mais j'ai vite réglé ça.

    J'ai remplacé Bureau par bur (le nom de la variable où j'instancie le Bureau), le problème c'est que si j'ai plusieurs joueurs ce sera toujours le bouton du tout premier canon qui sera désactivé même si ce sont d'autres joueurs qui tirent. Donc il faudrait que mon programme puisse trouver quel bureau se rapporte à quel joueur ?
    Dernière modification par Scryper ; 17/10/2017 à 17h32.

  13. #12
    Ikhar84
    Animateur Informatique

    Re : [Python] désactivation temporaire d'un bouton

    Il y a un bureau par joueur ? -> 1
    Ou un bureau globale ? -> 2

    1. Un "Plateau de jeu" plus globale, "contient" une liste des bureaux: c'est un container des objets Bureau instanciés, ET le programme principal.
    La classe Bureau instancie un objet Joueur, qui posséde un objet de la classe Canon et un objet Bouton, avec une methode "desactiver()"et un attribut actif booléen...

    2. Le bureau "global" contient une liste d'objets Joueurs (liste dynamique ?)
    La classe Joueur contiendrait un objet "Canon" et un objet "Bouton" pour ce joueur... (détails dans le 1.)

    Pas de risque de confondre les joueurs et chaque bouton est ainsi facilement accessible et donc désactivable via une de ses méthodes, c'est le principe même de la programmation objet...
    Comme dit plus haut je ne connais pas assez Python, mais ceci est la base en objet...

  14. #13
    Scryper

    Re : [Python] désactivation temporaire d'un bouton

    J'ai créé un dictionnaire contenant les canons et l'indice de la position de leurs bureaux respectifs dans la liste qui contient tous les bureaux. Mon dernier problème est de savoir comment savoir quel canon a tiré, dès que je pourrai faire ça, je pense que le reste se passera sans problèmes. Reste à savoir comment faire, j'ai cherché pendant une bonne heure je pense mais la je cale...

  15. #14
    Scryper

    Re : [Python] désactivation temporaire d'un bouton

    EDIT : j'ai trouvé la solution, merci à vous.

Discussions similaires

  1. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 18h56
  2. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 15h47
  3. Python / Raspeberry / Compter impulsions bouton
    Par ludo1919 dans le forum Programmation et langages, Algorithmique
    Réponses: 16
    Dernier message: 27/05/2014, 16h39
  4. Desactivation d'un slot 72 pin
    Par invite56d2c8e6 dans le forum Électronique
    Réponses: 16
    Dernier message: 27/07/2012, 13h15
  5. Désactivation de la wifi
    Par laurett52 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 5
    Dernier message: 29/03/2011, 22h17