Tkinter python

Fermé
vicoumich - 5 août 2020 à 02:34
yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024 - 12 août 2020 à 16:28
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 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024 Ambassadeur 1 557
5 août 2020 à 08:16
bonjour, as-tu une question?
n'as-tu pas négligé d'expliquer le problème?
1
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 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 6 août 2020 à 14:15
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
6 août 2020 à 17:24
Merci beaucoup pour votre réponse.
0
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
12 août 2020 à 10:06
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 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024 1 557 > Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
12 août 2020 à 12:12
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 > yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024
12 août 2020 à 12:50
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 > yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024
Modifié le 12 août 2020 à 12:56
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
12 août 2020 à 14:58
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 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024 1 557
12 août 2020 à 15:15
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 > yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024
12 août 2020 à 15:18
Je le collerais un peu plus loin...
0
yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024 1 557 > yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024
12 août 2020 à 15:22
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 > yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024
12 août 2020 à 15:24
Comment devrais-je renommer cette variable?
0
Vicoumich Messages postés 31 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020 > yg_be Messages postés 23406 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 décembre 2024
12 août 2020 à 15:32
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 Date d'inscription lundi 8 mai 2017 Statut Membre Dernière intervention 26 août 2020
12 août 2020 à 16:06
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