如何编辑在for循环中生成的小部件标签文本?

2024-10-04 01:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个购物篮/购物车,里面有字典里的东西。字典包含商品名称及其价格。下面的代码显示字典中的项目,并将数量乘以价格。有+-按钮可以修改特定项目的数量,但我的代码有问题,按钮只更改最后一个项目的数量,不会根据数量更改价格。我希望你能帮助我。谢谢

from tkinter import *

def add_qty():
    qty = qtity_label.cget('text')
    qty += 1
    qtity_label.config(text=qty)
    print(qty)


def sub_qty():
    qty = qtity_label.cget('text')
    qty -= 1
    qtity_label.config(text=qty)
    print(qty)

root = Tk()
shopping_basket = {'nerf': 25.00,
                   'lego': 10.00,
                   'ball': 5.00}
row = 0
for item in shopping_basket:
    item_name_lbl = Label(root, text=item)
    item_name_lbl.grid(column=0, row=row)
    qtity_label = Label(root, text=2)
    qtity_label.grid(column=5, row=row)
    price_lbl = Label(root, text=qtity_label.cget('text')*shopping_basket[item])
    price_lbl.grid(column=9, row=row)
    sub_qtity_btn = Button(root, text='-', command=sub_qty)
    sub_qtity_btn.grid(column=4, row=row)
    add_qtity_btn = Button(root, text='+', command=add_qty)
    add_qtity_btn.grid(column=6, row=row)
    row += 1

root.mainloop()

Tags: textadd数量字典column价格rootitem
2条回答

由于在for循环中使用了相同的名称集,因此在for循环之后,名称集指向最后的赋值

其中一种方法是使用^{}将标签的当前引用传递给每个循环中的两个函数:

from functools import partial

def add_qty(item, qtity_label, price_lbl):
    qty = qtity_label.cget('text')
    qty += 1
    qtity_label.config(text=qty)
    price_lbl.config(text=shopping_basket[item]*qty)
    print(qty)


def sub_qty(item, qtity_label, price_lbl):
    qty = qtity_label.cget('text')
    qty -= 1
    qtity_label.config(text=qty)
    price_lbl.config(text=shopping_basket[item]*qty)
    print(qty)

...

for item in shopping_basket:
    item_name_lbl = Label(root, text=item)
    item_name_lbl.grid(column=0, row=row)
    qtity_label = Label(root, text=2)
    qtity_label.grid(column=5, row=row)
    price_lbl = Label(root, text=qtity_label.cget('text')*shopping_basket[item])
    price_lbl.grid(column=9, row=row)
    sub_qtity_btn = Button(root, text='-', command=partial(sub_qty, item, qtity_label, price_lbl))
    sub_qtity_btn.grid(column=4, row=row)
    add_qtity_btn = Button(root, text='+', command=partial(add_qty, item, qtity_label, price_lbl))
    add_qtity_btn.grid(column=6, row=row)
    row += 1

您正在覆盖循环中的qtity_label,因此它将是您最后设置的内容。当add_qty运行时,它只看到qtity_label的最后一个值,因此它会更新

您需要单独保存所有标签,或将它们传递到command函数中,并使用传入的标签而不是全局标签:

def add_qty(label):  # Note how the label is being passed-in
    qty = label.cget('text')  # And then the passed-in label is used
    qty += 1
    label.config(text=qty)
    print(qty)


def sub_qty(label):
    qty = label.cget('text')
    qty -= 1
    label.config(text=qty)
    print(qty)

然后:

sub_qtity_btn = Button(root, text='-', command=lambda q=qtity_label: sub_qty(q))
. . .
add_qtity_btn = Button(root, text='+', command=lambda q=qtity_label: add_qty(q))

有关为什么需要q=qtity_label的解释,请参阅thispost。基本上,qqtity_label;但是被保存的方式是以后不会被意外覆盖的(有点)

相关问题 更多 >