如何编辑在 for 循环中生成的小部件标签文本?
How to edit widget label's text which is generated in a for loop?
我正在尝试购物 basket/cart,其中包含字典中的项目。字典包含项目名称及其价格。下面的代码显示字典中的项目并将数量乘以价格。有 + 和 - 按钮应该修改特定项目的数量,但我的代码有问题,按钮只改变最后一个项目的数量并且不会根据数量改变价格。我希望你能帮助我。谢谢
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 post。基本上,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, 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
我正在尝试购物 basket/cart,其中包含字典中的项目。字典包含项目名称及其价格。下面的代码显示字典中的项目并将数量乘以价格。有 + 和 - 按钮应该修改特定项目的数量,但我的代码有问题,按钮只改变最后一个项目的数量并且不会根据数量改变价格。我希望你能帮助我。谢谢
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 post。基本上,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, 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