Tkinter python
vicoumich
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23437 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 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour, as-tu une question?
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: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... -
-
-
-
-
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. -
-
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.
-
-
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.