微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试制作一个包含字典中物品的购物篮/购物车。词典中包含商品名称及其价格。下面的代码显示字典中的项目,并将数量乘以价格。有 + -按钮应该修改特定商品的数量,但是我的代码有问题,并且按钮仅更改了最后一件商品的数量,而不会更改价格根据数量。我希望你能帮助我。谢谢。

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

解决方法

您将在循环中覆盖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的说明,请参见this帖子。基本上,q qtity_label;但是正在保存的方式以后不会被意外覆盖(有点)。

,

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

其中一种方法是使用functools.partial()将标签的当前引用传递给每个循环中的两个函数:

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,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,command=partial(sub_qty,item,price_lbl))
    sub_qtity_btn.grid(column=4,row=row)
    add_qtity_btn = Button(root,command=partial(add_qty,price_lbl))
    add_qtity_btn.grid(column=6,row=row)
    row += 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。