Applis Tkinter, des informations sont comptabilisées 2 fois

Résolu
M.E - Modifié le 18 déc. 2023 à 14:51
 M.E - 16 déc. 2023 à 11:53

Bonjour,

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:

2 réponses

Bonsoir,

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.

 

cartes_joueur[joueur].clear()
1

Merci, cela règle bien le problème, un grand merci !!

0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
14 déc. 2023 à 10:11

Bonjour,

Que veux tu dire exactement par "les informations sont comptabilisées 2 fois " ?

0

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é.  

0