python-3.x 每次点击复选框时,列表中的数字重复,有附加,我怎样才能避免重复?

y0u0uwnf  于 2023-01-18  发布在  Python
关注(0)|答案(1)|浏览(149)

该函数由复选框调用,函数中有append,取查询sql中的值,加入字典中。
问题是,当我取消选中复选框以及再次选中复选框时,这些值会被添加回字典中,因为append会再次插入这些值,并在每次单击复选框时复制这些值。详细地说,我有一个字典x,我想在其中添加从查询中获取的row[5]score_home
问题发生如下:
如果我单击复选框,函数将启动并打印(score_home=[0, 1, 1, 5])

Minnesota-Dallas:
Info_Matchs(championship='NHL', date=8.1, round=9, clock='15:00', score_home=[0, 1, 1, 5], score_away=[0, 0, 0, 3])
and other matchs...

稍后,如果我取消选中复选框,函数会再次启动,所以我得到了这样的结果:看score_homescore_home=[0, 1, 1, 5, 0, 1, 1, 5]),又添加了一个0,1,1,5:

Minnesota-Dallas:
Info_Matchs(championship='NHL', date=8.1, round=9, clock='15:00', score_home=[0, 1, 1, 5, 0, 1, 1, 5], score_away=[0, 1, 1, 5])
and other matchs...

如果我单击并选中该复选框,就会得到以下结果。再次查看score_homescore_home=[0, 1, 1, 5, 0, 1, 1, 5, 0, 1, 1, 5,]),又添加了一个0、1、1、5

Minnesota-Dallas:
Info_Matchs(championship='NHL', date=8.1, round=9, clock='15:00', `score_home=[0, 1, 1, 5, 0, 1, 1, 5, 0, 1, 1, 5,]`, score_away=[0, 0, 0, 3])
and other matchs...

我只想获取输出:家庭评分=[0,1,1,5]

为了避免添加列表,我尝试使用以下代码,但这不是正确的解决方案,因为我还需要重复相同的数字,例如[0,1,1,5]。相反,我编写了以下代码,得到了[0,1,5],这并不好:

if row[5] not in x[row[0]].score_home:
     x[row[0]].score_home.append(row[5])

我怎样才能避免每次点击复选框时重复列表呢?例如,我会得到这个score_home=[0, 1, 1, 5]。谢谢!

代码完成(包含在复选框随后调用的函数中):

def Button1_func():
    
    @dataclass
    class Info_Match:
        championship: str
        date: float
        round: int
        clock: str
        score_home: list[int]
        score_away: list[int]

    test = {}

    db = cursor_test.execute("sql code")

    for row in db.fetchall():
        if row[0] not in test:
            info = Info_Match(
                    championship=row[1],
                    date=row[2],
                    round=row[3],
                    clock=row[4],
                    score_home=list(),
                    score_away=list())

            test[row[0]] = info

        #PROBLEM IS HERE  
        test[row[0]].score_home.append(row[5])

    print(test)

输出:

Minnesota-Dallas:
Info_Matchs(championship='NHL', date=8.1, round=9, clock='15:00', score_home=[0, 1, 1, 5], score_away=[0, 0, 0, 3])
and other matchs...

更新:添加复选框代码部分

这是复选框的代码。正如@Barmar在聊天中向我指出的那样,也许我的问题出在其他地方,所以我发布了这部分代码。它用于将几个复选框保存在一起,因为在我的项目中,我需要保存这些复选框,以便以后使用if len(datalist) > 0:。详细地说,我需要几个复选框的组合来获得不同的结果。

datalist = []
Checkbutton1 = tk.IntVar()

Button1 = tk.Checkbutton(root, text = "xxx", variable = Checkbutton1, onvalue = 1, offvalue = 0, height = 1,
                         bg="white", foreground='black', activebackground="white", highlightthickness = 0,
                         command=lambda: clicked(Checkbutton1.get(), Button1_func))
Button1.place(x=10, y=30)

def clicked(flag, func):
    if flag:
        datalist.append(func())
    else:
        datalist.remove(func())

感谢愿意回答的人!

ckx4rj1h

ckx4rj1h1#

也许,您可以向Info_Match示例添加一个追加字段,并且仅在该字段为false时追加。

if not test[row[0]].appended:
    test[row[0]].score_home.append(row[5])
    test[row[0]].appended = True

相关问题