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

Tkinter Python Discussion :

Appel de classe


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Par défaut Appel de classe
    Salut a tous,

    j'ai un soucis surement mineur mais je ne trouve pas.
    Je fais des test avant de lancer un projet que j'ai en tete mais je buche sur un soucis pour appeler une classe:
    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
    from Tkinter import *
     
     
    class Graphique:
    	def __init__(self):
    		self = Tk()
    		self.title("Space invaders")
    		self.geometry("300x600")
    		#on defini les cannevas qui servira comme zone de jeu
    		espace = Canvas(self, width=200, height=550, bg='green').pack(side=LEFT)
    		#on place un bouton pour quitter l'application
    		btnQuit = Button(self, text="Quitter", command =Jeu.quitter(self)).pack(side=RIGHT)
    		self.mainloop()
     
     
     
    class Jeu ():
    	def __init__(self):
    		Graphique()
    	def quitter(self):
    		self.destroy()
     
     
     
     
    a = Jeu()
    Je voudrai appeler la méthode quitter de la classe Jeu deopuis la méthode Graphique pour mon bouton afin de quitter l'application.
    Le soucis c'est qu'a l'execution j'ai cette erreur:

    TypeError: unbound method quitter() must be called with Jeu instance as first argument (got Tk instance instead)

    Vous avez une idée?Il faut declarer la classe Jeu avant Graphique?

    Merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ta programmation pose plusieurs problèmes:

    - dans la classe Jeu, il faut instancier la classe Graphique ("gr=Graphique()"), et pas l'appeler directement.

    - dans la classe Graphique, pour la création du bouton, il ne faut pas appeler directement la classe Jeu mais son instance. Par ailleurs, il ne faut pas mettre les parenthèses à la fonction passée en "command=".

    Mais ce qui correspond au message d'erreur est autre chose qui nécessite que tu reprennes la structure de ton programme: tu instancies la classe Jeu, et dans son initialisation, tu instancies la classe Graphique qui contient elle-même un appel à Jeu: mais à ce moment là, la variable "a" n'a pas encore de valeur puisque la création de l'instance de Jeux n'est pas terminée!

    Si tu instancies la classe Graphique avant (genre "gr=Graphique()"), ce n'est pas mieux puisqu'elle contient un appel à Jeu qui n'est pas encore définie à ce moment là.

    Ma suggestion: respecte le modèle du manuel de Tkinter pour la création de ta fenêtre. Cela donnerait quelque chose comme cela:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
    class Graphique(Frame):
        def __init__(self, master=None):
            Frame.__init__(self, master)
            self.grid()
     
            self.espace = Canvas(self, width=200, height=550, bg='green')
            self.espace.grid(row=0,column=0,sticky="nsw")
     
            self.btnQuit = Button(self, text="Quitter", command = self.master.destroy)
            self.btnQuit.grid(row=0,column=1,sticky="e")
     
            # autres initialisations du jeu
            # .....
            # .....
     
    fen = Tk()
    fen.title("Space invaders")
    fen.geometry("300x600")
    gr = Graphique(fen)
    fen.mainloop()
    Une fois ta fenêtre crée, elle attend et traite tous les évènements correspondant au déroulement du jeu.

    Tyrtamos

  3. #3
    Membre éclairé
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Par défaut
    ah ok je vois alors d'ou viennnent mes problemes grace a toi.
    Petite question, es ce qu'on doit declarer les classes avant de les appeler?Je m'explique:
    en C, on peut appeler une fonction une fois qu'elle est déclaré sinon ca marche pas. LA solution c'est de faire les prototype en début de fichier. Es-ce qu'en python on à des sortes de prototype pour appeler les classes un peu qd on veut?
    Merci

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par yorukaze Voir le message
    Petite question, es ce qu'on doit declarer les classes avant de les appeler?
    Je ne connais pas de telles déclarations de prototypes avec Python.

    Tyrtamos

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    Il n'y a pas de notion de pre-déclaration en python. Si on déclare une classe A, qu'on l'utilise dans une fonction b() et qu'on redéclare A plus tard, le binding dans B se fera toujours sur la première définition de la classe (donc une classe vide).
    Cependant ca ne pose pas de problème en général, parce que l'intepreteur lit d'abord toutes les définitions de fonctions et de classe et ne lit le corps des fonctions qu'à leur execution. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1. def a(): 
    2.     b()
    3. def b():
    4.     print 'bonjour'
    lorsqu'on chargera ce module, l'interpréteur ne lira que les lignes 1 et 3. Puis, si l'on appelle a(), il lira 2 puis 4. La ligne 2 fonctionnera car b aura déjà été définie à ce moment là.
    Il peut y avoir des cas plus compliqués, mais il y a (presque?) toujours une solution sans avoir à utiliser les déclarations.

  6. #6
    Membre éclairé
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Par défaut
    Ok merci à vous deux je ne savais pas que l'interpreteur lisait de cette facon.
    Ca m'aide beaucoup en tout cas merci.

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

Discussions similaires

  1. [Package] Appel à une classe
    Par GLDavid dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 12h49
  2. Appeler une classe CSS avec Javascript
    Par p0Kep0K dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/02/2006, 14h50
  3. Appeler 2 classes en même temps?
    Par Death83 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/02/2006, 23h38
  4. Réponses: 14
    Dernier message: 15/12/2005, 18h46
  5. [Exception]Connaitre la pile d'appel de classes/méthodes
    Par salome dans le forum Général Java
    Réponses: 2
    Dernier message: 19/03/2005, 20h21

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