如何在 for 循环中创建具有整数值的 Checkbuttons?
Posted
技术标签:
【中文标题】如何在 for 循环中创建具有整数值的 Checkbuttons?【英文标题】:How to create Checkbuttons with Integer value in for loop? 【发布时间】:2022-01-14 19:07:43 【问题描述】:我正在为我的大学班级创建一个项目。我正在用披萨餐厅的 python tkinter 创建一个 gui。我创建了 5 个检查按钮,显示 5 个不同的比萨饼,每个比萨饼的价格不同。我创建了一个计算按钮。如何为计算按钮创建一个函数,以根据选择的内容显示每个比萨饼的价格?如果选择了多个,它会说'意大利辣香肠价格是:$','奶酪价格是:$',......等等?如何在 for 循环中为每个披萨赋予不同的 onvalue? 代码在这里:
from tkinter import *
root = Tk()
root.title('Pizza Restaurant')
root.geometry('500x500')
pizza = [['cheese',5], ['pepperoni',10], ['sausage',15], ['BBQ',20], ['hawaiian',25]]
var_list = ['pizza1', 'pizza2', 'pizza3', 'pizza4', 'pizza5']
for i in range(5):
button = Checkbutton(root, text=pizza[i][0], variable=var_list[i], onvalue=pizza[i][1], offvalue=0).grid(row=i, column=0)
var_list[i] = IntVar()
def calc():
for var in var_list:
if var.get() != 0:
label = Label(root, text=var.get()).grid(row=2, column=8)
'''for e in range(5):
button_list.append(Checkbutton(root, text=pizza[e][0], variable=var_list[e], onvalue=pizza[e][1],))
labels.append(Label(root, text=pizza[e][1]))
button_list[e].grid(row=e, column=0, sticky=W)
labels[e].grid(column=1, row=e)
total = 0
def calc():
for i in range(5):
if i == pizza[i][1]:
label = Label(root, text=pizza[i][1]).grid(row=1, column=10)
'''
【问题讨论】:
你需要在button = Checkbutton(...).grid(...)
之前移动var_list[i] = IntVar()
。而button
是None
,因为它是grid(...)
的结果,而不是Checkbutton(...)
。在 for 循环中分配给同一个变量也是没有意义的。
当只有一个披萨被点击时,我让它输出每个披萨的价值(价格)。如果点击多个,我会怎么做,显示每个的唯一价格?
因为你把价格标签放在了同一个位置。您应该先构建价目表,然后使用价目表创建标签。建议创建一次标签并在calc()
内更新。
【参考方案1】:
这样的事情对你有什么作用
from tkinter import *
def calc():
priceList = ""
for pizza,var in zip(pizzas,var_list):
if var.get() != 0:
priceList += ("0 costs $1\n".format(pizza[0],pizza[1]))
priceStr.set(priceList)
root = Tk()
root.title('Pizza Restaurant')
root.geometry('500x500')
pizzas = [['cheese',5], ['pepperoni',10], ['sausage',15], ['BBQ',20], ['hawaiian',25]]
var_list = [IntVar(root) for _ in pizzas]
for i,(pizza,var) in enumerate(zip(pizzas,var_list)):
button = Checkbutton(root, text=pizza[0], variable=var, onvalue=pizza[1], offvalue=0, command=calc).grid(row=i, column=0)
priceStr = StringVar(root)
priceLabel = Label(root,textvariable=priceStr)
priceLabel.grid(row=len(pizzas)+1,column=0)
root.mainloop()
当您单击每个复选框时,它将运行 calc 函数来填充出现在复选框下方的标签。我使用enumerate
而不是 range 来遍历比萨饼列表中的每个项目,同时仍然获得可用于设置行号的索引。
还使用zip
,这样我就可以同时遍历比萨饼和var_list。
calc 函数与您自己的函数并没有太大的不同,它只是在选中披萨复选框时向字符串添加一个新部分。
【讨论】:
谢谢,帮了大忙!你如何在标签中显示函数的输出?我看到你有 priceStr.set(priceList) 然后制作标签,将文本输出为 priceStr 变量? priceStr.set(priceList) 到底在做什么? 要在 tkinter 中设置文本,您可以直接设置标签的值,也可以使用 StringVar。通过执行 priceStr.set,我正在更改 priceStr 中的文本。更改时,链接到该 StringVar 的任何其他 tkinter 小部件都会自动更改。 好吧,有道理!还有一个问题.. var_list 中发生了什么?我理解您将其声明为整数变量的第一部分,但我相信 for_in 比萨饼在做什么? @Isaiah 这是一个列表理解。for _ in pizzas
表示执行此操作的次数与变量 pizzas
中的项目一样多。因此,将[IntVar(root) for _ in pizzas]
扩展为英文语句,它的意思是“为我创建一个与披萨列表长度相同的 IntVar 对象列表”以上是关于如何在 for 循环中创建具有整数值的 Checkbuttons?的主要内容,如果未能解决你的问题,请参考以下文章