Tkinter python
vicoumich
-
yg_be Messages postés 24281 Date d'inscription Statut Contributeur Dernière intervention -
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.)
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?
n'as-tu pas négligé d'expliquer le problème?
Bonjour Vicoumich,
Il faut déclarer les images hors procédures, juste après la déclaration de la fenêtre principale:
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 ...
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 ...
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...
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...
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()
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.
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.
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.
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...