simple player ranking

This commit is contained in:
Didictateur 2026-02-09 12:43:47 +01:00
parent 7680436bb7
commit 8b453a14bd
2 changed files with 76 additions and 1 deletions

View file

@ -3,4 +3,4 @@ from random import randint
class Player: class Player:
def __init__(self, name: str): def __init__(self, name: str):
self.name = name self.name = name
self.id = randint(0, 10**100) self.score = randint(0, 100) * 0

View file

@ -5,8 +5,83 @@ from tkinter import ttk
from player import Player from player import Player
from game import Game from game import Game
PLAYERS: list[Player] = []
# init tkinter
root = Tk() root = Tk()
frm = ttk.Frame(root, padding=10) frm = ttk.Frame(root, padding=10)
frm.grid() frm.grid()
# init ui
# players
ttk.Label(frm, text="Rank").grid(column=0, row=0)
ttk.Label(frm, text="Player").grid(column=1, row=0)
ttk.Label(frm, text="Score").grid(column=2, row=0)
entry_player_name = ttk.Entry(frm, width=30)
entry_player_name.grid(column=1, row=len(PLAYERS) + 1)
# adding player
def addPlayer(entry: Entry):
txt = entry.get()
if txt:
PLAYERS.append(Player(txt))
entry.delete(0, END)
refreshUi()
btn_player_name = ttk.Button(frm, text="Add", command=lambda : addPlayer(entry_player_name))
btn_player_name.grid(column=2, row=1 + len(PLAYERS))
# tables
# TODO
# table history
# TODO
# refresh ui
def refreshUi():
# remove old labels
for widget in frm.winfo_children():
if widget not in [entry_player_name, btn_player_name]:
info = widget.grid_info()
if info.get('row', 0) > 0 and info.get('row', 0) < 100:
widget.destroy()
# show players
PLAYERS.sort(key=lambda p : p.score, reverse=True)
for i in range(len(PLAYERS)):
ttk.Label(frm, text=f"{i+1}").grid(column=0, row=i+1)
playerLabel = ttk.Label(frm, text=PLAYERS[i].name)
playerLabel.grid(column=1, row=i+1)
ttk.Label(frm, text=f"{PLAYERS[i].score}").grid(column=2, row=i+1)
# change player name
def onClick(event, player=PLAYERS[i]):
popup = Toplevel(root)
entry = ttk.Entry(popup, width=30)
entry.insert(0, player.name)
entry.grid(column=0, row=0)
def changeName():
name = entry.get()
if name and not name in [p.name for p in PLAYERS]:
player.name = name
entry.delete(0, END)
cancelTopLevel(popup)
ttk.Button(popup, text="Change", command=changeName).grid(column=1, row=0)
ttk.Button(popup, text="Cancel", command=lambda : cancelTopLevel(popup)).grid(column=2, row=0)
playerLabel.bind("<Button-1>", onClick)
# adding player
entry_player_name.grid(column=1, row=len(PLAYERS) + 1)
btn_player_name.grid(column=2, row=1 + len(PLAYERS))
def cancelTopLevel(tl: Toplevel):
tl.destroy()
refreshUi()
root.mainloop() root.mainloop()