首页 > 解决方案 > 我需要助手,一个按钮应该在具有特定行的组合框中工作 4 两种可能性,但仅适用于选项 1

问题描述

I setup a button to work with two possibilities from a combo box so that if Event 1 is chosen it will save to lines 1 to 4 which works fine and saves with no problems but when Event 2 is chosen it should save 5 to 8 but it不能正常工作 5 会将其自身置于更正的行中,但 6 会向下飞行 10 行,我昨天花了添加和删除代码但没有 gold.any 想法?

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)

这就是我所做的,但不确定如何让演出与此一起工作

         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"

标签: pythonpython-3.4tk

解决方案


如果我理解正确(如果),那么您想用team_X变量中的值替换文件中的某些行。你这样做的方式,你将整个文件读入get_all(一个不再连接到文件的列表),然后以r+模式重新打开文件,然后迭代该列表(但不是文件!)直到你得到你的行想要覆盖,然后写入新打开的文件。

这不应该工作,因为新打开的文件仍然在第一行,即使你循环列表。

相反,我建议直接替换列表中的值,并用'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)

您可以通过将要替换的行和相应的团队变量放入列表和列表的字典中,然后压缩和循环这些列表来进一步减少代码重复(特别是如果有更多这样的“事件”):

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)

注意:我没有测试任何这些。


类似地用于从文件中读取团队。(注意:我将 list 和 dict 从方法中移出,因为它总是相同的,这样它可以被阅读和写作团队重用。)

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())

推荐阅读