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 :

[Débutant] Blocages sur module Tkinter


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut [Débutant] Blocages sur module Tkinter
    Bonjour à tous,

    Je lutte sur un exercice que je pensais pouvoir faire seul, mais non, d'où ma présence. Je m'explique :

    Je dois créer un aquarium, avec des poissons de différentes couleurs qui sont censés avancer. Avec :

    -un bouton "Quitter" qui détruit la fenêtre,
    -un bouton "Choix Couleur" qui est un menu déroulant qui permet de choisir parmi une des couleurs de l'aquarium, et de la sélectionner,
    -et un bouton "Pêcheur" qui supprime le poisson dont la couleur a été choisie dans le menu "Choix Couleur".

    Je dispose par ailleurs d'un module aquarium que je joins .

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
     
    from Tkinter import *
    from time import sleep
     
    class Aquarium:
        """gestion d'un aquarium:
        aquarium -- fenetre Tk
        eau -- canvas pour dessiner les poissons
        poissons -- liste de poissons"""
        def __init__(self, largeur=300, hauteur=200):
            """creation de l'aquarium avec de l'eau"""
            self.aquarium = Tk()
            Button(self.aquarium, text="Quitter",
                   command=self.aquarium.quit).pack(side=TOP)
            self.eau = Canvas(width=largeur,height=hauteur,background='lightblue')
            self.eau.pack()
            self.eau.create_line(0,hauteur*1/3,largeur,hauteur*1/3)
            self.poissons = []
     
        def demarrer(self):
            """demarre l'animation de l'aquarium"""
            self.aquarium.mainloop()
     
        def creer_poisson(self,x=10,y=30,couleur='yellow'):
            """creation d'un poisson dans l'aquarium"""
            self.poissons.append(Poisson(self.eau,x,y,couleur))
     
     
    class Poisson:
        """un poisson qui se promene dans un aquarium
        poisson -- le dessin du poisson
        aquarium -- canvas dans lequel se trouve le poisson
        couleur -- couleur du poisson
        x -- abscisse du poisson
        y -- ordonnee du poisson"""
        def __init__(self, aquarium, x, y, couleur):
            """creation d'un poisson"""
            self.aquarium = aquarium
            self.x = x
            self.y = int(self.aquarium.cget('height'))-y
            self.couleur = couleur
            self.poisson = aquarium.create_oval(self.x, self.y,
                                                self.x+15, self.y+10, fill=couleur)
     
        def avance(self, x=5, y=0):
            """deplacement relatif du poisson"""
            self.aquarium.move(self.poisson, x, y)
            self.aquarium.update()
     
     
    if __name__ == "__main__":
        A = Aquarium()
        A.creer_poisson()
        A.creer_poisson(x=30,y=50, couleur='red')
        for i in range(10):
            sleep(.3)
            for poisson in A.poissons:
                poisson.avance()
        #A.demarrer()
    Ci-joint mon code :

    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
    34
    35
     
     
    from Tkinter import *
    from aquarium import *
     
    #creation de l aquarium
    aquarium=Tk()
    Button(aquarium,text="Quitter",command=aquarium.destroy).pack(side=TOP)
    eau=Canvas(width=300,height=400,background='lightblue')
    eau.pack()
    eau.create_line(0,400*1/3,300,400*1/3)
    poissons=[]
     
    #creation de mes poissons
    jaune=Poisson(eau,55,100,'yellow')
    vert=Poisson(eau,75,135,'green')
     
    #avancée de mes poissons (pas sur)
    jaune.avance(65,150)
    vert.avance(85,155)
     
    #brouillon du menu choix_couleur
     
    # Creation de la barre de menu:
    menu1 = Menu(aquarium)
     
    # Creation du menu Choix Couleur:
    choix_col = Menu(menu1, tearoff=0)
    menu1.add_cascade(label="Choix Couleur",menu=choix_col)
    choix_col.add_command(label="Jaune") #command=jaune.select() ??
    choix_col.add_command(label="Vert")#command=vert.select() (selectionne cette couleur...)
     
    aquarium.config(menu=menu1)
    Button(aquarium,text="Pecheur").pack(side=TOP)
    aquarium.mainloop()
    Pour le menu "Choix Couleur", que mettre dans le champ "command" pour choisir une couleur de poisson ??!
    Pour le bouton pêcheur j'ai une vague idée(les poissons de couleurs choisies par Choix_col sont effacés) mais je vois pas comment faire Choix couleur..


    Merci d'avance de vos réponses et du temps qu'il a fallu pour me lire .

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Si le module aquarium est donnée, je pense qu'il faut s'en servir. Tu peux utiliser l'héritage.
    Pour ton menu, il vaut mieux utiliser des radiobuttons. Tu peux ainsi récupérer la valeur du menu sélectionné avec une StringVar.

    Je verrai bien aussi un bouton pour ajouter des poissons.
    Voilà, je te donne le début du code pour bien démarrer:

    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
     
    from Tkinter import *
    from aquarium import *
     
    class MonAqua(Aquarium):
    	def __init__(self):
    		Aquarium.__init__(self)
    		# Creation de la barre de menu:
    		menu1 = Menu(self.aquarium)
    		choix_col = Menu(menu1, tearoff=0)
    		menu1.add_cascade(label="Choix Couleur",menu=choix_col)
    		self.varColor  = StringVar()
    		choix_col.add_radiobutton(label="Jaune", variable=self.varColor, value="yellow")
    		choix_col.add_radiobutton(label="Vert", variable=self.varColor, value="green")
    		self.aquarium.config(menu=menu1)
    		Button(self.aquarium, text="Pecheur", command=self.onPecheur).pack(side=TOP)
     
     
    	def onPecheur(self):
    		print self.varColor.get()
     
     
    aqua = MonAqua()
    aqua.demarrer()
    N'hésite pas à demander si tu as du mal à finir.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Merci beaucoup de ta réponse, j'ai à présent un aquarium avec mes 3 petits poissons qui avancent , plus mon bouton Quitter , plus mon menu radio Choix Couleur qui selectionne la couleur , la rentre dans la StringVar() , celle ci étant rappelée par la fonction OnPecheur()...

    Je bute sur la fonction OnPecheur : ce que j'aimerais faire (qui est probablement faux mais dans l'idée)... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        	def onPecheur(self):
    		print self.varColor.get()
                    if( self.varColor.get() == "yellow"): 
                        del (j) # ou remove(j) ? # mon poisson jaune s appel j
    Seulement il me retourne l'erreur : j n est pas encore défini car je l'instancie dans main..Oo

    Encore merci pour vos(tes) réponses.

    PS : Pour le bouton Ajouter Poisson, je vais attendre d'etre un peu plus à l'aise avant d'alourdir l'énoncé :p

    Edit : le vrai problème est : ma fonction onPecheur est située dans la classe MonAqua et l'assignation de mon poisson jaune a "j" se fait dans la fonction main...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Edit : le vrai problème est : ma fonction onPecheur est située dans la classe MonAqua et l'assignation de mon poisson jaune a "j" se fait dans la fonction main...
    Pouquoi utiliser une fonction main, tu peux tout mettre dans MonAqua.
    Tu as la liste des poissons dans self.poissons. Le plus simple est d'itérer la liste des poissons (dans onPecheur) et de filtrer par couleur (celle sélectionnée dans le menu).
    Pour supprimer un item du canvas il va faut utiliser monCanvas.delete(tagOrId). Dans ton cas, monCanvas est self.eau et tagOrId est l'attribut poisson de la classe poisson.

    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
    34
    35
    36
     
    from Tkinter import *
    from aquarium import *
    from time import sleep
     
     
    class MonAqua(Aquarium):
    	def __init__(self):
    		Aquarium.__init__(self)
    		# Creation de la barre de menu:
    		menu1 = Menu(self.aquarium)
    		choix_col = Menu(menu1, tearoff=0)
    		menu1.add_cascade(label="Choix Couleur",menu=choix_col)
    		self.varColor  = StringVar()
    		choix_col.add_radiobutton(label="Jaune", variable=self.varColor, value="yellow")
    		choix_col.add_radiobutton(label="Vert", variable=self.varColor, value="green")
    		self.aquarium.config(menu=menu1)
    		Button(self.aquarium, text="Pecheur", command=self.onPecheur).pack(side=TOP)
    		self.creer_poisson(10,10,"yellow")
    		self.creer_poisson(20,20,"green")
    		for i in range(40):
    			sleep(.3)
    			for poisson in self.poissons:
    				poisson.avance()
     
    	def onPecheur(self):
    		color = self.varColor.get()
    		if color:
    			for poisson in self.poissons:
    				if poisson.couleur == color:
    					self.eau.delete(poisson.poisson)
     
     
     
    aqua = MonAqua()
    aqua.demarrer()

  5. #5
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Mon idée de la fonction main c'est si on veut éxecuter mon fichier py dans le terminal bash et non dans le mode python interactif...

    Mais en effet, tout dans la même class rend mon problème enfantin...

    Encore merci de tes réponses et de ton temps... Tu gères

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Rien ne t'empêche de créer les poissons (par exemple), en dehors de la 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    from Tkinter import *
    from aquarium import *
    from time import sleep
     
     
    class MonAqua(Aquarium):
    	def __init__(self):
    		Aquarium.__init__(self)
    		# Creation de la barre de menu:
    		menu1 = Menu(self.aquarium)
    		choix_col = Menu(menu1, tearoff=0)
    		menu1.add_cascade(label="Choix Couleur",menu=choix_col)
    		self.varColor  = StringVar()
    		choix_col.add_radiobutton(label="Jaune", variable=self.varColor, value="yellow")
    		choix_col.add_radiobutton(label="Vert", variable=self.varColor, value="green")
    		self.aquarium.config(menu=menu1)
    		Button(self.aquarium, text="Pecheur", command=self.onPecheur).pack(side=TOP)
     
     
    	def animPoisson(self):
    		for i in range(40):
    			sleep(.3)
    			for poisson in self.poissons:
    				poisson.avance()
     
    	def onPecheur(self):
    		color = self.varColor.get()
    		if color:
    			for poisson in self.poissons:
    				if poisson.couleur == color:
    					self.eau.delete(poisson.poisson)
     
     
     
    aqua = MonAqua()
    aqua.creer_poisson(10,10,"yellow")
    aqua.creer_poisson(20,20,"green")
    aqua.animPoisson()
    aqua.demarrer()

  7. #7
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Tant que j'y suis, si je veux que mes poissons fassent des aller-retour , comment j'isole la largeur de la fenetre(fin de l aquarium) ? (elle vaut 200, mais si je met 60 ca dépasse déja...)

    Ou encore comment indiquer a la fonction avance() de prendre le chemin inverse... j'imagine une boucle for inversée... avec un if (poisson.position > aqua.largeur) fct avance() inversé...

    J arrive pas encore a traduire mes idées en python

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Ton idée est bonne. Il faut regarder si le poisson dépasse la largeur du canvas ou est inférieur à 0.
    J'ai rajouté un attribut sens dans la classe Poisson, qui vaut 1 si le poisson se dirige vers la droite et -1 si il se dirige vers la gauche.
    J'ai également ajouté un attribut largeur dans Aquarium.
    Tu peux récupérer les coordonnées du poisson avec canvas.coords(tagOrId) qui te retourne un tuple t'indiquant le coin supérieur gauche et inféririeur droit de ton poisson.
    J'ai aussi rajouté un attribut vitesse à MonAqua qui indique de combien de pixel se déplace les poissons. Tu peux le mettre dans Poisson si tu veux que chaque poisson se déplace à une vitesse différente.

    Et le tour est joué:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from time import sleep
     
    class Aquarium:
        """gestion d'un aquarium:
        aquarium -- fenetre Tk
        eau -- canvas pour dessiner les poissons
        poissons -- liste de poissons"""
        def __init__(self, largeur=300, hauteur=200):
            """creation de l'aquarium avec de l'eau"""
            self.aquarium = Tk()
            self.largeur = largeur
            Button(self.aquarium, text="Quitter",
                   command=self.aquarium.quit).pack(side=TOP)
            self.eau = Canvas(width=largeur,height=hauteur,background='lightblue')
            self.eau.pack()
            self.eau.create_line(0,hauteur*1/3,largeur,hauteur*1/3)
            self.poissons = []
     
        def demarrer(self):
            """demarre l'animation de l'aquarium"""
            self.aquarium.mainloop()
     
        def creer_poisson(self,x=10,y=30,couleur='yellow'):
            """creation d'un poisson dans l'aquarium"""
            self.poissons.append(Poisson(self.eau,x,y,couleur))
     
     
    class Poisson:
        """un poisson qui se promene dans un aquarium
        poisson -- le dessin du poisson
        aquarium -- canvas dans lequel se trouve le poisson
        couleur -- couleur du poisson
        x -- abscisse du poisson
        y -- ordonnee du poisson"""
        def __init__(self, aquarium, x, y, couleur):
            """creation d'un poisson"""
            self.aquarium = aquarium
            self.x = x
            self.y = int(self.aquarium.cget('height'))-y
            self.couleur = couleur
            self.sens = 1
            self.poisson = aquarium.create_oval(self.x, self.y,
                                                self.x+15, self.y+10, fill=couleur)
     
        def avance(self, x=5, y=0):
            """deplacement relatif du poisson"""
            self.aquarium.move(self.poisson, x, y)
            self.aquarium.update()
     
     
    if __name__ == "__main__":
        A = Aquarium()
        A.creer_poisson()
        A.creer_poisson(x=30,y=50, couleur='red')
        for i in range(10):
            sleep(.3)
            for poisson in A.poissons:
                poisson.avance()
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    from Tkinter import *
    from aquarium import *
    from time import sleep
     
     
    class MonAqua(Aquarium):
    	def __init__(self, vitesse=5):
    		Aquarium.__init__(self)
    		# Creation de la barre de menu:
    		self.vitesse = vitesse
    		menu1 = Menu(self.aquarium)
    		choix_col = Menu(menu1, tearoff=0)
    		menu1.add_cascade(label="Choix Couleur",menu=choix_col)
    		self.varColor  = StringVar()
    		choix_col.add_radiobutton(label="Jaune", variable=self.varColor, value="yellow")
    		choix_col.add_radiobutton(label="Vert", variable=self.varColor, value="green")
    		self.aquarium.config(menu=menu1)
    		Button(self.aquarium, text="Pecheur", command=self.onPecheur).pack(side=TOP)
    		self.boolAnim = True
     
     
    	def animPoisson(self):
    		while self.boolAnim:
    			sleep(.3)
    			for poisson in self.poissons:
    				coords = self.eau.coords(poisson.poisson)
    				if poisson.sens == 1 and coords[2]+self.vitesse > self.largeur:
    					poisson.sens = -1
    				elif poisson.sens == -1 and coords[0]-self.vitesse < 0:
    					poisson.sens = 1
     
    				poisson.avance(self.vitesse*poisson.sens)
     
    	def onPecheur(self):
    		color = self.varColor.get()
    		if color:
    			for poisson in self.poissons:
    				if poisson.couleur == color:
    					self.eau.delete(poisson.poisson)
     
     
     
    aqua = MonAqua(10)
    aqua.creer_poisson(10,10,"yellow")
    aqua.creer_poisson(20,20,"green")
    aqua.animPoisson()
    aqua.demarrer()
    Il y a surement moyen moyen d'optimiser, mais je trouve cette façon de faire assez clair.

  9. #9
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Points : 81
    Points
    81
    Par défaut
    Merci beaucoup, tu m'as aidé à bien comprendre le fond de l'exo...

Discussions similaires

  1. [Tkinter] probleme sur module oscillo (cours swinnen)
    Par xavier-Pierre dans le forum Tkinter
    Réponses: 4
    Dernier message: 07/03/2006, 23h12
  2. [Débutant] questions sur Visibroker
    Par Man Dak dans le forum CORBA
    Réponses: 1
    Dernier message: 29/06/2004, 23h02
  3. [débutant] conseils sur contraintes et alter table
    Par maysa dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 26/05/2004, 09h03
  4. [débutant] question sur les #
    Par Ultros dans le forum C
    Réponses: 3
    Dernier message: 29/04/2004, 12h30
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 09h46

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