bon j'ai un problème : je cherche a mettre un dessin de pendu sur une fenêtre mais cependant dans je lance mon programme il me met "_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid"
apres avoir fait qlq recherche sur l'internet j'ai compris que on ne pouvait pas associer "grid" avec "pack" mais je ne sais pas comment rectifier mon erreur svp aidez moi!!
(ps:je suis en isn donc je ne merise que les base du python.)
import random
from tkinter import*
fenetre=Tk()
fen=Tk()
fen.title("Le pendu")
fen.configure(bg="grey")
fen.geometry('900x1000')
fen.title("Le pendu")
liste = ["ABAISSER","ABAISSERA","ABAISSERAI","ABAISSERAIENT", "ABAISSERAIS","ABAISSERAIT", "ABAISSERAS", "ABAISSERENT", "ABAISSEREZ"]
mot = random.choice(liste)
motatrouver = ["*"] * len(mot)
essayé = set()
nb_echecs = 0
appel=0
quitter=0
def appel():
can = Canvas(fen,width="600",height="800")
saisie = Button(fen, text="Entrer lettre : ", command= affichage_du_pendu)
lettres_utilisées = Label(fen, text="Lettres deja utilisées : ")
quitter = Button(fen, text="Quitter", command=quit)
can.grid(row=1,column=1,rowspan=10)
saisie.grid(row=7,column=7, padx=130, pady=100)
lettres_utilisées.grid(row=5, column=7, padx=130, pady=100)
quitter.grid(row=10, column=7, padx=130, pady=100)
fen.deiconify()
def affichage_du_pendu():
global motatrouver, nb_echecs,liste, essayé, mot,reponse
while "".join(motatrouver) != mot and nb_echecs < 8:
reponse = input("Choisissez une lettre : ").upper()
if len(reponse) != 1:
print("Veuillez n'écrire qu'une lettre")
elif reponse in essayé:
print("Vous avez déjà choisi cette lettre")
else:
essayé.add(reponse)
if reponse in mot:
motatrouver = [lettre if lettre in essayé else "*" for lettre in mot]
else:
nb_echecs += 1
if nb_echecs == 1 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
(canevas.create_line(250,750,750,750))
fenetre.mainloop()
if nb_echecs == 2 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
fenetre.mainloop()
if nb_echecs == 3 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
can.create_line(400,300,450,250)
can.create_line(400,250,750,250)
fenetre.mainloop()
if nb_echecs == 4 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
can.create_line(400,300,450,250)
can.create_line(400,250,750,250)
can.create_line(600,250,600,350)
fenetre.mainloop()
if nb_echecs == 5 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
can.create_line(400,300,450,250)
can.create_line(400,250,750,250)
can.create_line(600,250,600,350)
can.create_oval(575,350,625,400)
fenetre.mainloop()
if nb_echecs == 6 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
can.create_line(400,300,450,250)
can.create_line(400,250,750,250)
can.create_line(600,250,600,350)
can.create_oval(575,350,625,400)
can.create_line(600,400,600,500)
fenetre.mainloop()
if nb_echecs == 7 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
can.create_line(400,300,450,250)
can.create_line(400,250,750,250)
can.create_line(600,250,600,350)
can.create_oval(575,350,625,400)
can.create_line(600,400,600,500)
can.create_line(600,425,540,460)
can.create_line(600,425,660,460)
fenetre.mainloop()
if nb_echecs == 8 :
can = Canvas(fen, width=1000, height=1000, background='white')
can.pack(padx = 5, pady= 5)
can.create_line(250,750,750,750)
can.create_line(400,750,400,250)
can.create_line(400,300,450,250)
can.create_line(400,250,750,250)
can.create_line(600,250,600,350)
can.create_oval(575,350,625,400)
can.create_line(600,400,600,500)
can.create_line(600,425,540,460)
can.create_line(600,425,660,460)
can.create_line(600,500,560,600)
can.create_line(600,500,640,600)
fenetre.mainloop()
print (motatrouver)
if "".join(motatrouver) == mot:
print("Gagné")
print(nb_echecs)
else:
print("Perdu")
print(motatrouver)
Label1 = Label(fenetre, text = 'Le pendu !', fg = 'black')
Label1.pack()
Bouton1 = Button(fenetre, text = 'jouer', command = appel )
Bouton1.pack()
Bouton2 = Button(fenetre, text = 'Quitter', command = fenetre.destroy)
Bouton2.pack()
fen.withdraw()
fenetre.mainloop()
Par exemple, lignes 19 et 25, tu utilises le gestionnaire grid pour placer un canevas dans la fenêtre. Mais lignes 52-3, tu places dans la même fenêtre (fen) un autre canevas avec la méthode pack, et ça (utiliser deux gestionnaires), ce n'est pas autorisé par Tkinter, comme expliqué dans le warning de cette page. Vu que tu as pas mal de widgets, utilise la méthode grid, c'est plus facile.
c'est bon j'ai réussi à remplacer les packs ET SA MARCHE !!!
mais maintenant j'ai un autre problème qui est d'afficher la barre de demande de lettre (une barre en dessous de entrée lettres pour y écrire une lettre)
C'est une idée que je viens d'avoir donc pas forcément géniale.
Tu fais une présentation comme suit :
tu crées autant de labels sur une même ligne que de lettres du mot à trouver, au départ ces labels sont vide mais tu fixes une taille (tu te bases sur la lettre capitale la plus large : W ou M je pense).
En dessous, tu crées 26 boutons qui contiennent chacun une lettre de l'alphabet.
Pour jouer, on clique sur la lettre qui pourrait être dans le mot, et quoi qu'il arrive, on passe l'état du bouton en disable. Pour le reste du jeu, je pense que tu as su te débrouiller.
Solution de facilité bloquante un très court laps de temps (impossibilité d'intéragir, mais surtout : utilisation à 100% du processeur) : une boucle for.
Solution non sans défaut (plus lent) mais non bloquant : utiliser la méthode after().
Tu peux, je pense utiliser la première solution.
L'objectif est de faire une for loop pour afficher autant de labels de lettre que de lettres du mot à trouver. À chaque nouveau mot, on récupère la taille du mot, et on boucle autant de fois que la taille du mot.
La première erreur est un oubli : elles sont où les lettres de l'alphabet ?
Ensuite, si c'est ton projet ISN, je pense que l'examinateur préférera un programme moche mais qui fonctionne, plutôt que quelque chose de joli (tes dessins de pendu progressifs) mais qui fonctionne pas complètement.
Dans mon premier message, implicitement, je voulais que tu te concentres sur le jeu pas le canevas.
J'ai lu ton programme et je n'ai pas compris quelque chose :
while"".join(motatrouver) != mot and nb_echecs <= 8:
Est ce que quelqun pourrais m expliquer le but de "" et de join svp?
pendu
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères