【问题标题】:Extract a database field via 2 combined comboboxes. Problem in the function for extracting通过 2 个组合组合框提取数据库字段。提取函数中的问题
【发布时间】:2021-11-28 13:18:59
【问题描述】:

通过选择两个组合框(结合绑定),我想从 Table1 中提取一个字段的 ID 并将其插入到 Table2 中。我根据组合框提取字段没有问题,但我在提取基于 2 个组合框的字段时遇到问题,因为它们是相互组合的。问题只是 def id_rounds() 函数。

我有两个组合框:一个是我选择“锦标赛”的名称,另一个是我选择回合数(每个锦标赛从 1 到 38 个不同的回合)。要选择锦标赛 ID 必须匹配的锦标赛,我使用组合框 combo_Tournaments 和函数 def combo_tournaments;而要选择回合数,我使用组合框 combo_Rounds 和 combo_rounds 函数。通过选择锦标赛和/或回合,也会自动输入相关 ID(以及实际数据)。因此,每个组合框各放入 2 个东西,总共 4 个。

这是数据库:

CREATE TABLE "All_Tournament" (
    "ID_Tournament" INTEGER,
    "Tournament" TEXT,
    PRIMARY KEY("Tournament" AUTOINCREMENT)
);

    CREATE TABLE "All_Round" (
        "ID_Round"  INTEGER,
        "Number_Round"  INTEGER,
        "ID_Tournament" INTEGER,
        PRIMARY KEY("ID_Round" AUTOINCREMENT),
    );

问题: 目前,当我编写函数 def id_rounds() 的代码时,所选回合的 ID 已保存,但与所选锦标赛没有完全对应在锦标赛组合框中。问题是每个锦标赛都由 38 个不同的回合组成,因此在 All_Round 表中,从 1 到 38 的数字重复了多次,每个都对应于锦标赛 ID。比如意甲1到38轮;乙级联赛从 1 轮到 38 轮;英超联赛从 1 轮到 38 轮。所以我想输入锦标赛对应的单轮ID(相对于锦标赛),因为每个锦标赛都有1到38轮,所以每个锦标赛有很多不同的“1到38轮”。

#Combobox Tournament
lbl_Tournament = Label(root, text="Tournament", font=("Calibri", 11), bg="#E95420", fg="white")
lbl_Tournament.place(x=6, y=60)
combo_Tournaments = ttk.Combobox(root, font=("Calibri", 11), width=30, textvariable=campionato, state="readonly")
combo_Tournaments.place(x=180, y=60)
combo_Tournaments.set("Select")
combo_Tournaments['values'] = combo_tournaments()
combo_Tournaments.bind('<<ComboboxSelected>>', combo_teams)

lbl_Rounds = Label(root, text="Rounds", font=("Calibri", 11), bg="#E95420", fg="white")
lbl_Rounds.place(x=600, y=60)
combo_Rounds = ttk.Combobox(root, font=("Calibri", 11), width=30, textvariable=rounds,  state="readonly") 
combo_Rounds.place(x=680, y=60)
combo_Rounds.set("Select")
combo_Rounds['values'] = combo_campionati()
combo_Tournaments.bind('<<ComboboxSelected>>', combo_rounds, add=True)


def combo_tournaments():
    tournaments = combo_tournaments.get()
    cursor.execute('SELECT Tournament FROM All_Tournament')
    result=[row[0] for row in cursor]
    return result

def id_tournaments():
    tournaments = combo_tournaments.get()
    cursor.execute('SELECT ID_Tournament FROM All_Tournament WHERE Tournament=?',(tournaments,))
    result=[row[0] for row in cursor]
    return result[0]

def combo_rounds(event=None):
    rounds = combo_rounds.get()        
    cursor.execute('SELECT Number_Round From All_Round WHERE ID_Tournament')
    result=[row[0] for row in cursor]
    combo_Rounds['value'] = result
    return result

#THE PROBLEM IS HERE 
def id_rounds():
    rounds = combo_rounds.get()    
    cursor.execute('SELECT ID_Round FROM All_Round WHERE Number_Round=? AND Tournament=?',(rounds, tournaments))
    result=[row[0] for row in cursor]
    return result[0]

def combo_teams(event=None):
    tournaments = combo_tournaments.get()
    cursor.execute('SELECT s.Name_Teams FROM All_Teams s, All_Tournament c WHERE s.ID_Tournament=c.ID_Tournament AND c.Tournament = ?', (tournaments,))
    result=[row[0] for row in cursor]
    combo_Teams_1['values'] = result
    combo_Teams_2['values'] = result
    return result

我想获得什么? 所以我想获得例如:如果从锦标赛组合框中选择 Serie A,然后选择第 1 轮,则在结果表中第 1 轮的 ID应输入但对应于 Serie A。或者,另一个示例,如果从 Tournament 组合框中选择 Serie B,然后选择 Round 1,则第 1 轮的 ID 应输入到 Results 表中但对应于 Serie B。

问题:如何修复函数 def id_rounds 并在对应(相关)锦标赛中插入回合数?目前我只在组合框中输入所选回合的ID,而不匹配锦标赛组合框中选择的冠军。

【问题讨论】:

  • 第一个 id_tournament 应该是自动增量而不是锦标赛。第二:在 id_rounds 你没有参加比赛。第三,你应该从你加入 id_tournament 的回合和锦标赛表中选择
  • 这个问题好像和tkinter没什么关系。被问到的问题似乎更多是关于如何在 sqlite 中使用外键和/或连接。
  • 我不明白ID_RoundNumber_Round 有什么区别?
  • @acw1668 ID_Round 是记录的经典 ID。 Number_Round 将是 1、2、3、4 到 38。对于 Number_Round,所以说 Round,我指的是几周,考虑到每周有一轮。你能帮帮我吗?
  • @BryanOakley 没错,你是对的。但我输入 tkinter 是因为我将它用于应用程序,例如用于 2 个组合框。为了问题的完整性,我插入了 tkinter 标签,即使如你所说,你无事可做。无论如何,你能帮帮我吗?前几天你很友善:你也回答了一个类似的问题,所以我假设你理解这个问题。谢谢

标签: python sql python-3.x sqlite tkinter


【解决方案1】:

以下是根据我的理解修改后的代码:

def combo_tournaments():
    cursor.execute('SELECT Tournament FROM All_Tournament')
    result=[row[0] for row in cursor]
    return result

def combo_rounds(event=None):
    # get all Number_Round for selected tournament
    cursor.execute('''
        SELECT Number_Round From All_Round r, All_Tournament t
        WHERE r.ID_Tournament = t.ID_Tournament AND Tournament = ?''', (campionato.get(),))
    result=[row[0] for row in cursor]
    combo_Rounds['value'] = result  # update combo_Rounds
    rounds.set('Select') # reset Rounds selection
    return result

def id_rounds(event=None):
    # get the ID_Round based on selected tournament and Number_Round
    cursor.execute('''
        SELECT ID_Round FROM All_Round r, All_Tournament t
        WHERE r.ID_Tournament = t.ID_Tournament AND Number_Round = ? AND Tournament = ?''',
        (rounds.get(), campionato.get()))
    result = cursor.fetchone()
    if result:
        print(result[0])
        return result[0]
    return None

...

campionato = StringVar()
rounds = StringVar()

#Combobox Tournament
lbl_Tournament = Label(root, text="Tournament", font=("Calibri", 11), bg="#E95420", fg="white")
lbl_Tournament.place(x=6, y=60)
combo_Tournaments = ttk.Combobox(root, font=("Calibri", 11), width=30, textvariable=campionato, state="readonly")
combo_Tournaments.place(x=180, y=60)
combo_Tournaments.set("Select")
combo_Tournaments['values'] = combo_tournaments()
combo_Tournaments.bind('<<ComboboxSelected>>', combo_rounds)

lbl_Rounds = Label(root, text="Rounds", font=("Calibri", 11), bg="#E95420", fg="white")
lbl_Rounds.place(x=600, y=60)
combo_Rounds = ttk.Combobox(root, font=("Calibri", 11), width=30, textvariable=rounds,  state="readonly")
combo_Rounds.place(x=680, y=60)
combo_Rounds.set("Select")
combo_Rounds.bind('<<ComboboxSelected>>', id_rounds)
...

请注意,我使用campionatorounds (StringVar) 来获得选定的锦标赛和Number_Round

【讨论】:

  • 非常感谢你。我会试试看,如果没问题我会在稍后告诉你。同时,出于对所有发表评论的人的尊重,我们也等待他们的尊重。如果阅读的人想要添加一些东西(评论或回答,请继续)。同时,再次感谢您
  • 一切正常。谢谢。现在提取并保存 ID_ROUNDS。谢谢。combo_Tournaments.bind 和 combo_Rounds.bind 有一个小问题。我写的它们有点不同,例如有还有 combo_teams 这将是选择要包含在每轮比赛中的球队的组合框。我现在很累。我明天看得很清楚(因为有周末,最多后天)所以我会更好地解释我的怀疑。但是,我会投票给你作为最佳答案,因为你已经解决了 95% 的问题。谢谢 :) 后天见
  • 再次感谢您的回答,我想问您 3 个简单的问题: 1. 在 combo_Tournaments.bind 中您删除了我的 combo_teams(用于选择与联赛相关的球队)。所以我需要 2 件东西在里面:combo_rounds 和 combo_teams。你这样做是为了把 2 加在一起吗?('>',combo_rounds,combo_teams)? 2、def id_rounds里面调用的sql方法是什么?我想更好地研究它。 3. 如果All_Round 表中没有ID_Tournament,是否必须使用INNER JOIN 连接All_Tournament 的ID_Tournament?谢谢
  • 您的问题是询问如何根据所选的TournamentNumber_Round 获取ID_Round,所以我的回答只会显示解决问题所需的更改,我认为确实如此。
  • 你说得对,原谅我。请告诉我一件事:如果我在 cursor.execute 中使用 JOIN (INNER?) 编写 SQL 代码,会不会是同样的事情?它还能正常工作吗?我投票赞成你的答案。万分感谢。你很善良
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多