[Python] Strano errore.

Gabriele Battaglia iz4apu a libero.it
Mer 11 Nov 2020 14:36:43 CET


Reply to the Marco Beri's message, wrote on 11/11/2020 at 14:26:
> On Wed, 11 Nov 2020 at 14:16, Gabriele Battaglia <iz4apu a libero.it 
> <mailto:iz4apu a libero.it>> wrote:
> 
>     Marco, grazie per la risposta.
>     So che la mia prossima affermazione farà ribrezzo ma.... non so usare
>     pastebin.
>     Se ti mando in privato il semplice .py, che non ha dipendenze e non fa
>     nulla di pericoloso, giuro, :) andrebbe bene lo stesso?
> 
> 
> Gabriele,
> se non è roba riservata e non sono 10 mega puoi anche mandarla qui :-)
> 
> Come preferisci.
> 
Ma figurati, quale privata!
Vorrebbe essere una piccola utility per la gestione della squadra 
giovanile del browser game www.hattrick.org
Una cosa semplicissima e ancora appena abbozzata.
La allego.

-------------- parte successiva --------------
'''
IFM - I Fiua ad Magnavaca
Gestionale per la mia squadra giovanile di Hattrick
Data concepimento: giovedì 22 ottobre 2020.
'''

import pickle, datetime
from GBUtils import gbput

#Costanti
VER = "0.5.1 del 11 novembre 2020."
DT = datetime.date
MESI=['gennaio','febbraio','marzo','aprile','maggio','giugno','luglio','agosto','settembre','ottobre','novembre','dicembre']
GIORNI=['lunedì','martedì','mercoledì','giovedì','venerdì','sabato','domenica']
RUOLI = ['portiere', 'difensore', 'terzino', 'centrocampista', 'ala', 'attaccante', 'sconosciuto']
SPECIALITA = ['colpo di testa', 'veloce', 'potente', 'tecnico', 'imprevedibile', 'coriaceo', 'trascinatore', 'nessuna']
PARAMETRIINIZIALI = [
                 [15,0], # 0. lst età [anni,gg]
                 DT.today(), # 1.data assunto in squadra
                 "No", # 2. str specialità
                 0, # 3. int parate ora
                 0, # 4. int parate potenziale
                 0, # 5. difesa
                 0, # 6. dif pot
                 0, # 7. regia
                 0, # 8. reg pot
                 0, # 9. cross
                 0, # 10. cross pot
                 0, # 11. pass
                 0, # 12. pass pot
                 0, # 13. attacco
                 0, # 14 att pot
                 0, # 15. piazzati
                 0, # 16. piaz pot
                 0, # 17. migl.par
                 0, # 18. migl.DC
                 0, # 19. migl.Terz
                 0, # 20. migl.CC
                 0, # 21. migl.ala
                 0, # 22. migl.att
                 DT.today(1974,9,13), # 23. date ultima partita giocata
                 "sconosciuto", # 24. str ultimo ruolo giocato
                 90, # 25. int minuti giocati
                 "Lo scout dice: Nessun commento inserito", # 26. str commento scout
                 0, # 27. int numero maglia
                 [], # 28. lst Ruoli inutili
                 [], # 29. lst posizioni papabili
                 False, # 30. bool carisma interessante
                 0, # 31. int RC ricevuto complimento allenatore
                 0, # 32. int Ricevuto Rimbrotto allenatore
                 0, # 33. int UP uomo partita
                 0, # 34. int PP pippa della partita
                 False, # 35. bool DL da licenziare
                 False, # 36. bool DP da promuovere
                 [], # 37. lst nota allenatore
                 [], # 38. lst note personali
                 False, # 39 bool disonesto
                 0, # 40 int infortunato settimane
                 0, # 41 unk parametro di riserva per future implementazioni
                 0, # 42 unk parametro di riserva per future implementazioni
                 0, # 43 unk parametro di riserva per future implementazioni
                 0, # 44 unk parametro di riserva per future implementazioni
                 0, # 45 unk parametro di riserva per future implementazioni
                 0, # 46 unk parametro di riserva per future implementazioni
                 0, # 47 unk parametro di riserva per future implementazioni
                ] 
MENuLISTA = [
             " - ( M ) - questo Menù;",
             " - ( A ) - Aggiungi;",
             " - ( EU) - Elimina Ultimo;",
             " - ( EP) - Elimina Primo;",
             " - (ETR) - Elimina Tramite Ricerca;",
             " - ( CT) - Cancella Tutto;",
             " - INVIO - Esci senza modificare nulla."
            ] 
MENUGIOCATORE = [
              "- (ETA) - Età espressa in anni e giorni;"
              "- (DAS) - Data di Assunzione in Squadra;"
              "- (SPE) - Specialità;"
              "- ( p ) - Parate attuali, - ( P ) - Parate Max;"
              "- ( d ) - Difesa attuale, - ( D ) - Difesa Max;"
              "- ( r ) - Regia attuale, - ( R ) - Regia Max;"
              "- ( c ) - Cross attuale, - ( C ) - Cross Max;"
              "- ( s ) - Passaggi attuali, - ( S ) - Passaggi Max;"
              "- ( a ) - Attacco attuale, - ( A ) - Attacco Max;"
              "- ( z ) - C.Piazzati attuali, - ( Z ) - C.Piazzati Max;"
              "- (MVP) - Massima Valutazione in Parate;"
              "- (MVD) - Massima Valutazione in Difesa;"
              "- (MVT) - Massima Valutazione come Terzino;"
              "- (MVR) - Massima Valutazione come Regista;"
              "- (MVL) - Massima Valutazione come aLa;"
              "- (MVA) - Massima Valutazione in Attacco;"
              "- (DUP) - Data Ultima Partita giocata;"
              "- (URG) - Ultimo Ruolo Giocato;"
              "- (MUP) - Minuti giocati nell'Ultima Partita;"
              "- (CDS) - Commento Dello Scout;"
              "- ( NM) - Numero Maglia;"
              "- ( RI) - Ruoli Inutili;"
              "- ( RP) - Ruoli Papabili;"
              "- ( CI) - Carisma Interessante;"
              "- ( RC) - Ricevuto complimento Allenatore;"
              "- ( RR) - Ricevuto Rimbrotto Allenatore;"
              "- ( UP) - Uomo partita;"
              "- ( PP) - Pippa della Partita;"
              "- ( DL) - Da Licenziare;"
              "- ( DP) - Da Promuovere;"
              "- ( NA) - Note Allenatore;"
              "- ( NP) - Note Personali;"
              "- ( PD) - Personalità Disonesta;"
              "- ( I ) - Infortunato;"
           ] 

MENUPRINCIPALE = ["- (MEN) - Visualizza questo MENù;", \
            "- ( E ) - Elimina un giocatore dal DB;", \
            "- ( L ) - Lista di tutti i giocatori", \
            "- Parte del nome o cognome - Entra nella scheda giocatore", \
            "- INVIO - Esce dal programma."]

#Variabili
ifm = {}

#quif
def Mostradata(d):
  '''Riceve un oggetto data e ritorna una stringa formattata.'''
  anno, mese, giorno = ifm[s][i].year, ifm[s][i].month, ifm[s][i].day
  giornods = ifm[s][i].weekday
  return(f"{GIORNI[giornods-1]} {giorno} {MESI[mese-1]}, {anno}")

def VLista(l, filtro=""):
  '''Visualizzatore di liste
  Riceve la lista e il filtro'''
  for j in l:
    if filtro != "":
      if filtro.lower() in str(j).lower(): print(j)
    else: print(j)
  return

def SalvaDB():
  f = open("IFM.db","wb")
  pickle.dump(ifm, f, protocol=-1)
  f.close()
  return

def EInSquadra(s):
  '''torna Nome Cognome se s è contenuta nel nome o cognome dei presenti in squadra
  Altrimenti torna vuoto'''
  for j in ifm.keys():
    if s in j.lower(): return(j)
  return ""

def Aggiungilo(s):
  '''Riceve il nomecognome giocatore e lo aggiunge'''
  ifm[s] = PARAMETRIINIZIALI
  print(f"Totale giocatori in squadra {len(ifm)}, giocatore {s} aggiunto.")
  return

def Modificalo(s):
  '''Riceve chiave giocatore e consente la modifica di ogni suo parametro'''
  print(f"Menù di {s}\n- Digita M per la lista parametri, invio per uscire.")
  s1, s2 = s.split(" ")
  prompt = s1 + " " + s2[0]
  while True:
    key = gbput(prompt, smax = 12)
    keyl = key.lower()
    if keyl == "m": VLista(MENUGIOCATORE)
    elif keyl == "": break
    elif keyl == "eta":
      print("Modifica età:")
      ifm[s][0][0] = gbput("Anni: ", "i", imin=15, imax=17)
      ifm[s][0][1] = gbput("Giorni: ", "i", imin=0, imax=111)
      print("Fatto!")
    elif keyl == "das":
      print("Modifica la data in cui il giocatore è stato assunto in squadra")
      Impostaparametro(1, "d")
    elif keyl == "spe":
      print("Assegna una specialità al giocatore")
      while True:
        key0 = gbput("Quale? ", smax=10)
        if key0.lower() in SPECIALITA: break
      else:
        print("Riprova.")
        VLista(SPECIALITA)
      for j in SPECIALITA:
        if key0.lower() in j: break
      ifm[s][2] = j
      print(f"Assegnata la specialità [j] al giocatore [s].")
    elif key == "p": Impostaparametro(3, "i")
    elif key == "P": Impostaparametro(4, "i")
    elif key == "d": Impostaparametro(5, "i")
    elif key == "D": Impostaparametro(6, "i")
    elif key == "r": Impostaparametro(7, "i")
    elif key == "R": Impostaparametro(8, "i")
    elif key == "c": Impostaparametro(9, "i")
    elif key == "C": Impostaparametro(10, "i")
    elif key == "s": Impostaparametro(11, "i")
    elif key == "S": Impostaparametro(12, "i")
    elif key == "a": Impostaparametro(13, "i")
    elif key == "A": Impostaparametro(14, "i")
    elif key == "z": Impostaparametro(15, "i")
    elif key == "Z": Impostaparametro(16, "i")
    elif keyl == "mvp":
      print("Miglior valutazione in parate.\nStelle: ",end="")
      Impostaparametro(17, "i")
    elif keyl == "mvd":
      print("Miglior valutazione in difesa\nStelle: ",end="")
      Impostaparametro(18, "i")
    elif keyl == "mvt":
      print("Miglior valutazione come terzino\nStelle: ",end="")
      Impostaparametro(19, "i")
    elif keyl == "mvr":
      print("Miglior valutazione come regista\nStelle: ",end="")
      Impostaparametro(20, "i")
    elif keyl == "mvl":
      print("Miglior valutazione come ala\nStelle: ",end="")
      Impostaparametro(21, "i")
    elif keyl == "mva":
      print("Miglior valutazione in attacco\nStelle: ",end="")
      Impostaparametro(22, "i")
    elif keyl == "dup":
      print("Specifica la data dell'ultima partita giocata: ",end="")
      Impostaparametro(23, "d")
    elif keyl == "urg":
      print("Registra l'ultimo ruolo in cui ha giocato")
      while True:
        key0 = gbput("Quale? ", smax=10)
        if key0.lower() in RUOLI: break
      else:
        print("Riprova.")
        VLista(RUOLI)
      for j in RUOLI:
        if key0.lower() in j: break
      ifm[s][24] = j
      print(f"Ultimo ruolo {j}, per {s}.")
    if keyl == "mup":
      ifm[25] = gbput("Minuti giocati nell'ultima partita: ", "i", imin = 1, imax = 90)
    if keyl == "cds":
      ifm[26] = gbput("Cos'ha detto lo scout di questo giovane? ", smax=500)
    if keyl == "nm":
      ifm[27] = gbput("Numero maglia? ", "i", imin=0, imax=100)
    if keyl == "ri":
      print("Aggiungi un ruolo inutile per il giocatore.")
      Impostaparametro(28, "l")
    if keyl == "rp":
      print("Aggiungi un ruolo utile per il giocatore.")
      Impostaparametro(29, "l")
    if keyl == "ci":
      print("Metti una bandierina su Carisma Interessante.")
      Impostaparametro(30, "b")
    if keyl == "rc":
      print("Aumenta di 1 il contatore dei complimenti ricevuti.")
      ifm[31] += 1
      print(f"{s} ha ricevuto per {ifm[s][31]} volte, i complimenti dell'allenatore.")
    if keyl == "rr":
      print("Aumenta di 1 il contatore dei rimbrotti ricevuti.")
      ifm[32] += 1
      print(f"{s} ha ricevuto per {ifm[s][32]} volte, i rimbrotti dell'allenatore.")
    if keyl == "up":
      print("Aumenta di 1 il contatore Uomo Partita")
      ifm[33] += 1
      print(f"{s} stato Uomo partita {ifm[s][33]} volte")
    if keyl == "pp":
      print("Aumenta di 1 il contatore Pippa della Partita.")
      ifm[34] += 1
      print(f"{s} stato per {ifm[s][34]} volte, Pippa della Partita.")
    if keyl == "dl":
      print("Metti la bandierina sullo stato: Da Licenziare.")
      Impostaparametro(35, "b")
    if keyl == "dp":
      print("Metti la bandierina sullo stato: Da Promuovere.")
      Impostaparametro(36, "b")
    if keyl == "na":
      print("Aggiungi nota Allenatore:")
      Impostaparametro(37, "l")
    if keyl == "np":
      print("Aggiungi nota Personale:")
      Impostaparametro(38, "l")
    if keyl == "pd":
      print("Metti la bandierina sullo stato: Personalità Disonesta.")
      Impostaparametro(39, "b")
    if keyl == "i":
      ifm[40] = gbput("Settimane d'infortunio? ", "i", imin=0, imax=16)
  return

def Impostaparametro(s, i, t):
  ''' Routine per impostare parametri ricorrenti del giocatore
  riceve s=chiave giocatore, i=indice del parametro da impostare e t= tipo di dato da impostare
  non restituisce nulla perchè modifica direttamente il global ifm'''
  if t == "b":
    if ifm[s][i]:
      ifm[s][i] = False
      print("Bandierina abbassata!")
    else:
      ifm[s][i] = True
      print("Bandierina alzata!")
  elif t == "i":
    ifm[s][i] = gbput("Nuovo valore? ", "i")
    print("Valore impostato a: ", ifm[s][i])
  elif t == "l":
    print(f"La lista contiene {len(ifm[s][i]) commenti. Gestione lista:\n- M per il menù, invio a vuoto per uscire.")
    while True:
      key = gbput("Comando Lista: >", smax=3)
      key = key.lower()
      if key == "m": VLista(MENuLISTA)
      elif key == "": break
      elif key == "a": ifm[s][i].append(gbput("Nota? ", smax=500)); break
      elif key == "ct":
        ifm[s][i].clear()
        print("Tutte le note sono state cancellate.")
        break
      elif key == "ep":
        ifm[s][i].pop(0)
        break
      elif key == "eu":
        ifm[s][i].pop()
        break
      elif key == "etr":
        etr = gbput("Inserisci la parola chiave appartenente all'elemento da eliminare: ", smax=16)
        for j in ifm[s][i]:
          if etr.lower() in j.lower(): break
        key1 = gbput(f"Trovato '{j}', elimino? S = Sì: ", smax=1)
        if key1.lower() == "s": ifm[s][i].remove(j); break
        else: break
  elif t == "d":
    print(f"La data salvata è: {Mostradata(ifm[s][i])}.")
    while True:
      nuovadata = gbput("Nuova data nel formato aaaa.mm.gg: > ", smax=10)
      if nuovadata == "":
        return
      elif nuovadata.count(".") == 2:
        anno, mese, giorno = nuovadata.split(".")
        break
      elif nuovadata.count(".") == 1:
        anno = ifm[s][i].year
        mese, giorno = nuovadata.split(".")
        break
      elif nuovadata.count(".") == 0:
        anno = ifm[s][i].year
        mese = ifm[s][i].month
        giorno = nuovadata
        break
      else: print("Formato non corretto.")
    if not anno.isdigit() or not mese.isdigit() or not giorno.isdigit():
      print("Inserire solo valori numerici.")
      return
    ifm[s][i] = DT(anno, mese, giorno)
  else: print("Errrore di chiamata")
  return

#main
print("IFM - Gestionale della mia squadra giovanile di Hattrick\n\t\t- Versione: " + VER +"\n")

try:
  print("Caricamento database...", end=" ")
  f = open("IFM.db","rb")
  ifm = pickle.load(f)
  f.close()
  print("fatto.")
except IOError:
  print("non trovato. Creazione db in corso... ",end="")
  SalvaDB()
  print("fatto.")

print("Digita MEN per accedere al menù principale dell'App.")

while True:
  s = gbput("Dimmi: >", smax=36).lower()
  if s == "": break
  if s == "men": VLista(MAINMENU)
  if s == "l": Listagiocatori()
  if s == "e": Eliminagiocatore()
  if len(s) > 3:
    g = EInSquadra(s)
    if g != "": Mostralo(g)
    elif " " in s[1:][:-1]:
      s = s.title()
      Aggiungilo(s)
      Modificalo(s)
    else: print(f"Comando {s} non riconosciuto")

SalvaDB()
print("Arrivederci da IFM versione: " + VER)


Maggiori informazioni sulla lista Python