Tkinter python

vicoumich -  
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonsoir,

Je suis en train de coder une interface graphique pour un morpion, or lors de la création d'un Canvas pour créer ma grille, alors que j'ai suivis un tuto sur ytb, le résultat attendu n'est pas du tout présent. je vous met le code si dessous. ( le problème a lieu de la ligne 36 à la ligne 46, l'image s'appellant _white_, est une image grise de la couleur du background de la page principale, qui me permet une fois disposées sur le fond blanc du canvas en étant espacées de 10 pixel de donner l'impression d'une grille.)

from tkinter import*

from time import sleep
def start_pvb(): 
    x = champ_longueur.get()
    y = champ_largeur.get()
    try:
        x = int(x)
        y = int(y)
        if (x <= 2 and y <= 2) or (x > 6 and y > 6):
            explain4.configure(fg = "red")
            return 0
    except:
        explain1.configure(text = "Vous devez impérativement remplir \n le champ avec des valeurs entre ")
        return 0 
    frame1.pack_forget()
     
    
    if x < 5 and y < 5:
        dimension = 150
        larg = dimension*x
        longu = dimension*y
        croix = PhotoImage(file = "croix_150x150.png")
        cercle = PhotoImage(file = "cercle_150x150.png")
        _white_ = PhotoImage(file = "white_150x150.png")
    else:
        dimension = 115
        larg = dimension*x
        longu = dimension*y
        croix = PhotoImage(file = "croix_115x115.png")
        cercle = PhotoImage(file = "cercle_115x115.png")
        _white_ = PhotoImage(file = "white_115x115.png")
    X0 = Y0 = dimension / 2
    morpion_1 = Canvas(p_v_b, width = larg+100, height = longu+100)
    
    for i in range(x):
        centre = (X0 + i*dimension + 10, Y0)
        morpion_1.create_image(centre, image = _white_)                                                 #Création du Morpion
        for c in range (y):
            centre = (X0, Y0 + c*dimension + 10)
            morpion_1.create_image(centre, image = _white_)
    morpion_1.pack(pady = 50)
    



p_v_b = Tk()
p_v_b.title('Player VS Bot')
p_v_b.geometry("1000x900")
p_v_b.minsize(720,480)
p_v_b.configure(background="#292727")

#Avant partie
frame1 = Frame(p_v_b, bg = "#292727")
titre=Label(frame1,text="Player VS Bot",font=("Press start 2p",23),fg="#1BD6F1",bg='#292727')
explain1 = Label(frame1, bg = '#292727', text = "Veuillez cliquer sur start après avoir rempli \n le champ par de valeur entre ", fg = "#1BD6F1", font = ("Arial", 30))
explain4 = Label(frame1, bg = '#292727', text = "3 et 6 compris", fg = "#1BD6F1", font = ("Arial",30))
champ_longueur = Entry(frame1, bg = "#A6E7BC", width = 10) 
champ_largeur = Entry(frame1, bg = "#A6E7BC", width = 10)
explain2 = Label(frame1, bg = '#292727', text = "Longueur du Morpion:", fg = "white", font = ("Arial", 20))
explain3 = Label(frame1, bg = '#292727', text = "Largeur du Morpion:", fg = "white", font = ("Arial", 20))
pvb_start = Button(frame1, bg = "#FFFFED", text = "Start", font = ("Press start 2p",20), fg = "black", height = 3, width = 25, command = start_pvb)
charge_fake = Label(frame1, bg = "#292727", text = "", fg = "white", font = ("Press start 2p",30))
titre.pack(pady=30)
explain1.pack()
explain4.pack()
explain2.pack(pady = 20)
explain3.pack(pady = 20)
champ_largeur.pack(pady = 10)
champ_longueur.pack()
pvb_start.pack(pady = 100)
charge_fake.pack()
frame1.pack()

#Début de partie

p_v_b.mainloop()

4 réponses

yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 586
 
bonjour, as-tu une question?
n'as-tu pas négligé d'expliquer le problème?
1
Vicoumich
 
Navré,

Merci pour votre réponse, en effet je n'ai pas expliqué le problème, le problème est que lorsque je demande à ma double boucle de créer la grille, les image ne s'affichent pas, seule le canevas tout blanc s'affiche...
0
Phil_1857 Messages postés 1956 Statut Membre 168
 
Bonjour Vicoumich,

Il faut déclarer les images hors procédures, juste après la déclaration de la fenêtre principale:
from tkinter import*
from time import sleep

def start_pvb(): 
    x = champ_longueur.get()
    y = champ_largeur.get()
    try:
        x = int(x)
        y = int(y)
        if (x <= 2 and y <= 2) or (x > 6 and y > 6):
            explain4.configure(fg = "red")
            return 0
    except:
        explain1.configure(text = "Vous devez impérativement remplir \n le champ avec des valeurs entre ")
        return 0 
    frame1.pack_forget()
     
    
    if x < 5 and y < 5:
        dimension = 150
        larg = dimension*x
        longu = dimension*y
#        croix = PhotoImage(file = "croix_150x150.png")
#        cercle = PhotoImage(file = "cercle_150x150.png")
#        _white_ = PhotoImage(file = "white_150x150.png")
        img_nb = 0
    else:
        dimension = 115
        larg = dimension*x
        longu = dimension*y
#        croix = PhotoImage(file = "croix_115x115.png")
#        cercle = PhotoImage(file = "cercle_115x115.png")
#        _white_ = PhotoImage(file = "white_115x115.png")
        img_nb = 1
    X0 = Y0 = dimension / 2
    morpion_1 = Canvas(p_v_b, width = larg+100, height = longu+100)
    
    for i in range(x):
        centre = (X0 + i*dimension + 10, Y0)
        morpion_1.create_image(centre, image = _white_[img_nb])                                                 #Création du Morpion
        for c in range (y):
            centre = (X0, Y0 + c*dimension + 10)
            morpion_1.create_image(centre, image = _white_[img_nb])
    morpion_1.pack(pady = 50)
    

p_v_b = Tk()
p_v_b.title('Player VS Bot')
p_v_b.geometry("1000x900")
p_v_b.minsize(720,480)
p_v_b.configure(background="#292727")

#Avant partie
frame1 = Frame(p_v_b, bg = "#292727")
titre=Label(frame1,text="Player VS Bot",font=("Press start 2p",23),fg="#1BD6F1",bg='#292727')
explain1 = Label(frame1, bg = '#292727', text = "Veuillez cliquer sur start après avoir rempli \n le champ par de valeur entre ", fg = "#1BD6F1", font = ("Arial", 30))
explain4 = Label(frame1, bg = '#292727', text = "3 et 6 compris", fg = "#1BD6F1", font = ("Arial",30))
champ_longueur = Entry(frame1, bg = "#A6E7BC", width = 10) 
champ_largeur = Entry(frame1, bg = "#A6E7BC", width = 10)
explain2 = Label(frame1, bg = '#292727', text = "Longueur du Morpion:", fg = "white", font = ("Arial", 20))
explain3 = Label(frame1, bg = '#292727', text = "Largeur du Morpion:", fg = "white", font = ("Arial", 20))
pvb_start = Button(frame1, bg = "#FFFFED", text = "Start", font = ("Press start 2p",20), fg = "black", height = 3, width = 25, command = start_pvb)
charge_fake = Label(frame1, bg = "#292727", text = "", fg = "white", font = ("Press start 2p",30))
titre.pack(pady=30)
explain1.pack()
explain4.pack()
explain2.pack(pady = 20)
explain3.pack(pady = 20)
champ_largeur.pack(pady = 10)
champ_longueur.pack()
pvb_start.pack(pady = 100)
charge_fake.pack()
frame1.pack()

_white_ = {}
_white_[0] = PhotoImage(file = "white_115x115.png")
_white_[1] = PhotoImage(file = "white_150x150.png")

#Début de partie
p_v_b.mainloop()


De plus tu devrais ré arranger tes pack(), les cases pour saisir longueur et largeur sont après les textes 'longueur du morpion:', 'largeur du morpion'
et pas intercalées après chaque texte

De plus, on devrait pouvoir appuyer sur Tab pour passer d'une boite de saisie à l'autre, comme dans n'importe quelle appli ...
1
Vicoumich Messages postés 31 Statut Membre
 
Merci beaucoup pour votre réponse.
0
Vicoumich Messages postés 31 Statut Membre
 
Bonjour Phil_1857,

je viens de corriger les erreurs que vous m'avez précisé, les image apparaissent bien, or il n'y a pas le bon nombre d'image qui apparaissent. Je pense que le problème vient de mes boucles imbriquées mais je n'arrive pas à trouver le problème. Lorsque je tape 3 et 3 dans les champs et que je clique sur start, le tableau qui apparait ne contient que 5 cases au lieu de 9...
0
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 586 > Vicoumich Messages postés 31 Statut Membre
 
qu'as-tu fait pour trouver le problème?
as-tu affiché toutes les valeurs de la variable centre?
0
Vicoumich Messages postés 31 Statut Membre > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'ai simplement lancé le script, rentré les valeurs 3 et 3 pour x et y et cliqué sur start.
0
Vicoumich Messages postés 31 Statut Membre > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
Je viens de rajouter un print(centre), c'était une bonne idée car je vient de comprendre que les valeur ne bougeaient pas à chaques itérations de la boucle, reste a savoir pourquoi...
0
Vicoumich Messages postés 31 Statut Membre
 
Voila mon code, j'ai beau réfléchir et essayer des choses, ça n'aboutie à rien... J'ai essayé de changer à la ligne 27 en rajoutant + 5 ou + 10 mais je ne vois aucune différence ( new est la variable contenant la nouvelle valeur de X0

from tkinter import*
from bon_morpion import*
from time import sleep
def start_pvb(): 
    x = champ_longueur.get()
    y = champ_largeur.get()
    #Vérification des valeurs entrées
    try:
        x = int(x)
        y = int(y)
        if (x <= 2 and y <= 2) or (x > 6 and y > 6) or x <= 2 or y <= 2 or x > 6 or y > 6:
            explain4.configure(fg = "red")
            return 0
    except:
        explain1.configure(text = "Vous devez impérativement remplir \n le champ avec des valeurs entre ")
        return 0 
    frame1.pack_forget()
     
    #Création du Morpion
    if x < 5 and y < 5:
        dimension = 150
        larg = dimension*x
        longu = dimension*y
        X0 = Y0 = dimension / 2
        morpion_1 = Canvas(p_v_b, background  ="#292727", width = larg + 10, height = longu + 10)   
        for i in range(x):
            new = X0 + i*dimension
            centre = (new, Y0)
            morpion_1.create_image(centre, image = _white_150x150)                                                 
            print( centre )
            for c in range (y):
                centre = (new, Y0 + c*dimension)
                morpion_1.create_image(centre, image = _white_150x150)
                print( centre )
    else:
        dimension = 115
        larg = dimension*x
        longu = dimension*y
        
        X0 = Y0 = dimension / 2
        morpion_1 = Canvas(p_v_b, background = "#292727", width = larg, height = longu)
    
        for i in range(x):
            new = X0 + i*dimension
            centre = (new, Y0)
            morpion_1.create_image(centre, image = _white_115x115)
            for c in range (y):
                centre = (new, Y0 + c*dimension)
                morpion_1.create_image(centre, image = _white_115x115)
    morpion_1.pack(pady = 50)
    



p_v_b = Tk()                                                                                            #Création de la fenêtre

croix_150x150 = PhotoImage(file = "./image/croix_150x150.png")
cercle_150x150 = PhotoImage(file = "./image/cercle_150x150.png")
_white_150x150 = PhotoImage(file = "./image/white_150x150.png")
croix_115x115 = PhotoImage(file = "./image/croix_115x115.png")
cercle_115x115 = PhotoImage(file = "./image/cercle_115x115.png")
_white_115x115 = PhotoImage(file = "./image/white_115x115.png")

p_v_b.title('Player VS Bot')
p_v_b.geometry("1000x900")
p_v_b.minsize(720,480)
p_v_b.configure(background="#292727")

#Avant partie
frame1 = Frame(p_v_b, bg = "#292727")
titre=Label(frame1,text="Player VS Bot",font=("Press start 2p",23),fg="#1BD6F1",bg='#292727')
explain1 = Label(frame1, bg = '#292727', text = "Veuillez cliquer sur start après avoir rempli \n le champ par de valeur entre ", fg = "#1BD6F1", font = ("Arial", 30))
explain4 = Label(frame1, bg = '#292727', text = "3 et 6 compris", fg = "#1BD6F1", font = ("Arial",30))
champ_longueur = Entry(frame1, bg = "#A6E7BC", width = 10) 
champ_largeur = Entry(frame1, bg = "#A6E7BC", width = 10)
explain2 = Label(frame1, bg = '#292727', text = "Longueur du Morpion:", fg = "white", font = ("Arial", 20))
explain3 = Label(frame1, bg = '#292727', text = "Largeur du Morpion:", fg = "white", font = ("Arial", 20))
pvb_start = Button(frame1, bg = "#FFFFED", text = "Start", font = ("Press start 2p",20), fg = "black", height = 3, width = 25, command = start_pvb)
charge_fake = Label(frame1, bg = "#292727", text = "", fg = "white", font = ("Press start 2p",30))
titre.pack(pady=30)
explain1.pack()
explain4.pack()
explain2.pack(pady = 20)
champ_largeur.pack(pady = 10)
explain3.pack(pady = 20)
champ_longueur.pack()
pvb_start.pack(pady = 100)
charge_fake.pack()
frame1.pack()

#Début de partie

 


p_v_b.mainloop()

0
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 586
 
si c'était des carrés en papier que tu collais sur une feuille, que ferais-tu pour laisser un espace?
0
Vicoumich Messages postés 31 Statut Membre > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
Je le collerais un peu plus loin...
0
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 586 > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
je pense que les noms que tu as choisis pour tes variables ne t'aident pas à comprendre ce que fait le programme.
le comble, bien sûr, étant "new".
si j'étais toi, je changerais tous les noms pour être certain de bien comprendre.

tu écris aussi que tu réfléchis et que tu essaies: parfois, il vaut mieux beaucoup réfléchir, et un peu essayer.
0
Vicoumich Messages postés 31 Statut Membre > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
Comment devrais-je renommer cette variable?
0
Vicoumich Messages postés 31 Statut Membre > yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention  
 
Enfait, quand vous me demandez ce que je ferais si tout n'était que papier, je me dis qu'il faut juste le coller plus loin, pour celà le x du centre de l'image collée dois être supérieur à la longueur de l'image d'avant pour avoir des espaces horizontalement et faire de même pour y. Or c'est ce que j'ai essayé en faisant centre = (new + 5, Y0 + 5) Mais ça ne marche pas. Je n'arrive pas à bien à envisager d'autre possibilités, si vous voulez me faire réfléchir alors je ne serais pas contre un deuxième indice.
0
Vicoumich Messages postés 31 Statut Membre
 
J'ai trouvé la solution... J'ai augmenté la taille du canvas, or j'avais déjà essayé mais le background du canvas était de la même couleur que les images, merci beaucoup pour votre aide.
0