Je commence sur python et j'ai créé un programme sur python qui compte les points au UNO nommée "Carnet de notes UNO" (c'est pour m'entraîner). J'utilise Tkinter mais je ne maîtrise pas très bien.
Mon problème est que dans l'applications (ouvert avec le module Tkinter), quand je clique sur les cartes ça affiche bien la bonne valeur au dessus d'enregistrer score
... mais une fois enregistré, si je rajoute par la suite une autre carte, l'application garde mes anciens choix.
Par exemple, csi je mets un 1 au début, puis si je mets un autre 1 ça me donne 3 car le premier 1 a été compté deux fois.
Je crois que ce n'est pas très clair mais je vous invite à tester le programme ci-dessous pour mieux comprendre :
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle
from PIL import Image, ImageTk
def ajouter_carte(carte):
joueur = entry_joueur.get()
if joueur:
cartes_joueur.setdefault(joueur, []).append(carte)
update_cartes_joueur(joueur)
def calculer_score(cartes):
score = 0
for carte in cartes:
score += calculer_carte(carte)
return score
def calculer_carte(carte):
if carte in ["+4", "joker"]:
return 50
elif carte == "Spéciale":
return 20
elif carte.isdigit():
return int(carte)
else:
return 0
def update_affichage():
affichage_scores.delete(1.0, tk.END)
for joueur, score in scores.items():
affichage_scores.insert(tk.END, f"{joueur}: {score}\n")
def update_cartes_joueur(joueur):
cartes_restantes = cartes_joueur.get(joueur, [])
entry_cartes.delete(0, tk.END)
entry_cartes.insert(tk.END, " ".join(cartes_restantes))
def ajouter_joueur():
new_player = entry_nouveau_joueur.get()
if new_player and new_player not in players_list:
players_list.append(new_player)
combo_joueurs['values'] = players_list
combo_joueurs.set(new_player)
entry_nouveau_joueur.delete(0, tk.END)
def on_select(event):
selected_player = combo_joueurs.get()
if selected_player:
entry_joueur.delete(0, tk.END)
entry_joueur.insert(tk.END, selected_player)
def assign_card_value(image_index):
card_values = {
0: "0",
1: "1",
2: "2",
3: "3",
4: "4",
5: "5",
6: "6",
7: "7",
8: "8",
9: "9",
10: "+4",
11: "joker",
12: "Spéciale"
}
return card_values.get(image_index, "Valeur par défaut si l'index n'est pas trouvé")
def on_button_click(image_index):
joueur = entry_joueur.get()
try:
if joueur:
carte = assign_card_value(image_index)
cartes_joueur.setdefault(joueur, [])
if carte in ["+4", "joker", "Spéciale"]:
cartes_joueur[joueur].append(carte)
update_cartes_joueur(joueur)
elif carte.isdigit():
cartes_joueur[joueur].append(carte)
update_cartes_joueur(joueur)
except KeyError as e:
print(f"Erreur: Clé manquante - {e}")
except Exception as e:
print(f"Erreur: {e}")
def enregistrer_score():
global score_enregistre
joueur = entry_joueur.get()
cartes_restantes = cartes_joueur.get(joueur, [])
if joueur and cartes_restantes and not score_enregistre:
score = calculer_score(cartes_restantes)
scores[joueur] = scores.get(joueur, 0) + score
update_affichage()
score_enregistre = True
entry_cartes.delete(0, tk.END)
score_enregistre = False
root = tk.Tk()
root.title("Carnet de notes UNO")
scores = {}
cartes_joueur = {}
players_list = []
score_enregistre = False
style = ThemedStyle(root)
style.set_theme("arc")
frame_principal = ttk.Frame(root, padding="20")
frame_principal.pack()
label_joueur = ttk.Label(frame_principal, text="Nom du Joueur :", foreground="black")
label_joueur.grid(row=0, column=0, padx=5, pady=5)
entry_joueur = ttk.Entry(frame_principal)
entry_joueur.grid(row=0, column=1, padx=5, pady=5)
label_nouveau_joueur = ttk.Label(frame_principal, text="Nouveau Joueur :", foreground="black")
label_nouveau_joueur.grid(row=0, column=2, padx=5, pady=5)
entry_nouveau_joueur = ttk.Entry(frame_principal)
entry_nouveau_joueur.grid(row=0, column=3, padx=5, pady=5)
style.configure("TButton", foreground="black")
button_ajouter_joueur = ttk.Button(frame_principal, text="Ajouter Joueur", command=ajouter_joueur)
button_ajouter_joueur.grid(row=0, column=4, padx=5, pady=5)
combo_joueurs = ttk.Combobox(frame_principal, values=players_list)
combo_joueurs.grid(row=0, column=1, padx=5, pady=5)
combo_joueurs.bind("<<ComboboxSelected>>", on_select)
label_choix_carte = ttk.Label(frame_principal, text="Sélectionnez une carte :", foreground="black")
label_choix_carte.grid(row=1, column=0, columnspan=4, padx=5, pady=5)
images_paths = [
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\0.png",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\1.png",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\2.jpg",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\3.jpg",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\4.jpg",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\5.jpg",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\6.png",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\7.png",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\8.jpg",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\9.png",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\+4.png",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\joker.jpg",
r"C:\Users\evanm\Documents\Python\code\UNO\Image des cartes\spéciale.jpg"
]
row = 2
column = 0
image_index = 0
for img_path in images_paths:
image = Image.open(img_path)
image = image.resize((50, 75))
photo = ImageTk.PhotoImage(image)
button = ttk.Button(frame_principal, image=photo, command=lambda idx=image_index: on_button_click(idx))
button.image = photo
button.grid(row=row, column=column, padx=5, pady=5)
column += 1
if column > 3:
column = 0
row += 1
image_index += 1
label_cartes = ttk.Label(frame_principal, text="Cartes restantes du Joueur :", foreground="black")
label_cartes.grid(row=row, column=0, columnspan=4, padx=5, pady=5)
entry_cartes = ttk.Entry(frame_principal)
entry_cartes.grid(row=row + 1, column=0, columnspan=4, padx=5, pady=5)
style.configure("TButton", foreground="black")
button_enregistrer = ttk.Button(frame_principal, text="Enregistrer Score", command=enregistrer_score)
button_enregistrer.grid(row=row + 2, column=0, columnspan=4, padx=5, pady=5)
affichage_scores = tk.Text(frame_principal, height=10, width=30)
affichage_scores.grid(row=row + 3, column=0, columnspan=4, padx=5, pady=5)
root.mainloop()
Windows / Chrome 120.0.0.0
A voir également:
Pour enregistrer ce texte au format txt sans perdre d’informations, quel codage utiliser ? gaël écrit α et β à l’aide de son crayon à 2 €.
Tu penses bien que sans tes images, d'autant que les chemins sont en dur dans ton script, qu'il faille aussi le module ttktheme, on ne peut tester ton script.
En regardant un peu ce que fait ta fonction enregister_score, tu initialises tout sauf cartes_joueur, alors tu dois aussi vider les valeurs de l'item de ton dcitionnaire.
Bonjour, le problème est réglé mais je voulais dire que les cartes une fois rentrées, à chaque fois que je cliquais sur enregistrer score elles étaient comptées à nouveau. Mais une solution a été trouvée par unetelle, donc merci à lui/elle et aussi merci d'avoir quand même essayé.
16 déc. 2023 à 11:49
Merci, cela règle bien le problème, un grand merci !!