Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/05/2019, à 10:19

Nat62

|python tkinter novice]- aide pour programmer une machine a sous

Ma fille doit programmer une machine à sous. Elle est en seconde ! J'essaie de l'aider mais je bloque pour le défilement de cinq images qu'on a téléchargées et stockées sur notre ordi (en gif).
elle doit réaliser trois colonnes; y faire défiler au moins cinq images avec des vitesses différentes et arrêter quand les trois images de chaque colonne sont les mêmes.
Avec ma fille ; on a réalisé un grand rectangle dans lequel on a inséré trois colonnes de même taille l'une à coté de l'autre.
J'arrive à faire défiler une image dans une colonne mais pas les autres images ! Quand je fais canvas.create; les cinq images apparaissent en haut de la colonne. Je n'arrive pas à les faire apparaitre une par une.
Je ne m'y connais pas en python ; j'ai travaillé sur les polycopiés de ma fille mais c'est la galère ! c'est vraiment dur !
Si quelqu'un pouvait m'aider. Elle doit rendre son travail ce jeudi 16 mai.
SVP aidez nous ! merci


[RESOLU] merci à tous

Dernière modification par Nat62 (Le 19/05/2019, à 11:52)

Hors ligne

#2 Le 11/05/2019, à 10:30

Nuliel

Re : |python tkinter novice]- aide pour programmer une machine a sous

Bonjour,

Tu peux donner le code actuel qu'on voit où vous en êtes?

Hors ligne

#3 Le 11/05/2019, à 10:34

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

from tkinter import*

fen=Tk()  # création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas=Canvas(fen, width='700',height='700',background='black')
canvas.pack()

# création de deux étoiles concentriques (l'un jaune et l'autre marron)
etoile1=canvas.create_polygon(350,15,317,75,250,75,301,123,280,190,350,150,
420,190,400,123,450,75,383,75,fill="yellow",outline='yellow')
etoile2=canvas.create_polygon(350,27,322,80,260,80,308,123,288,180,350,142,
412,180,393,123,440,80,378,80,fill="brown",outline='yellow')

# création d'un rectangle de dimensions 400 sur 650; colorié en marron
# et le contour en noir.
colonne1=canvas.create_rectangle(25,250,675,650,fill="brown",outline="black")

# création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne1=canvas.create_oval(65,255,85,275,fill="yellow",outline='yellow')
ligne2=canvas.create_oval(110,260,120,270,fill="yellow",outline='yellow')
ligne3=canvas.create_oval(145,255,165,275,fill="yellow",outline='yellow')
ligne4=canvas.create_oval(190,260,200,270,fill="yellow",outline='yellow')
ligne5=canvas.create_oval(225,255,245,275,fill="yellow",outline='yellow')
ligne6=canvas.create_oval(270,260,280,270,fill="yellow",outline='yellow')
ligne7=canvas.create_oval(305,255,325,275,fill="yellow",outline='yellow')
ligne8=canvas.create_oval(350,260,360,270,fill="yellow",outline='yellow')
ligne9=canvas.create_oval(385,255,405,275,fill="yellow",outline='yellow')
ligne10=canvas.create_oval(430,260,440,270,fill="yellow",outline='yellow')
ligne11=canvas.create_oval(465,255,485,275,fill="yellow",outline='yellow')
ligne12=canvas.create_oval(510,260,520,270,fill="yellow",outline='yellow')
ligne13=canvas.create_oval(545,255,565,275,fill="yellow",outline='yellow')
ligne14=canvas.create_oval(590,260,600,270,fill="yellow",outline='yellow')
ligne15=canvas.create_oval(625,255,645,275,fill="yellow",outline='yellow')

# création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
colonne2=canvas.create_rectangle(50,300,250,600,fill="white",outline="black")
colonne3=canvas.create_rectangle(250,300,450,600,fill="white",outline="black")
colonne4=canvas.create_rectangle(450,300,650,600,fill="white",outline="black")

# création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne16=canvas.create_oval(65,620,85,640,fill="yellow",outline='yellow')
ligne17=canvas.create_oval(110,625,120,635,fill="yellow",outline='yellow')
ligne18=canvas.create_oval(145,620,165,640,fill="yellow",outline='yellow')
ligne19=canvas.create_oval(190,625,200,635,fill="yellow",outline='yellow')
ligne20=canvas.create_oval(225,620,245,640,fill="yellow",outline='yellow')
ligne21=canvas.create_oval(270,625,280,635,fill="yellow",outline='yellow')
ligne22=canvas.create_oval(305,620,325,640,fill="yellow",outline='yellow')
ligne23=canvas.create_oval(350,625,360,635,fill="yellow",outline='yellow')
ligne24=canvas.create_oval(385,620,405,640,fill="yellow",outline='yellow')
ligne25=canvas.create_oval(430,625,440,635,fill="yellow",outline='yellow')
ligne26=canvas.create_oval(465,620,485,640,fill="yellow",outline='yellow')
ligne27=canvas.create_oval(510,625,520,635,fill="yellow",outline='yellow')
ligne28=canvas.create_oval(545,620,565,640,fill="yellow",outline='yellow')
ligne29=canvas.create_oval(590,625,600,635,fill="yellow",outline='yellow')
ligne30=canvas.create_oval(625,620,645,640,fill="yellow",outline='yellow')

# création d'un bouton Go
boutonGo = Button(fen,text='Go',width=10,height=2) # mettre command= et définir une fonction
boutonGo.place(x=310,y=90)

image1=PhotoImage(file="cerises.gif")
image11=canvas.create_image(60,350,anchor=NW,image=image1)
image12=canvas.create_image(260,350,anchor=NW,image=image1)
image13=canvas.create_image(460,350,anchor=NW,image=image1)

image2=PhotoImage(file="feracheval.gif")
image21=canvas.create_image(60,350,anchor=NW,image=image2)
image22=canvas.create_image(260,350,anchor=NW,image=image2)
image23=canvas.create_image(460,350,anchor=NW,image=image2)


image3=PhotoImage(file="seven.gif")
image31=canvas.create_image(60,350,anchor=NW,image=image3)
image32=canvas.create_image(260,350,anchor=NW,image=image3)
image33=canvas.create_image(460,350,anchor=NW,image=image3)


image4=PhotoImage(file="pasteque.gif")
image41=canvas.create_image(60,350,anchor=NW,image=image4)
image42=canvas.create_image(260,350,anchor=NW,image=image4)
image43=canvas.create_image(460,350,anchor=NW,image=image4)

image5=PhotoImage(file="cloche.gif")
image51=canvas.create_image(80,350,anchor=NW,image=image5)
image52=canvas.create_image(280,350,anchor=NW,image=image5)
image53=canvas.create_image(480,350,anchor=NW,image=image5)


fen.mainloop()

Dernière modification par Nat62 (Le 11/05/2019, à 10:41)

Hors ligne

#4 Le 11/05/2019, à 10:35

xubu1957

Re : |python tkinter novice]- aide pour programmer une machine a sous

Bonjour,

Pour ajouter toi-même les balises code à ton précédent message #3 :                Merci                    wink

  • Cliquer sur  le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

1530289742.png

comme indiqué dans le : Retour utilisable de commande

Dernière modification par xubu1957 (Le 11/05/2019, à 10:45)


Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Résolu] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

Hors ligne

#5 Le 11/05/2019, à 10:52

Nuliel

Re : |python tkinter novice]- aide pour programmer une machine a sous

Est ce que les images sont dans un seul fichier gif ou il y a autant d'images que de fichiers?

Hors ligne

#6 Le 11/05/2019, à 10:56

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

un fichier par image

Hors ligne

#7 Le 11/05/2019, à 11:05

Nuliel

Re : |python tkinter novice]- aide pour programmer une machine a sous

- je pense que tu pouvais créer seulement un cercle de diamètre 20 et un de diamètre 10, et ensuite demander de les afficher à différents endroits sans les recréer à chaque fois
- il manque la fonction principale qui va afficher les cerises, pastèques, ... cette fonction est d'ailleurs indiquée ici:

boutonGo = Button(fen,text='Go',width=10,height=2) # mettre command= et définir une fonction

dans un premier temps, ce serait pas mal d'essayer de faire défiler que la première colonne à une vitesse de 1 image par seconde. Ça va faire intervenir les boucles (for et while). En fait faire petit à petit ce projet

Hors ligne

#8 Le 11/05/2019, à 11:15

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

oui en effet je n'ai pas mis la fonction.
J'essaie de la trouver mais à part

Hors ligne

#9 Le 11/05/2019, à 11:19

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

from tkinter import *

fen = Tk()
canvas=Canvas(fen, width='600',height='600',background='black')
canvas.pack()



def DeplacementImagColonne1(canvas,imag,y):
    y=y+5
    canvas.move(imag,0,5)
    canvas.after(20,DeplacementImagColonne1,canvas,imag,y)
    if y==200:
        y=0
        imag22=canvas.create_image(10,0,anchor=NW,image=image22)
        y=y+5
        canvas.move(imag22,0,5)
        canvas.after(20,DeplacementImagColonne1,canvas,imag22,y)
        if y==400:
         y=0
         imag33=canvas.create_image(10,0,anchor=NW,image=image33)
         canvas.move(imag33,0,5)
         canvas.after(20,DeplacementImagColonne1,canvas,imag33,y)

y=float()
image33=PhotoImage(file="cloche.gif")
image22=PhotoImage(file="seven.gif")
image11=PhotoImage(file="cerises.gif")

imag11=canvas.create_image(10,0,anchor=NW,image=image11)
DeplacementImagColonne1(canvas,imag11,0)


fen.mainloop()

Hors ligne

#10 Le 11/05/2019, à 11:22

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

voilà ce que j'ai fait à part.
Mais il y a un problème :
la cerise défile ; le sept apparait quand y vaut 200 mais après le sept apparait de nouveau sans s'arreter !!!

Hors ligne

#11 Le 11/05/2019, à 11:46

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

ou alors j ai fait ça !
je tâtonne !!

from tkinter import *

fen = Tk()
canvas=Canvas(fen, width='600',height='600',background='black')
canvas.pack()



def DeplacementImagColonne1(canvas,imag,y):
    y=y+5
    canvas.move(imag,0,5)
    if y<600 :
        canvas.after(2,DeplacementImagColonne1,canvas,imag,y)
    else :
        y=600
        canvas.delete(imag)
        y=0
        imag22=canvas.create_image(10,0,anchor=NW,image=image22)
        y=y+5
        canvas.move(imag22,0,5)
        canvas.after(2,DeplacementImagColonne1,canvas,imag22,y)

#def DeplacementImage2Colonne2(y):
 #   y=y+5
  #  canvas.move(imag,0,5)
   # if y<600 :
    #    canvas.after(20,DeplacementImage2Colonne2,y)

y=float()
image22=PhotoImage(file="seven.gif")
image11=PhotoImage(file="cerises.gif")

imag11=canvas.create_image(10,0,anchor=NW,image=image11)
DeplacementImagColonne1(canvas,imag11,0)



fen.mainloop()

là j'ai la première image et la deuxième qui défilent !
mais je fais comment pour 5 images !

Hors ligne

#12 Le 11/05/2019, à 16:37

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

j'ai réussi a faire ceci pour le bouton Go :
Quand on clique sur le bouton Go; j'arrive à faire défiler dans les trois colonnes une cerise et plein de sept !
je n'arrive pas a faire défiler cinq images à la suite !!!

from tkinter import*

def Demarrer() :
    imag11=canvas.create_image(150,400,anchor=CENTER,image=image11)
    DeplacementImagColonne2(imag11,400)
    imag11=canvas.create_image(350,400,anchor=CENTER,image=image11)
    DeplacementImagColonne3(imag11,400)
    imag11=canvas.create_image(550,400,anchor=CENTER,image=image11)
    DeplacementImagColonne4(imag11,400)

fen=Tk()  # création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas=Canvas(fen, width='700',height='700',background='black')
canvas.pack()

# création de deux étoiles concentriques (l'un jaune et l'autre marron)
etoile1=canvas.create_polygon(350,15,317,75,250,75,301,123,280,190,350,150,
420,190,400,123,450,75,383,75,fill="yellow",outline='yellow')
etoile2=canvas.create_polygon(350,27,322,80,260,80,308,123,288,180,350,142,
412,180,393,123,440,80,378,80,fill="brown",outline='yellow')

# création d'un rectangle de dimensions 400 sur 650; colorié en marron
# et le contour en noir.
colonne1=canvas.create_rectangle(25,250,675,650,fill="brown",outline="black")

# création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne1=canvas.create_oval(65,255,85,275,fill="yellow",outline='yellow')
ligne2=canvas.create_oval(110,260,120,270,fill="yellow",outline='yellow')
ligne3=canvas.create_oval(145,255,165,275,fill="yellow",outline='yellow')
ligne4=canvas.create_oval(190,260,200,270,fill="yellow",outline='yellow')
ligne5=canvas.create_oval(225,255,245,275,fill="yellow",outline='yellow')
ligne6=canvas.create_oval(270,260,280,270,fill="yellow",outline='yellow')
ligne7=canvas.create_oval(305,255,325,275,fill="yellow",outline='yellow')
ligne8=canvas.create_oval(350,260,360,270,fill="yellow",outline='yellow')
ligne9=canvas.create_oval(385,255,405,275,fill="yellow",outline='yellow')
ligne10=canvas.create_oval(430,260,440,270,fill="yellow",outline='yellow')
ligne11=canvas.create_oval(465,255,485,275,fill="yellow",outline='yellow')
ligne12=canvas.create_oval(510,260,520,270,fill="yellow",outline='yellow')
ligne13=canvas.create_oval(545,255,565,275,fill="yellow",outline='yellow')
ligne14=canvas.create_oval(590,260,600,270,fill="yellow",outline='yellow')
ligne15=canvas.create_oval(625,255,645,275,fill="yellow",outline='yellow')

# création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
colonne2=canvas.create_rectangle(50,300,250,600,fill="white",outline="black")
colonne3=canvas.create_rectangle(250,300,450,600,fill="white",outline="black")
colonne4=canvas.create_rectangle(450,300,650,600,fill="white",outline="black")

# création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne16=canvas.create_oval(65,620,85,640,fill="yellow",outline='yellow')
ligne17=canvas.create_oval(110,625,120,635,fill="yellow",outline='yellow')
ligne18=canvas.create_oval(145,620,165,640,fill="yellow",outline='yellow')
ligne19=canvas.create_oval(190,625,200,635,fill="yellow",outline='yellow')
ligne20=canvas.create_oval(225,620,245,640,fill="yellow",outline='yellow')
ligne21=canvas.create_oval(270,625,280,635,fill="yellow",outline='yellow')
ligne22=canvas.create_oval(305,620,325,640,fill="yellow",outline='yellow')
ligne23=canvas.create_oval(350,625,360,635,fill="yellow",outline='yellow')
ligne24=canvas.create_oval(385,620,405,640,fill="yellow",outline='yellow')
ligne25=canvas.create_oval(430,625,440,635,fill="yellow",outline='yellow')
ligne26=canvas.create_oval(465,620,485,640,fill="yellow",outline='yellow')
ligne27=canvas.create_oval(510,625,520,635,fill="yellow",outline='yellow')
ligne28=canvas.create_oval(545,620,565,640,fill="yellow",outline='yellow')
ligne29=canvas.create_oval(590,625,600,635,fill="yellow",outline='yellow')
ligne30=canvas.create_oval(625,620,645,640,fill="yellow",outline='yellow')

# création d'un bouton Go
boutonGo = Button(fen,text='Go',width=10,height=2,command=Demarrer) # mettre command= et définir une fonction
boutonGo.place(x=310,y=90)


def DeplacementImagColonne2(imag,y):
    y=y+2
    canvas.move(imag,0,2)
    if y<500 :
        canvas.after(10,DeplacementImagColonne2,imag,y)
    elif y==500 :
        canvas.delete(imag)
        y=400
        imag22=canvas.create_image(150,400,anchor=CENTER,image=image22)
        y=y+2
        canvas.move(imag22,0,2)
        canvas.after(10,DeplacementImagColonne2,imag22,y)

def DeplacementImagColonne3(imag,y):
    y=y+2
    canvas.move(imag,0,2)
    if y<500 :
        canvas.after(7,DeplacementImagColonne3,imag,y)
    elif y==500 :
        canvas.delete(imag)
        y=400
        imag22=canvas.create_image(350,400,anchor=CENTER,image=image22)
        y=y+2
        canvas.move(imag22,0,2)
        canvas.after(7,DeplacementImagColonne3,imag22,y)

def DeplacementImagColonne4(imag,y):
    y=y+2
    canvas.move(imag,0,2)
    if y<500 :
        canvas.after(5,DeplacementImagColonne4,imag,y)
    elif y==500 :
        canvas.delete(imag)
        y=400
        imag22=canvas.create_image(550,400,anchor=CENTER,image=image22)
        y=y+2
        canvas.move(imag22,0,2)
        canvas.after(5,DeplacementImagColonne4,imag22,y)



y=float()
image11=PhotoImage(file="cerises.gif")
image22=PhotoImage(file="seven.gif")
image33=PhotoImage(file="cloche.gif")
image44=PhotoImage(file="pasteque.gif")
image55=PhotoImage(file="feracheval.gif")




fen.mainloop()

Hors ligne

#13 Le 11/05/2019, à 16:58

pingouinux

Re : |python tkinter novice]- aide pour programmer une machine a sous

Bonjour,
Si ça peut te donner des idées (je suis parti de ce que tu montres en #11) :

from tkinter import *
from time import sleep

fen = Tk()
canvas=Canvas(fen, width='600',height='600',background='black')
canvas.pack()

def DeplacementImagColonnes(canvas,liste_images):
    img1=img2=img3=y1=y2=y3=0
    dy1,dy2,dy3=3,5,7
    x1,x2,x3=10,210,410
    imag1=canvas.create_image(x1,0,anchor=NW,image=liste_images[img1])
    imag2=canvas.create_image(x2,0,anchor=NW,image=liste_images[img2])
    imag3=canvas.create_image(x3,0,anchor=NW,image=liste_images[img3])
    while True:
        sleep(.05)

        if y1<600: canvas.move(imag1,0,dy1); y1+=dy1
        else:
            img1=(img1+1)%nb_im; canvas.delete(imag1); y1=0
            imag1=canvas.create_image(x1,0,anchor=NW,image=liste_images[img1])

        if y2<600: canvas.move(imag2,0,dy2); y2+=dy2
        else:
            img2=(img2+1)%nb_im; canvas.delete(imag2); y2=0
            imag2=canvas.create_image(x2,0,anchor=NW,image=liste_images[img2])

        if y3<600: canvas.move(imag3,0,dy3); y3+=dy3
        else:
            img3=(img3+1)%nb_im; canvas.delete(imag3); y3=0
            imag3=canvas.create_image(x3,0,anchor=NW,image=liste_images[img3])

        canvas.update()
#       if img1==img2==img3: return

cerises   =PhotoImage(file="cerises.gif")
seven     =PhotoImage(file="seven.gif")
feracheval=PhotoImage(file="feracheval.gif")
pasteque  =PhotoImage(file="pasteque.gif")
cloche    =PhotoImage(file="cloche.gif")

liste_images=[cerises,feracheval,seven,pasteque,cloche]
nb_im=len(liste_images)

DeplacementImagColonnes(canvas,liste_images)

fen.mainloop()

Je regarde ton envoi en #12.

Hors ligne

#14 Le 11/05/2019, à 21:01

kholo

Re : |python tkinter novice]- aide pour programmer une machine a sous

salut,
avant d'aller trop loin quelques remarques et conseils :
l'import de tkinter est meilleurs ainsi :

import tkinter as tk

du coup, il faut déclarer tk quand tu crées des objets, par exemple:

fen = tk.Tk()

ou

boutonGo = tk.Button...
imageX = tk.PhotoImage...

de ce fait NW (pour nord west) est chiant car il demande le tk. donc, tu les remplaces par 'nw' wink

ensuite outre la factorisation pour la création de certains objets comme les séries de ronds en haut et en bas, tu n'es pas obligée de donner un nom à chaque objet puisqu'ils seront immuables. Par exemple :

    canvas.create_oval(65, 255, 85, 275, fill="yellow", outline='yellow')

suffit...
idem pour les étoiles...

ensuite, pour faire de la place quand tu codes, mets les créations d'objets dans des fonctions à part. Par' exemple :

def faire_les_etoiles():
    # création de deux étoiles concentriques (l'un jaune et l'autre marron)
    canvas.create_polygon(350, 15, 317, 75, 250, 75, 301, 123, 280, 190, 350, 150, 
    420, 190, 400, 123, 450, 75, 383, 75, fill="yellow", outline='yellow')
    canvas.create_polygon(350, 27, 322, 80, 260, 80, 308, 123, 288, 180, 350, 142,
    412, 180, 393, 123, 440, 80, 378, 80, fill="brown", outline='yellow')
faire_les_etoiles()

pour iniber une de ces créations, il suffit de commenter la ligne :

def faire_les_etoiles():
    # création de deux étoiles concentriques (l'un jaune et l'autre marron)
    canvas.create_polygon(350, 15, 317, 75, 250, 75, 301, 123, 280, 190, 350, 150, 
    420, 190, 400, 123, 450, 75, 383, 75, fill="yellow", outline='yellow')
    canvas.create_polygon(350, 27, 322, 80, 260, 80, 308, 123, 288, 180, 350, 142,
    412, 180, 393, 123, 440, 80, 378, 80, fill="brown", outline='yellow')
# faire_les_etoiles()

et, hop ! plus d'étoiles !
en plus les IDE permettent de fermer les fonctions et ça fait du vide !

j'ai aussi trouvé bizarre d'avoir du pack (pour le canvas) et du place (pour le bouton) dans le code... qui ont pourtant l'air de bien cohabiter !
du coup, je vire les deux et je met du grid qui centre par défaut quand on y met pas d'argument lol

c'est bon aussi de mettre de l'air dans le code ; tous ces chiffres collés les uns aux autres, ça fait mal au crane !
par exemple :

    canvas.create_oval(65, 255, 85, 275, fill="yellow", outline='yellow')

j'ajoute un if main en bas qui ne sert pas pour l'instant mais qui risque de servir plus tard...

if __name__ == "__main__":
    pass

et j'ai commenté les images pour les mettre de côté pour le moment...

et pour tester mes codes à la volé, j'ajoute une routine qui ferme la fenêtre avec la touche échappe :

fen.bind('<Escape>', lambda event:fen.destroy())

NB : je code avec geany, vous avez quoi ? => certains pourront vous donner aussi des astuces pour coder plus vite !

bref, outre les factorisations voilà ce que donne ton code pour le moment :

#!/usr/bin/env python3
# -*- coding: UTF8 -*-
"""
création d'un jeu de machine à sous 

"""
import tkinter as tk

fen = tk.Tk()  # création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas = tk.Canvas(fen, width='700', height='700', background='black')
canvas.grid()

def faire_les_etoiles():
    """ création de deux étoiles concentriques (l'un jaune et l'autre marron) """
    canvas.create_polygon(350, 15, 317, 75, 250, 75, 301, 123, 280, 190, 350, 150, 
    420, 190, 400, 123, 450, 75, 383, 75, fill="yellow", outline='yellow')
    canvas.create_polygon(350, 27, 322, 80, 260, 80, 308, 123, 288, 180, 350, 142,
    412, 180, 393, 123, 440, 80, 378, 80, fill="brown", outline='yellow')

def faire_fond_defilement():
    """ création d'un rectangle de dimensions 400 sur 650; colorié en marron
    et le contour en noir."""
    colonne1 = canvas.create_rectangle(25, 250, 675, 650, fill="brown", outline="black")

def faire_les_rond_haut():
    """ création d'une succession de deux cercles jaunes de diamètre respectif 20 et
    10 sur une même ligne """
    canvas.create_oval(65, 255, 85, 275, fill="yellow", outline='yellow')
    canvas.create_oval(110, 260, 120, 270, fill="yellow", outline='yellow')
    canvas.create_oval(145, 255, 165, 275, fill="yellow", outline='yellow')
    canvas.create_oval(190, 260, 200, 270, fill="yellow", outline='yellow')
    canvas.create_oval(225, 255, 245, 275, fill="yellow", outline='yellow')
    canvas.create_oval(270, 260, 280, 270, fill="yellow", outline='yellow')
    canvas.create_oval(305, 255, 325, 275, fill="yellow", outline='yellow')
    canvas.create_oval(350, 260, 360, 270, fill="yellow", outline='yellow')
    canvas.create_oval(385, 255, 405, 275, fill="yellow", outline='yellow')
    canvas.create_oval(430, 260, 440, 270, fill="yellow", outline='yellow')
    canvas.create_oval(465, 255, 485, 275, fill="yellow", outline='yellow')
    canvas.create_oval(510, 260, 520, 270, fill="yellow", outline='yellow')
    canvas.create_oval(545, 255, 565, 275, fill="yellow", outline='yellow')
    canvas.create_oval(590, 260, 600, 270, fill="yellow", outline='yellow')
    canvas.create_oval(625, 255, 645, 275, fill="yellow", outline='yellow')

def faire_les_rond_bas():
    """ création d'une succession de deux cercles jaunes de diamètre respectif 20 et
    10 sur une même ligne """
    canvas.create_oval(65, 620 , 85, 640 , fill="yellow", outline='yellow')
    canvas.create_oval(110, 625, 120, 635, fill="yellow", outline='yellow')
    canvas.create_oval(145, 620, 165, 640, fill="yellow", outline='yellow')
    canvas.create_oval(190, 625, 200, 635, fill="yellow", outline='yellow')
    canvas.create_oval(225, 620, 245, 640, fill="yellow", outline='yellow')
    canvas.create_oval(270, 625, 280, 635, fill="yellow", outline='yellow')
    canvas.create_oval(305, 620, 325, 640, fill="yellow", outline='yellow')
    canvas.create_oval(350, 625, 360, 635, fill="yellow", outline='yellow')
    canvas.create_oval(385, 620, 405, 640, fill="yellow", outline='yellow')
    canvas.create_oval(430, 625, 440, 635, fill="yellow", outline='yellow')
    canvas.create_oval(465, 620, 485, 640, fill="yellow", outline='yellow')
    canvas.create_oval(510, 625, 520, 635, fill="yellow", outline='yellow')
    canvas.create_oval(545, 620, 565, 640, fill="yellow", outline='yellow')
    canvas.create_oval(590, 625, 600, 635, fill="yellow", outline='yellow')
    canvas.create_oval(625, 620, 645, 640, fill="yellow", outline='yellow')

faire_les_etoiles()
faire_fond_defilement()
faire_les_rond_haut()
faire_les_rond_bas()

# création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
colonne2 = canvas.create_rectangle(50 , 300 , 250 , 600 , fill="white", outline="black")
colonne3 = canvas.create_rectangle(250 , 300 , 450 , 600 , fill="white", outline="black")
colonne4 = canvas.create_rectangle(450 , 300 , 650 , 600 , fill="white", outline="black")

# création d'un bouton Go
boutonGo = tk.Button(fen, text='Go', width=10, height=2) # mettre command= et définir une fonction
boutonGo.grid()

# image1 = tk.PhotoImage(file="cerises.gif")
# image11 = canvas.create_image(60, 350, anchor='nw', image=image1)
# image12 = canvas.create_image(260, 350, anchor='nw', image=image1)
# image13 = canvas.create_image(460, 350, anchor='nw', image=image1)

# image2 = tk.PhotoImage(file="feracheval.gif")
# image21 = canvas.create_image(60, 350, anchor='nw', image=image2)
# image22 = canvas.create_image(260, 350, anchor='nw', image=image2)
# image23 = canvas.create_image(460, 350, anchor='nw', image=image2)

# image3 = tk.PhotoImage(file="seven.gif")
# image31 = canvas.create_image(60, 350, anchor='nw', image=image3)
# image32 = canvas.create_image(260, 350, anchor='nw', image=image3)
# image33 = canvas.create_image(460, 350, anchor='nw', image=image3)

# image4 = tk.PhotoImage(file="pasteque.gif")
# image41 = canvas.create_image(60, 350, anchor='nw', image=image4)
# image42 = canvas.create_image(260, 350, anchor='nw', image=image4)
# image43 = canvas.create_image(460, 350, anchor='nw', image=image4)

# image5 = tk.PhotoImage(file="cloche.gif")
# image51 = canvas.create_image(80, 350, anchor='nw', image=image5)
# image52 = canvas.create_image(280, 350, anchor='nw', image=image5)
# image53 = canvas.create_image(480, 350, anchor='nw', image=image5)

fen.bind('<Escape>', lambda event:fen.destroy())
fen.mainloop()

if __name__ == "__main__":
    pass

ensuite on devrait pouvoir créer des class pour aller plus vite surtout pour la suite ()déplacement des "rouleaux") mais je ne pense pas que ce soit du niveau de ta fille... donc on va essayer de voir ça avec de la programmation fonctionnelle.

... toujours dans l'idée de simplifier le code, on travail beaucoup avec des objets et des objets d'objets ; par exemple, quand tu crées les images pour plus tard les faire bouger, à la place de  :

# image1 = tk.PhotoImage(file="cerises.gif")
# image11 = canvas.create_image(60, 350, anchor='nw', image=image1)
# image12 = canvas.create_image(260, 350, anchor='nw', image=image1)
# image13 = canvas.create_image(460, 350, anchor='nw', image=image1)

# image2 = tk.PhotoImage(file="feracheval.gif")
# image21 = canvas.create_image(60, 350, anchor='nw', image=image2)
# image22 = canvas.create_image(260, 350, anchor='nw', image=image2)
# image23 = canvas.create_image(460, 350, anchor='nw', image=image2)

# image3 = tk.PhotoImage(file="seven.gif")
# image31 = canvas.create_image(60, 350, anchor='nw', image=image3)
# image32 = canvas.create_image(260, 350, anchor='nw', image=image3)
# image33 = canvas.create_image(460, 350, anchor='nw', image=image3)

# image4 = tk.PhotoImage(file="pasteque.gif")
# image41 = canvas.create_image(60, 350, anchor='nw', image=image4)
# image42 = canvas.create_image(260, 350, anchor='nw', image=image4)
# image43 = canvas.create_image(460, 350, anchor='nw', image=image4)

# image5 = tk.PhotoImage(file="cloche.gif")
# image51 = canvas.create_image(80, 350, anchor='nw', image=image5)
# image52 = canvas.create_image(280, 350, anchor='nw', image=image5)
# image53 = canvas.create_image(480, 350, anchor='nw', image=image5)

je pense qu'il serait plus simple de partir sur une liste de tes images voire des listes ou encore un dictionnaire :
voilà une proposition pour ton script 2 :
ici, je part avec deux listes, je fais descendre 3 images
et je remonte celle d'en bas tout en décallant les 3 qui seront descendues en utilisant la liste et une variable num que j'incrémente
NB : et toujours echap pour quitter cool

#!/usr/bin/env python3
# -*- coding: UTF8 -*-
"""
module docstring

"""

import tkinter as tk

fen = tk.Tk()
fen.geometry("600x600+300+200")
canvas=tk.Canvas(fen, width='600',height='600',background='black')
canvas.grid()

images = []
images.append(tk.PhotoImage(file="cerises.gif"))
images.append(tk.PhotoImage(file="feracheval.gif"))
images.append(tk.PhotoImage(file="seven.gif"))
images.append(tk.PhotoImage(file="pasteque.gif"))
images.append(tk.PhotoImage(file="cloche.gif"))

imag = []
# id0 = canvas.create_image(10, 0, anchor='nw', image=images[0])
# print("l'id0 est", id0)
# je place les 3 premières images et je garde les autre asser haut pour ne pas être dérangé
imag.append(canvas.create_image(10, 0, anchor='nw', image=images[0]))
imag.append(canvas.create_image(10, -200, anchor='nw', image=images[1]))
imag.append(canvas.create_image(10, -400, anchor='nw', image=images[2]))
imag.append(canvas.create_image(10, -200, anchor='nw', image=images[3]))
imag.append(canvas.create_image(10, -200, anchor='nw', image=images[4]))
# print("imag", imag)
# print(canvas.coords(imag[0]))

def DeplacementImagColonne1(canvas, num):
    num1 = 0
    num2 = 0
    num3 = 0

    if num < 3:
        num1 = num
        num2 = num + 1
        num3 = num + 2
    elif num == 3:
        num1 = 3
        num2 = 4
        num3 = 0
    elif num == 4:
        num1 = 4
        num2 = 0
        num3 = 1

    canvas.move(imag[num1], 0, 5)
    canvas.move(imag[num2], 0, 5)
    canvas.move(imag[num3], 0, 5)

    if canvas.coords([imag[num1]])[1] == 400:
        num += 1
        num4 = 0
        # print(num, '=>', num1, num2, num3)
        if num < 3:     num4 = num3 + 1
        elif num == 3:  num4 = 0
        elif num == 4:  
            num4 = 1
        elif num == 5:  
            num = 0
            num4 = 2
        # print("num4...", num4)

        canvas.coords([imag[num1]], [10, -200])
        canvas.coords([imag[num4]], [10, -200])

    canvas.after(20, DeplacementImagColonne1, canvas, num)

DeplacementImagColonne1(canvas, 0)

fen.bind('<Escape>', lambda event:fen.destroy())
fen.mainloop()


if __name__ == "__main__":
    pass

Hors ligne

#15 Le 11/05/2019, à 23:19

kholo

Re : |python tkinter novice]- aide pour programmer une machine a sous

... malheureusement, c'est là que s'arrête la joie car impossible de jouer avec les plans...
si on met les rouleaux dessous, il se perdent sous le cadre blanc...
en passant par la lorraine, j'ai corrigé quelques 'fotes' lol
et j'ai virer les fonctions pour mettre des listes d'objets...
comme ça ya le choix !
j'ai aussi factorisé la fonction DeplacementImagColonne et adapté pour mettre les vitesses différentes aux rouleux...

#!/usr/bin/env python3
# -*- coding: UTF8 -*-
"""
création d'un jeu de machine à sous 

"""
import tkinter as tk

fen = tk.Tk()  # création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas = tk.Canvas(fen, width='700', height='700', background='black')
canvas.grid()

""" création de deux étoiles concentriques (l'un jaune et l'autre marron) """
les_etoiles = [
canvas.create_polygon(350, 15, 317, 75, 250, 75, 301, 123, 280, 190, 350, 150,
    420, 190, 400, 123, 450, 75, 383, 75, fill="yellow", outline='yellow'),
canvas.create_polygon(350, 27, 322, 80, 260, 80, 308, 123, 288, 180, 350, 142,
    412, 180, 393, 123, 440, 80, 378, 80, fill="brown", outline='yellow')
]

""" création d'un rectangle de dimensions 400 sur 650; colorié en marron
et le contour en noir. """
colonne1 = canvas.create_rectangle(25, 250, 675, 650, fill="brown", outline="black")

""" création d'une succession de deux cercles jaunes de diamètre respectif 20 et
10 sur une même ligne """
les_ronds = [
    # ronds hauts
    canvas.create_oval(65, 255, 85, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(110, 260, 120, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(145, 255, 165, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(190, 260, 200, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(225, 255, 245, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(270, 260, 280, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(305, 255, 325, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(350, 260, 360, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(385, 255, 405, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(430, 260, 440, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(465, 255, 485, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(510, 260, 520, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(545, 255, 565, 275, fill="yellow", outline='yellow'), 
    canvas.create_oval(590, 260, 600, 270, fill="yellow", outline='yellow'), 
    canvas.create_oval(625, 255, 645, 275, fill="yellow", outline='yellow'), 
    # ronds bas
    canvas.create_oval(65, 620 , 85, 640 , fill="yellow", outline='yellow'), 
    canvas.create_oval(110, 625, 120, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(145, 620, 165, 640, fill="yellow", outline='yellow'), 
    canvas.create_oval(190, 625, 200, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(225, 620, 245, 640, fill="yellow", outline='yellow'), 
    canvas.create_oval(270, 625, 280, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(305, 620, 325, 640, fill="yellow", outline='yellow'), 
    canvas.create_oval(350, 625, 360, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(385, 620, 405, 640, fill="yellow", outline='yellow'), 
    canvas.create_oval(430, 625, 440, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(465, 620, 485, 640, fill="yellow", outline='yellow'), 
    canvas.create_oval(510, 625, 520, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(545, 620, 565, 640, fill="yellow", outline='yellow'), 
    canvas.create_oval(590, 625, 600, 635, fill="yellow", outline='yellow'), 
    canvas.create_oval(625, 620, 645, 640, fill="yellow", outline='yellow')
]

# création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
colonne2 = canvas.create_rectangle(50 , 300 , 250 , 600 , fill="white", outline="black")
colonne3 = canvas.create_rectangle(250 , 300 , 450 , 600 , fill="white", outline="black")
colonne4 = canvas.create_rectangle(450 , 300 , 650 , 600 , fill="white", outline="black")

def go():
    """ lance le défilement des rouleaux """
    pass

# création d'un bouton Go
boutonGo = tk.Button(fen, text='Go', width=10, height=2, command=go) # mettre command= et définir une fonction
boutonGo.grid()

images = []
images.append(tk.PhotoImage(file="cerises.gif"))
images.append(tk.PhotoImage(file="feracheval.gif"))
images.append(tk.PhotoImage(file="seven.gif"))
images.append(tk.PhotoImage(file="pasteque.gif"))
images.append(tk.PhotoImage(file="cloche.gif"))

x_col = [75, 280, 480]
rouleauA = []
# je place les 3 premières images et je garde les autres assez haut pour ne pas être dérangé
rouleauA.append(canvas.create_image(x_col[0], 200, anchor='nw', image=images[0]))
rouleauA.append(canvas.create_image(x_col[0], 0, anchor='nw', image=images[1]))
rouleauA.append(canvas.create_image(x_col[0], -200, anchor='nw', image=images[2]))
rouleauA.append(canvas.create_image(x_col[0], -400, anchor='nw', image=images[3]))
rouleauA.append(canvas.create_image(x_col[0], -400, anchor='nw', image=images[4]))

rouleauB = []
# je place les 3 premières images et je garde les autres assez haut pour ne pas être dérangé
rouleauB.append(canvas.create_image(x_col[1], 200, anchor='nw', image=images[0]))
rouleauB.append(canvas.create_image(x_col[1], 0, anchor='nw', image=images[1]))
rouleauB.append(canvas.create_image(x_col[1], -200, anchor='nw', image=images[2]))
rouleauB.append(canvas.create_image(x_col[1], -400, anchor='nw', image=images[3]))
rouleauB.append(canvas.create_image(x_col[1], -400, anchor='nw', image=images[4]))

rouleauC = []
# je place les 3 premières images et je garde les autres assez haut pour ne pas être dérangé
rouleauC.append(canvas.create_image(x_col[2], 200, anchor='nw', image=images[0]))
rouleauC.append(canvas.create_image(x_col[2], 0, anchor='nw', image=images[1]))
rouleauC.append(canvas.create_image(x_col[2], -200, anchor='nw', image=images[2]))
rouleauC.append(canvas.create_image(x_col[2], -400, anchor='nw', image=images[3]))
rouleauC.append(canvas.create_image(x_col[2], -400, anchor='nw', image=images[4]))



def DeplacementImagColonne(canvas,rouleau, x_col, num, vitesse):
    num1 = 0
    num2 = 0
    num3 = 0

    if num < 3:
        num1 = num
        num2 = num + 1
        num3 = num + 2
    elif num == 3:
        num1 = 3
        num2 = 4
        num3 = 0
    elif num == 4:
        num1 = 4
        num2 = 0
        num3 = 1

    canvas.move(rouleau[num1], 0, 5)
    canvas.move(rouleau[num2], 0, 5)
    canvas.move(rouleau[num3], 0, 5)

    if canvas.coords([rouleau[num1]])[1] == 600:
        num += 1
        num4 = 0
        # print(num, '=>', num1, num2, num3)
        if num < 3:     num4 = num3 + 1
        elif num == 3:  num4 = 0
        elif num == 4:  
            num4 = 1
        elif num == 5:  
            num = 0
            num4 = 2
        # print("num4...", num4)

        canvas.coords([rouleau[num1]], [x_col, 0])
        canvas.coords([rouleau[num4]], [x_col, 0])

    canvas.after(vitesse, DeplacementImagColonne, canvas, rouleau, x_col, num, vitesse)

DeplacementImagColonne(canvas, rouleauA, x_col[0], 0, 2)
DeplacementImagColonne(canvas, rouleauB, x_col[1], 0, 4)
DeplacementImagColonne(canvas, rouleauC, x_col[2], 0, 1)


fen.bind('<Escape>', lambda event:fen.destroy())
fen.mainloop()

if __name__ == "__main__":
    pass

et il faut encore revoir l'ordre des fonctions pour pouvoir utiliser la fonction go que j'ai jouté pour le bouton de lancement

Hors ligne

#16 Le 12/05/2019, à 09:54

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

Un grand merci pour votre aide.:);)
les images défilent dans les trois colonnes. c'est super !
Mais maintenant on doit arrêter le défilement quand les trois images de chaque colonne sont les mêmes.!

je me permets de demander à pingouinux ce que fait : " while True:  sleep(.05)"

Hors ligne

#17 Le 12/05/2019, à 10:11

pingouinux

Re : |python tkinter novice]- aide pour programmer une machine a sous

Nat62 a écrit :

je me permets de demander à pingouinux ce que fait : " while True:  sleep(.05)"

Le programme marque une pause de 5 centièmes de seconde pour que les images ne défilent pas trop vite.
Ajouté :

while True:

est une boucle infinie.

Mais maintenant on doit arrêter le défilement quand les trois images de chaque colonne sont les mêmes.!

Pour arrêter le défilement, il faut décommenter la ligne n° 34 de mon script en #13

#       if img1==img2==img3: return

mais le problème est qu'il s'arrête immédiatement, les 3 premières images étant identiques.
On peut rajouter un test, faire défiler les images dans un ordre aléatoire, ou bien commencer par une image différente dans chaque colonne.

Remarque : Tout ça me paraît bien compliqué pour une élève de seconde.

Dernière modification par pingouinux (Le 12/05/2019, à 10:12)

Hors ligne

#18 Le 12/05/2019, à 11:54

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

Un grand merci pour votre aide.:);)
les images défilent dans les trois colonnes. c'est super !
Mais maintenant on doit arrêter le défilement quand les trois images de chaque colonne sont les mêmes.!

je me permets de demander à pingouinux ce que fait : " while True:  sleep(.05)" et "canvas.update()" car on doit commenter ce que l'on fait

Hors ligne

#19 Le 12/05/2019, à 12:35

pingouinux

Re : |python tkinter novice]- aide pour programmer une machine a sous

J'ai répondu à la plupart de tes questions en #17. Si ce n'est pas clair, précise tes questions.

        canvas.update()

Cette ligne sert à mettre à jour l'affichage à chaque intération de la boucle.

$ pydoc3 tkinter.Canvas.update
tkinter.Canvas.update = update(self)
    Enter event loop until all pending events have been processed by Tcl.

Hors ligne

#20 Le 12/05/2019, à 12:52

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

merciiiiiiiiiiiiiiiiii pingouinux
je n'avais pas vu que tu m'avais répondu à 10h !
moi aussi ; je pense aussi que c'est bien trop compliqué ! et encore les autres sujets sont pires : flipper;  lancer d'une balle pour détruire un chateau...

Bon dimanche

Hors ligne

#21 Le 12/05/2019, à 13:21

Nuliel

Re : |python tkinter novice]- aide pour programmer une machine a sous

Avec mes secondes, j'ai vu les conditions, un tout petit peu les fonctions, mais déjà les boucles ça pose problème, mais après ça dépend aussi des profs: certains passent pas mal de temps à travailler l'algorithmique (j'en ai fait un tout petit peu pour ma part)

Hors ligne

#22 Le 12/05/2019, à 13:25

pingouinux

Re : |python tkinter novice]- aide pour programmer une machine a sous

J'espère que tout n'est pas à rendre pour le 16…
Bon dimanche aussi

Hors ligne

#23 Le 12/05/2019, à 16:48

Nat62

Re : |python tkinter novice]- aide pour programmer une machine a sous

C'était les sujets proposés pour la classe de Ambre; un sujet par élève. ouf !!!! déjà un ; c'est dur !!
j'ai remplacé les img par des random.randint(0,4) et mis le  if img1==img2==img3: return à la fin et ça marche super !
un grand merci !!
si je peux me permettre; si je peux encore vous solliciter:
quand je clique sur le bouton GO : les images défilent dans les trois colonnes; Ensuite quand les trois images sont identiques, ça s'arrête !
Mais quand je reclique sur le bouton GO, les images arrétées précédemment restent visibles!  j'ai essayé de mettre un update; un delete mais ça ne marche pas ! est ce possible de les effacer !!
une autre question : dans mon programme avec des if imbriqués; pourquoi après deux images; les autres n'apparaissaient pas !

voilà le code qui fonctionne (mais quand on clique une fois sur GO):

from tkinter import*
from time import sleep
import random

# On définit la fonction Démarrer. Elle va être appelée quand on va cliquer
# sur le bouton Go.
def Demarrer() :
  DeplacementImagColonnes(canvas,liste_images)


fen=Tk()  # Création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas=Canvas(fen, width='700',height='700',background='black')
canvas.pack()

# Création de deux étoiles concentriques (l'un jaune et l'autre marron)
etoile1=canvas.create_polygon(350,15,317,75,250,75,301,123,280,190,350,150,
420,190,400,123,450,75,383,75,fill="yellow",outline='yellow')
etoile2=canvas.create_polygon(350,27,322,80,260,80,308,123,288,180,350,142,
412,180,393,123,440,80,378,80,fill="brown",outline='yellow')

# Création d'un rectangle de dimensions 400 sur 650; colorié en marron
# et le contour en noir.
colonne1=canvas.create_rectangle(25,250,675,650,fill="brown",outline="black")

# Création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne1=canvas.create_oval(65,255,85,275,fill="yellow",outline='yellow')
ligne2=canvas.create_oval(110,260,120,270,fill="yellow",outline='yellow')
ligne3=canvas.create_oval(145,255,165,275,fill="yellow",outline='yellow')
ligne4=canvas.create_oval(190,260,200,270,fill="yellow",outline='yellow')
ligne5=canvas.create_oval(225,255,245,275,fill="yellow",outline='yellow')
ligne6=canvas.create_oval(270,260,280,270,fill="yellow",outline='yellow')
ligne7=canvas.create_oval(305,255,325,275,fill="yellow",outline='yellow')
ligne8=canvas.create_oval(350,260,360,270,fill="yellow",outline='yellow')
ligne9=canvas.create_oval(385,255,405,275,fill="yellow",outline='yellow')
ligne10=canvas.create_oval(430,260,440,270,fill="yellow",outline='yellow')
ligne11=canvas.create_oval(465,255,485,275,fill="yellow",outline='yellow')
ligne12=canvas.create_oval(510,260,520,270,fill="yellow",outline='yellow')
ligne13=canvas.create_oval(545,255,565,275,fill="yellow",outline='yellow')
ligne14=canvas.create_oval(590,260,600,270,fill="yellow",outline='yellow')
ligne15=canvas.create_oval(625,255,645,275,fill="yellow",outline='yellow')

# Création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
colonne2=canvas.create_rectangle(50,300,250,600,fill="white",outline="black")
colonne3=canvas.create_rectangle(250,300,450,600,fill="white",outline="black")
colonne4=canvas.create_rectangle(450,300,650,600,fill="white",outline="black")

# Création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne16=canvas.create_oval(65,620,85,640,fill="yellow",outline='yellow')
ligne17=canvas.create_oval(110,625,120,635,fill="yellow",outline='yellow')
ligne18=canvas.create_oval(145,620,165,640,fill="yellow",outline='yellow')
ligne19=canvas.create_oval(190,625,200,635,fill="yellow",outline='yellow')
ligne20=canvas.create_oval(225,620,245,640,fill="yellow",outline='yellow')
ligne21=canvas.create_oval(270,625,280,635,fill="yellow",outline='yellow')
ligne22=canvas.create_oval(305,620,325,640,fill="yellow",outline='yellow')
ligne23=canvas.create_oval(350,625,360,635,fill="yellow",outline='yellow')
ligne24=canvas.create_oval(385,620,405,640,fill="yellow",outline='yellow')
ligne25=canvas.create_oval(430,625,440,635,fill="yellow",outline='yellow')
ligne26=canvas.create_oval(465,620,485,640,fill="yellow",outline='yellow')
ligne27=canvas.create_oval(510,625,520,635,fill="yellow",outline='yellow')
ligne28=canvas.create_oval(545,620,565,640,fill="yellow",outline='yellow')
ligne29=canvas.create_oval(590,625,600,635,fill="yellow",outline='yellow')
ligne30=canvas.create_oval(625,620,645,640,fill="yellow",outline='yellow')

# Création d'un bouton Go qui appelle la fonction Démarrer
boutonGo = Button(fen,text='Go',width=10,height=2,command=Demarrer)
boutonGo.place(x=310,y=90)

# On définit une fonction Déplacement pour la "colonne2" qui va faire défiler
# les images.
def DeplacementImagColonnes(canvas,liste_images):
    img1=random.randint(0,4)
    img2=random.randint(0,4)
    img3=random.randint(0,4)
    y1=y2=y3=400
    dy1,dy2,dy3=20,25,50
    x1,x2,x3=150,350,550
    imag1=canvas.create_image(x1,400,anchor=CENTER,image=liste_images[img1])
    imag2=canvas.create_image(x2,400,anchor=CENTER,image=liste_images[img2])
    imag3=canvas.create_image(x3,400,anchor=CENTER,image=liste_images[img3])
    while True:
        sleep(.05)

        if y1<500: canvas.move(imag1,0,dy1); y1+=dy1
        else:
            img1=(img1+1)%nb_im; canvas.delete(imag1); y1=400
            imag1=canvas.create_image(x1,400,anchor=CENTER,image=liste_images[img1])

        if y2<500: canvas.move(imag2,0,dy2); y2+=dy2
        else:
            img2=(img2+1)%nb_im; canvas.delete(imag2); y2=400
            imag2=canvas.create_image(x2,400,anchor=CENTER,image=liste_images[img2])

        if y3<500: canvas.move(imag3,0,dy3); y3+=dy3
        else:
            img3=(img3+1)%nb_im; canvas.delete(imag3); y3=400
            imag3=canvas.create_image(x3,400,anchor=CENTER,image=liste_images[img3])

        canvas.update()
        if img1==img2==img3: return

# Programme PRINCIPAL
cerises   =PhotoImage(file="cerises.gif")
seven     =PhotoImage(file="seven.gif")
feracheval=PhotoImage(file="feracheval.gif")
pasteque  =PhotoImage(file="pasteque.gif")
cloche    =PhotoImage(file="cloche.gif")

liste_images=[cerises,feracheval,seven,pasteque,cloche]
nb_im=len(liste_images)


fen.mainloop()

merci

Hors ligne

#24 Le 12/05/2019, à 17:24

pingouinux

Re : |python tkinter novice]- aide pour programmer une machine a sous

Nat62 #23 a écrit :

Mais quand je reclique sur le bouton GO, les images arrétées précédemment restent visibles!

Tu n'avais pas précisé que l'on pouvait rejouer. C'est normalement corrigé, et j'ai mis quelques commentaires dans le programme.

une autre question : dans mon programme avec des if imbriqués; pourquoi après deux images; les autres n'apparaissaient pas !

As-tu un exemple, car je ne vois pas de if imbriqués dans ton script.

Remarques :
- J'ai ajouté un bouton Quit
- Je trouve que les images défilent très vite
- Tu choisis aléatoirement la première image de chaque colonne, mais tu peux aussi ne pas les faire défiler dans l'ordre

#!/usr/bin/env python3
from tkinter import*
from time import sleep
import random

# On définit la fonction Démarrer. Elle va être appelée quand on va cliquer
# sur le bouton Go.
def Demarrer() :
  DeplacementImagColonnes(canvas,liste_images)


fen=Tk()  # Création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas=Canvas(fen, width='700',height='700',background='black')
canvas.pack()

# Création de deux étoiles concentriques (l'un jaune et l'autre marron)
etoile1=canvas.create_polygon(350,15,317,75,250,75,301,123,280,190,350,150,
420,190,400,123,450,75,383,75,fill="yellow",outline='yellow')
etoile2=canvas.create_polygon(350,27,322,80,260,80,308,123,288,180,350,142,
412,180,393,123,440,80,378,80,fill="brown",outline='yellow')

# Création d'un rectangle de dimensions 400 sur 650; colorié en marron
# et le contour en noir.
colonne1=canvas.create_rectangle(25,250,675,650,fill="brown",outline="black")

# Création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne1=canvas.create_oval(65,255,85,275,fill="yellow",outline='yellow')
ligne2=canvas.create_oval(110,260,120,270,fill="yellow",outline='yellow')
ligne3=canvas.create_oval(145,255,165,275,fill="yellow",outline='yellow')
ligne4=canvas.create_oval(190,260,200,270,fill="yellow",outline='yellow')
ligne5=canvas.create_oval(225,255,245,275,fill="yellow",outline='yellow')
ligne6=canvas.create_oval(270,260,280,270,fill="yellow",outline='yellow')
ligne7=canvas.create_oval(305,255,325,275,fill="yellow",outline='yellow')
ligne8=canvas.create_oval(350,260,360,270,fill="yellow",outline='yellow')
ligne9=canvas.create_oval(385,255,405,275,fill="yellow",outline='yellow')
ligne10=canvas.create_oval(430,260,440,270,fill="yellow",outline='yellow')
ligne11=canvas.create_oval(465,255,485,275,fill="yellow",outline='yellow')
ligne12=canvas.create_oval(510,260,520,270,fill="yellow",outline='yellow')
ligne13=canvas.create_oval(545,255,565,275,fill="yellow",outline='yellow')
ligne14=canvas.create_oval(590,260,600,270,fill="yellow",outline='yellow')
ligne15=canvas.create_oval(625,255,645,275,fill="yellow",outline='yellow')

# Création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
colonne2=canvas.create_rectangle(50,300,250,600,fill="white",outline="black")
colonne3=canvas.create_rectangle(250,300,450,600,fill="white",outline="black")
colonne4=canvas.create_rectangle(450,300,650,600,fill="white",outline="black")

# Création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
ligne16=canvas.create_oval(65,620,85,640,fill="yellow",outline='yellow')
ligne17=canvas.create_oval(110,625,120,635,fill="yellow",outline='yellow')
ligne18=canvas.create_oval(145,620,165,640,fill="yellow",outline='yellow')
ligne19=canvas.create_oval(190,625,200,635,fill="yellow",outline='yellow')
ligne20=canvas.create_oval(225,620,245,640,fill="yellow",outline='yellow')
ligne21=canvas.create_oval(270,625,280,635,fill="yellow",outline='yellow')
ligne22=canvas.create_oval(305,620,325,640,fill="yellow",outline='yellow')
ligne23=canvas.create_oval(350,625,360,635,fill="yellow",outline='yellow')
ligne24=canvas.create_oval(385,620,405,640,fill="yellow",outline='yellow')
ligne25=canvas.create_oval(430,625,440,635,fill="yellow",outline='yellow')
ligne26=canvas.create_oval(465,620,485,640,fill="yellow",outline='yellow')
ligne27=canvas.create_oval(510,625,520,635,fill="yellow",outline='yellow')
ligne28=canvas.create_oval(545,620,565,640,fill="yellow",outline='yellow')
ligne29=canvas.create_oval(590,625,600,635,fill="yellow",outline='yellow')
ligne30=canvas.create_oval(625,620,645,640,fill="yellow",outline='yellow')

# Création d'un bouton Go qui appelle la fonction Démarrer
boutonGo = Button(fen,text='Go',width=10,height=2,command=Demarrer)
boutonGo.place(x=0,y=90)
# Création d'un bouton Quit
boutonQuit= Button(fen,text='Quit',width=4,height=2,command=fen.destroy)
boutonQuit.place(x=640,y=90)

# On définit une fonction Déplacement pour la "colonne2" qui va faire défiler
# les images.
def DeplacementImagColonnes(canvas,liste_images):
    global imag1, imag2, imag3 # Ces variables sont conservées d'un appel à l'autre
    img1=random.randint(0,4)
    img2=random.randint(0,4)
    img3=random.randint(0,4)
    y1=y2=y3=400
    dy1,dy2,dy3=20,25,50
    x1,x2,x3=150,350,550

  # Les images n'existent pas lors du premier appel,
  # il faut ignorer le message d'erreur
    try:
        canvas.delete(imag1)
        canvas.delete(imag2)
        canvas.delete(imag3)
    except NameError: pass

    imag1=canvas.create_image(x1,400,anchor=CENTER,image=liste_images[img1])
    imag2=canvas.create_image(x2,400,anchor=CENTER,image=liste_images[img2])
    imag3=canvas.create_image(x3,400,anchor=CENTER,image=liste_images[img3])
    while True:
        sleep(.05)

        if y1<500: canvas.move(imag1,0,dy1); y1+=dy1
        else:
            img1=(img1+1)%nb_im; canvas.delete(imag1); y1=400
            imag1=canvas.create_image(x1,400,anchor=CENTER,image=liste_images[img1])

        if y2<500: canvas.move(imag2,0,dy2); y2+=dy2
        else:
            img2=(img2+1)%nb_im; canvas.delete(imag2); y2=400
            imag2=canvas.create_image(x2,400,anchor=CENTER,image=liste_images[img2])

        if y3<500: canvas.move(imag3,0,dy3); y3+=dy3
        else:
            img3=(img3+1)%nb_im; canvas.delete(imag3); y3=400
            imag3=canvas.create_image(x3,400,anchor=CENTER,image=liste_images[img3])

        canvas.update()
        if img1==img2==img3: return

# Programme PRINCIPAL
cerises   =PhotoImage(file="cerises.gif")
seven     =PhotoImage(file="seven.gif")
feracheval=PhotoImage(file="feracheval.gif")
pasteque  =PhotoImage(file="pasteque.gif")
cloche    =PhotoImage(file="cloche.gif")

liste_images=[cerises,feracheval,seven,pasteque,cloche]
nb_im=len(liste_images)

fen.mainloop()

Hors ligne

#25 Le 12/05/2019, à 19:11

kholo

Re : |python tkinter novice]- aide pour programmer une machine a sous

je me suis permis quelques améliorations esthétiques au code et fonctionnement du script de pingouinux.

les formes s'alignent à l'arrêt...
j'ai ajouter la barre d'espace pour lancer en plus du bouton go
j'ai remis en grid mais vous pourrez facilement remettre place (juste commentés)
j'ai nettoyé et aéré le code
j'ai remis l'import de tkinter comme il se doit

#!/usr/bin/env python3
import tkinter as tk
from time import sleep
import random

# On définit la fonction Démarrer. Elle va être appelée quand on va cliquer
# sur le bouton Go ou sur la barre d'espace.
def Demarrer(): DeplacementImagColonnes(canvas, liste_images)

fen=tk.Tk()  # Création d'une fenêtre graphique avec le module tkinter
fen.title("Machine à sous")

canvas=tk.Canvas(fen, width='700', height='700', background='black')
canvas.grid()

# Création de deux étoiles concentriques (l'un jaune et l'autre marron)
canvas.create_polygon(350,15,317,75,250,75,301,123,280,190,350,150,
420,190,400,123,450,75,383,75, fill="yellow", outline='yellow')
canvas.create_polygon(350,27,322,80,260,80,308,123,288,180,350,142,
412,180,393,123,440,80,378,80, fill="brown", outline='yellow')

# Création d'un rectangle de dimensions 400 sur 650; colorié en marron
# et le contour en noir.
canvas.create_rectangle(25,250,675,650, fill="brown", outline="black")

# Création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
canvas.create_oval(65,255,85,275,   fill="yellow", outline='yellow')
canvas.create_oval(110,260,120,270, fill="yellow", outline='yellow')
canvas.create_oval(145,255,165,275, fill="yellow", outline='yellow')
canvas.create_oval(190,260,200,270, fill="yellow", outline='yellow')
canvas.create_oval(225,255,245,275, fill="yellow", outline='yellow')
canvas.create_oval(270,260,280,270, fill="yellow", outline='yellow')
canvas.create_oval(305,255,325,275, fill="yellow", outline='yellow')
canvas.create_oval(350,260,360,270, fill="yellow", outline='yellow')
canvas.create_oval(385,255,405,275, fill="yellow", outline='yellow')
canvas.create_oval(430,260,440,270, fill="yellow", outline='yellow')
canvas.create_oval(465,255,485,275, fill="yellow", outline='yellow')
canvas.create_oval(510,260,520,270, fill="yellow", outline='yellow')
canvas.create_oval(545,255,565,275, fill="yellow", outline='yellow')
canvas.create_oval(590,260,600,270, fill="yellow", outline='yellow')
canvas.create_oval(625,255,645,275, fill="yellow", outline='yellow')

# Création de trois rectangles de mêmes dimensions 300 sur 200;
# coloriés en blanc et leur contour en noir.
canvas.create_rectangle(50,300,250,600,  fill="white", outline="black")
canvas.create_rectangle(250,300,450,600, fill="white", outline="black")
canvas.create_rectangle(450,300,650,600, fill="white", outline="black")

# Création d'une succession de deux cercles jaunes de diamètre respectif 20 et
# 10 sur une même ligne
canvas.create_oval(65,620,85,640,   fill="yellow", outline='yellow')
canvas.create_oval(110,625,120,635, fill="yellow", outline='yellow')
canvas.create_oval(145,620,165,640, fill="yellow", outline='yellow')
canvas.create_oval(190,625,200,635, fill="yellow", outline='yellow')
canvas.create_oval(225,620,245,640, fill="yellow", outline='yellow')
canvas.create_oval(270,625,280,635, fill="yellow", outline='yellow')
canvas.create_oval(305,620,325,640, fill="yellow", outline='yellow')
canvas.create_oval(350,625,360,635, fill="yellow", outline='yellow')
canvas.create_oval(385,620,405,640, fill="yellow", outline='yellow')
canvas.create_oval(430,625,440,635, fill="yellow", outline='yellow')
canvas.create_oval(465,620,485,640, fill="yellow", outline='yellow')
canvas.create_oval(510,625,520,635, fill="yellow", outline='yellow')
canvas.create_oval(545,620,565,640, fill="yellow", outline='yellow')
canvas.create_oval(590,625,600,635, fill="yellow", outline='yellow')
canvas.create_oval(625,620,645,640, fill="yellow", outline='yellow')

# Création d'un bouton Go qui appelle la fonction Démarrer
boutonGo = tk.Button(fen, text='Go', width=10, height=2, command=Demarrer)
# boutonGo.place(x=0, y=90)
boutonGo.grid(row=0, column=0, sticky='nw')

# Création d'un bouton Quit
boutonQuit = tk.Button(fen, text='Quit', width=4, height=2, command=fen.destroy)
# boutonQuit.place(x=640, y=90)
boutonQuit.grid(row=0, column=0, sticky='ne')


def DeplacementImagColonnes(canvas,liste_images):
    """ fonction pour la "colonne2" qui va faire défiler les images. """
    global imag1, imag2, imag3 # Ces variables sont conservées d'un appel à l'autre
    img1 = random.randint(0, 4)
    img2 = random.randint(0, 4)
    img3 = random.randint(0, 4)
    y1 = y2 = y3 = 400
    dy1, dy2, dy3 = 20, 25, 50
    x1 , x2, x3 = 150, 350, 550

  # Les images n'existent pas lors du premier appel,
  # il faut ignorer le message d'erreur
    try:
        canvas.delete(imag1)
        canvas.delete(imag2)
        canvas.delete(imag3)
    except NameError: pass

    imag1 = canvas.create_image(x1, 400, anchor=tk.CENTER, image=liste_images[img1])
    imag2 = canvas.create_image(x2, 400, anchor=tk.CENTER, image=liste_images[img2])
    imag3 = canvas.create_image(x3, 400, anchor=tk.CENTER, image=liste_images[img3])
    while True:
        sleep(.05)

        if y1 < 500: canvas.move(imag1, 0, dy1); y1 += dy1
        else:
            img1 = (img1+1)%nb_im; canvas.delete(imag1); y1 = 400
            imag1 = canvas.create_image(x1, 400, anchor=tk.CENTER, image = liste_images[img1])

        if y2 < 500: canvas.move(imag2, 0, dy2); y2 += dy2
        else:
            img2 = (img2+1)%nb_im; canvas.delete(imag2); y2 = 400
            imag2 = canvas.create_image(x2, 400, anchor=tk.CENTER, image=liste_images[img2])

        if y3 < 500: canvas.move(imag3, 0, dy3); y3 += dy3
        else:
            img3 = (img3+1)%nb_im; canvas.delete(imag3); y3 = 400
            imag3 = canvas.create_image(x3, 400, anchor=tk.CENTER, image=liste_images[img3])

        canvas.update()
        if img1 == img2 == img3:
            canvas.delete(imag1)
            canvas.delete(imag2)
            canvas.delete(imag3)
            imag1 = canvas.create_image(x1, 450, anchor=tk.CENTER, image=liste_images[img1])
            imag2 = canvas.create_image(x2, 450, anchor=tk.CENTER, image=liste_images[img2])
            imag3 = canvas.create_image(x3, 450, anchor=tk.CENTER, image=liste_images[img3])
            return

# Programme PRINCIPAL
cerises    = tk.PhotoImage(file="cerises.gif")
seven      = tk.PhotoImage(file="seven.gif")
feracheval = tk.PhotoImage(file="feracheval.gif")
pasteque   = tk.PhotoImage(file="pasteque.gif")
cloche     = tk.PhotoImage(file="cloche.gif")

liste_images = [cerises, feracheval, seven, pasteque, cloche]
nb_im = len(liste_images)

fen.bind('<Escape>', lambda event:fen.destroy())
fen.bind('<space>', lambda event:Demarrer())
fen.mainloop()

Hors ligne