import tkinter
from tkinter import filedialog
import os
class Terrain :
def __init__ ( self ) :
self . height = 15000 / / 25
self . width = 28000 / / 25
self . three_points = 6250 / / 25 # rayon
self . middle_circle = 1800 / / 25 # rayon
class Team :
def __init__ ( self ) :
self . players = [ ' arthur ' , ' jl ' , ' léandre ' , " louis " , " alex " ]
self . filemenu = ' stat.txt '
self . posx , self . posy = 0 , 0 # coo de la dernière action
self . ac_player = 0 # dernier joueur
class Gui :
def __init__ ( self , ) :
self . terrain = Terrain ( )
self . team = Team ( )
self . mode = ' match '
self . file = ' untitled.bbm '
self . temp_data = ' '
self . list_button_menu = [ ]
self . root = tkinter . Tk ( )
self . root . title ( self . file )
self . canvas = tkinter . Canvas ( self . root , width = self . terrain . width , height = self . terrain . height , background = ' #bbb ' )
self . canvas . pack ( )
# file menu
self . menubar = tkinter . Menu ( self . root )
self . filemenu = tkinter . Menu ( self . menubar , tearoff = 0 )
self . filemenu . add_command ( label = " new " , command = self . new )
self . filemenu . add_command ( label = " open " , command = self . browse_open )
self . filemenu . add_command ( label = " save " , command = self . save )
self . filemenu . add_separator ( )
self . filemenu . add_command ( label = " rename " )
self . filemenu . add_command ( label = " exit " , command = self . root . quit )
self . menubar . add_cascade ( label = " file " , menu = self . filemenu )
# mode menu
self . modemenu = tkinter . Menu ( self . menubar , tearoff = 0 )
self . modemenu . add_command ( label = " stat " , command = lambda : self . changemode ( ' stat ' ) )
self . modemenu . add_command ( label = " match " , command = lambda : self . changemode ( ' match ' ) )
self . menubar . add_cascade ( label = " mode " , menu = self . modemenu )
# stat menu
self . statmenu = tkinter . Menu ( self . menubar , tearoff = 0 )
self . statsubmenu = tkinter . Menu ( self . statmenu , tearoff = 0 )
self . statsubmenu . add_command ( label = self . team . players [ 0 ] , command = lambda : self . draw_player ( self . team . players [ 0 ] ) )
self . statsubmenu . add_command ( label = self . team . players [ 1 ] , command = lambda : self . draw_player ( self . team . players [ 1 ] ) )
self . statsubmenu . add_command ( label = self . team . players [ 2 ] , command = lambda : self . draw_player ( self . team . players [ 2 ] ) )
self . statsubmenu . add_command ( label = self . team . players [ 3 ] , command = lambda : self . draw_player ( self . team . players [ 3 ] ) )
self . statsubmenu . add_command ( label = self . team . players [ 4 ] , command = lambda : self . draw_player ( self . team . players [ 4 ] ) )
self . statmenu . add_cascade ( label = " player " , menu = self . statsubmenu )
self . statmenu . add_command ( label = ' team ' , command = self . draw_team )
# topbar
self . root . config ( menu = self . menubar )
# menu contextuel des actions
self . action = tkinter . Menu ( self . root , tearoff = 0 )
self . action . add_command ( label = ' marque ' , command = lambda : self . action_menu ( ' marque ' ) )
self . action . add_command ( label = ' rate ' , command = lambda : self . action_menu ( ' rate ' ) )
# Menu contextuel des joueurs
self . menu = tkinter . Menu ( self . root , tearoff = 0 )
self . menu . add_command ( label = self . team . players [ 0 ] , command = lambda : self . show_sub_menu ( self . team . players [ 0 ] ) )
self . menu . add_command ( label = self . team . players [ 1 ] , command = lambda : self . show_sub_menu ( self . team . players [ 1 ] ) )
self . menu . add_command ( label = self . team . players [ 2 ] , command = lambda : self . show_sub_menu ( self . team . players [ 2 ] ) )
self . menu . add_command ( label = self . team . players [ 3 ] , command = lambda : self . show_sub_menu ( self . team . players [ 3 ] ) )
self . menu . add_command ( label = self . team . players [ 4 ] , command = lambda : self . show_sub_menu ( self . team . players [ 4 ] ) )
def new ( self , * event ) :
# créer un fichier vierge
self . file = ' untitled.bbm '
self . root . title = self . file
def save ( self , * event ) :
# sauvegarde du fichier
if self . file == ' untitled.bbm ' and self . file == ' ' :
self . file = tkinter . filedialog . asksaveasfilename ( initialdir = " ~ " , title = " Select a File " , filetypes = ( ( " BasketBall Match " , " *.bbm " ) , ( " all files " , " *.* " ) ) )
with open ( self . file , ' a ' ) as f :
f . write ( self . temp_data )
self . temp_data = ' '
self . root . title ( self . file )
def browse_open ( self , * event ) :
# ouvre un fichier
self . file = tkinter . filedialog . askopenfilename ( initialdir = " ~/Documents/python/basket " , title = " Select a File " , filetypes = ( ( " BasketBall Match " , " *.bbm " ) , ( " all files " , " *.* " ) ) )
with open ( self . file , ' r ' ) as f :
f . read ( )
self . root . title ( self . file )
def changemode ( self , newmode ) :
print ( self . mode , newmode )
if self . mode != newmode :
if newmode == ' stat ' :
self . menubar . add_cascade ( label = ' stat ' , menu = self . statmenu )
else :
self . menubar . delete ( 3 )
self . mode = newmode
items = self . canvas . find_all ( )
while len ( items ) > 4 :
self . canvas . delete ( items [ - 1 ] )
items = self . canvas . find_all ( )
def context_menu ( self , event ) :
self . team . posx , self . team . posy = event . x , event . y
self . coo = [ event . x_root , event . y_root ]
self . menu . tk_popup ( event . x_root , event . y_root )
self . menu . grab_release ( )
def show_sub_menu ( self , player ) :
self . team . ac_player = player
self . action . tk_popup ( self . coo [ 0 ] , self . coo [ 1 ] )
self . action . grab_release ( )
def action_menu ( self , action ) :
""" enregistre temporairement l ' action """
self . clean_terrain ( )
# test si l'action est dans la liste des 3 points
if ( ( self . team . posx - 0 ) * * 2 ) + ( ( self . team . posy - self . terrain . height / 2 ) * * 2 ) < = self . terrain . three_points * * 2 or ( ( self . team . posx - self . terrain . width ) * * 2 ) + ( ( self . team . posy - self . terrain . height / 2 ) * * 2 ) < = self . terrain . three_points * * 2 :
score = 2
else :
score = 3
if action == ' marque ' :
self . canvas . create_oval ( self . team . posx - 12 , self . team . posy - 12 , self . team . posx + 12 , self . team . posy + 12 , fill = ' green ' )
else :
self . canvas . create_oval ( self . team . posx - 12 , self . team . posy - 12 , self . team . posx + 12 , self . team . posy + 12 , fill = ' red ' )
if self . temp_data == ' ' :
self . root . title ( self . file + ' * ' )
self . temp_data + = self . team . ac_player + ' ' + action + ' ' + str ( score ) + ' ' + str ( self . team . posx ) + ' ' + str ( self . team . posy ) + ' \n '
def clean_terrain ( self ) :
""" Nettoie le terrain """
items = self . canvas . find_all ( )
while len ( items ) > 4 :
self . canvas . delete ( items [ - 1 ] )
items = self . canvas . find_all ( )
def draw_team ( self , * event ) :
""" dessine les actions de toute l ' équipe """
self . clean_terrain ( )
with open ( self . file , ' r ' ) as f :
for line in f :
# forme type: joueur action points x y
params = line . strip ( ) . split ( ' ' )
if params [ 1 ] == ' marque ' :
self . canvas . create_oval ( int ( params [ 3 ] ) - 12 , int ( params [ 4 ] ) - 12 , int ( params [ 3 ] ) + 12 , int ( params [ 4 ] ) + 12 , fill = ' green ' )
else :
self . canvas . create_oval ( int ( params [ 3 ] ) - 12 , int ( params [ 4 ] ) - 12 , int ( params [ 3 ] ) + 12 , int ( params [ 4 ] ) + 12 , fill = ' red ' )
def draw_player ( self , player ) :
""" dessine les actions d ' un joueur """
self . clean_terrain ( )
with open ( self . file , ' r ' ) as f :
for line in f :
# forme type: joueur action points x y
params = line . strip ( ) . split ( ' ' )
if params [ 0 ] == player : # nom du joueur
if params [ 1 ] == ' marque ' :
self . canvas . create_oval ( int ( params [ 3 ] ) - 12 , int ( params [ 4 ] ) - 12 , int ( params [ 3 ] ) + 12 , int ( params [ 4 ] ) + 12 , fill = ' green ' )
else :
self . canvas . create_oval ( int ( params [ 3 ] ) - 12 , int ( params [ 4 ] ) - 12 , int ( params [ 3 ] ) + 12 , int ( params [ 4 ] ) + 12 , fill = ' red ' )
def draw_terrain ( self ) :
""" dessinne les lignes du terrain """
# ligne des 3 points
self . canvas . create_arc ( - self . terrain . three_points , self . terrain . height / / 2 - self . terrain . three_points , self . terrain . three_points , self . terrain . height - ( self . terrain . height / / 2 - self . terrain . three_points ) , width = 3 , start = 90 , extent = - 180 )
self . canvas . create_arc ( self . terrain . width - self . terrain . three_points , self . terrain . height / / 2 - self . terrain . three_points , self . terrain . width + self . terrain . three_points , self . terrain . height - ( self . terrain . height / / 2 - self . terrain . three_points ) , width = 3 , start = 90 , extent = 180 )
# ligne centrale
self . canvas . create_line ( self . terrain . width / / 2 , 0 , self . terrain . width / / 2 , self . terrain . height , width = 3 )
# cercle du milieu
self . canvas . create_oval ( self . terrain . width / / 2 - self . terrain . middle_circle , self . terrain . height / / 2 - self . terrain . middle_circle , self . terrain . width / / 2 + self . terrain . middle_circle , self . terrain . height / / 2 + self . terrain . middle_circle , width = 3 )
gui = Gui ( )
gui . draw_terrain ( )
gui . root . bind ( " <Button-1> " , gui . context_menu )
gui . root . bind ( " <Control-s> " , gui . save )
gui . root . bind ( " <Control-o> " , gui . browse_open )
gui . root . bind ( " <Control-n> " , gui . new )
gui . root . bind ( " <a> " , gui . draw_team )
gui . root . mainloop ( )