Configuré un botón para trabajar con dos posibilidades desde un cuadro combinado para que, si se elige el Evento 1, se guardará en las líneas 1 a 4, que funciona bien y se guarda sin problemas, pero cuando se elige el Evento 2, debería guardar de 5 a 8, pero no funciona correctamente, el 5 se colocará en la línea corregida, pero el 6 volará como 10 líneas hacia abajo, pasé ayer agregando y eliminando código pero sin oro. ¿Alguna idea?

def saveteam():
    with open("data/tournamentdatae1.txt",'r') as f:
        get_all=f.readlines()
        event = combo_event.get()
    if event == 'Event 1':
        with open("data/tournamentdatae1.txt",'r+') as f:
            for i,line in enumerate(get_all,1):         
                if i == 1:                 
                    input1 = team_1.get()
                    f.writelines(input1)
                    f.writelines("\n")
            for i,line in enumerate(get_all,1):         
                if i == 2:                 
                    input2 = team_2.get()
                    f.writelines(input2)
                    f.writelines("\n")
            for i,line in enumerate(get_all,1):         
                if i == 3:                 
                    input3 = team_3.get()
                    f.writelines(input3)
                    f.writelines("\n")
            for i,line in enumerate(get_all,1):         
                if i == 4:                 
                    input4 = team_4.get()
                    f.writelines(input4)
                    f.writelines("\n")
    if event == 'Event 2':
        with open("data/tournamentdatae1.txt",'r+') as f:
            for i,line in enumerate(get_all,1):         
                if i == 5:                 
                    input1 = team_1.get()
                    f.writelines(input1)
                    f.writelines("\n")
                else:
                    f.writelines(line)
            for i,line in enumerate(get_all,1):         
                if i == 6:                 
                    input2 = team_2.get()
                    f.writelines(input2)
                    f.writelines("\n")
                else:
                    f.writelines(line)

Esto es lo que hago pero no estoy seguro de cómo hacer que el espectáculo funcione con esto

         if event == 'Event 1':
      if indivcombo == 'Individual 1':
          get_all[20] = individual.get() + "\n"
      if indivcombo == 'Individual 2':
          get_all[21] = individual.get() + "\n"
      if indivcombo == 'Individual 3':
          get_all[22] = individual.get() + "\n"
      if indivcombo == 'Individual 4':
          get_all[23] = individual.get() + "\n"
      if indivcombo == 'Individual 5':
          get_all[24] = individual.get() + "\n"
      if indivcombo == 'Individual 6':
          get_all[25] = individual.get() + "\n"
      if indivcombo == 'Individual 7':
          get_all[26] = individual.get() + "\n"
      if indivcombo == 'Individual 8':
          get_all[27] = individual.get() + "\n"
      if indivcombo == 'Individual 9':
          get_all[28] = individual.get() + "\n"
      if indivcombo == 'Individual 10':
          get_all[29] = individual.get() + "\n"
      if indivcombo == 'Individual 11':
          get_all[30] = individual.get() + "\n"
      if indivcombo == 'Individual 12':
          get_all[31] = individual.get() + "\n"
      if indivcombo == 'Individual 13':
          get_all[32] = individual.get() + "\n"
      if indivcombo == 'Individual 14':
          get_all[33] = individual.get() + "\n"
      if indivcombo == 'Individual 15':
          get_all[34] = individual.get() + "\n"
      if indivcombo == 'Individual 16':
          get_all[35] = individual.get() + "\n"
      if indivcombo == 'Individual 17':
          get_all[36] = individual.get() + "\n"
      if indivcombo == 'Individual 18':
          get_all[37] = individual.get() + "\n"
      if indivcombo == 'Individual 19':
          get_all[38] = individual.get() + "\n"
      if indivcombo == 'Individual 20':
          get_all[39] = individual.get() + "\n"
 if event == 'Event 2':
      if indivcombo == 'Individual 1':
          get_all[40] = individual.get() + "\n"
      if indivcombo == 'Individual 2':
          get_all[41] = individual.get() + "\n"
0
Jack i chan 30 may. 2018 a las 14:35

1 respuesta

La mejor respuesta

Si te entiendo correctamente (grande si), entonces quieres reemplazar ciertas líneas en el archivo con valores de las variables team_X. De la forma en que lo hace, lee el archivo completo en get_all (una lista que ya no está conectada al archivo), luego vuelve a abrir el archivo en modo r+, luego itera esa lista (pero no el archivo!) hasta que obtenga la línea que desea sobrescribir, luego escriba en el archivo recién abierto.

Esto no debería funcionar, ya que el archivo recién abierto todavía está en la primera línea, incluso cuando se repite la lista.

En cambio, sugeriría reemplazar los valores directamente en la lista y sobrescribir todo el archivo con 'w'.

def saveteam():
    filename = "data/tournamentdatae1.txt"
    with open(filename, 'r') as f:
        get_all = f.readlines()

    event = combo_event.get()
    if event == 'Event 1':
        get_all[0] = team_1.get() + "\n"
        get_all[1] = team_2.get() + "\n"
        get_all[2] = team_3.get() + "\n"
        get_all[3] = team_4.get() + "\n"

    if event == 'Event 2':    
        get_all[4] = team_1.get() + "\n"
        get_all[5] = team_2.get() + "\n"
        get_all[6] = team_3.get() + "\n"
        get_all[7] = team_4.get() + "\n"            

    with open(filename, 'w') as f:
        for line in get_all:
            f.write(line)

Puede reducir aún más la duplicación de código (particularmente si hay más "eventos" como estos) colocando las líneas para reemplazar y las variables de equipo correspondientes en una lista y un dict de listas, y luego comprimir y hacer un bucle de esas listas:

def saveteam():
    filename = "data/tournamentdatae1.txt"
    with open(filename, 'r') as f:
        get_all = f.readlines()

    team_vars = [team_1, team_2, team_3, team_4]    
    lines = {"Event 1": [0, 1, 2, 3], "Event 2": [4, 5, 6, 7]}

    event = combo_event.get()
    for team, line in zip(team_vars, lines.get(event, [])):
        get_all[line] = team.get() + "\n"

    with open(filename, 'w') as f:
        for line in get_all:
            f.write(line)

Nota: no probé nada de esto.


Análogamente para leer equipos de archivo. (Nota: moví la lista y eliminé el método, ya que siempre es el mismo y de esta manera puede reutilizarse para los equipos de lectura y escritura).

team_vars = [team_1, team_2, team_3, team_4]    
lines = {"Event 1": [0, 1, 2, 3], "Event 2": [4, 5, 6, 7]}
filename = "data/tournamentdatae1.txt"

def showteam():
    with open(filename, 'r') as f:
        get_all = f.readlines()

    event = combo_event.get()
    for team, line in zip(team_vars, lines.get(event, [])):
        team.set(get_all[line].strip())
0
tobias_k 30 may. 2018 a las 14:26