RonRunner/ronrunner_1.0~beta1-1/usr/bin/ronrunner
2026-02-09 12:50:08 +01:00

96 lines
3.1 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
from tkinter import *
from tkinter import ttk
from player import Player
from game import Game
PLAYERS: list[Player] = []
# init tkinter
root = Tk()
root.title("🀄 RonRunner - Mahjong Tournament Scoring 🀄")
root.geometry("800x500")
# Configure style
style = ttk.Style()
style.theme_use('clam')
frm = ttk.Frame(root, padding=10)
frm.grid()
# init ui
# players
ttk.Label(frm, text="Rank", font=("Helvetica", 11, "bold")).grid(column=0, row=0, padx=10, pady=10)
ttk.Label(frm, text="Player", font=("Helvetica", 11, "bold")).grid(column=1, row=0, padx=10, pady=10)
ttk.Label(frm, text="Score", font=("Helvetica", 11, "bold")).grid(column=2, row=0, padx=10, pady=10)
entry_player_name = ttk.Entry(frm, width=30, font=("Helvetica", 10))
entry_player_name.grid(column=1, row=len(PLAYERS) + 1, padx=10, pady=10)
# 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), padx=10, pady=10)
# 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}", font=("Helvetica", 10, "bold"), foreground="#FF6B6B").grid(column=0, row=i+1, padx=10, pady=8)
playerLabel = ttk.Label(frm, text=PLAYERS[i].name, font=("Helvetica", 10), foreground="#0066CC")
playerLabel.grid(column=1, row=i+1, padx=10, pady=8)
ttk.Label(frm, text=f"{PLAYERS[i].score}", font=("Helvetica", 10, "bold"), foreground="#2ECC71").grid(column=2, row=i+1, padx=10, pady=8)
# change player name
def onClick(event, player=PLAYERS[i]):
popup = Toplevel(root)
popup.title(f"Edit - {player.name}")
popup.geometry("300x150")
entry = ttk.Entry(popup, width=30, font=("Helvetica", 10))
entry.insert(0, player.name)
entry.grid(column=0, row=0, padx=10, pady=10)
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, padx=5, pady=10)
ttk.Button(popup, text="✕ Cancel", command=lambda : cancelTopLevel(popup)).grid(column=2, row=0, padx=5, pady=10)
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()