如何在 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()。而buttonNone,因为它是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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中加上整数值

如何在 C 中构造一个具有绝对整数值和等效 char 整数值的 char 数组?

Ng-重复整数值

v-for 范围期望一个整数值但得到 NaN

如何匹配在linq中具有多个用逗号分隔的整数值的列?

如何在php中识别具有整数值的默认参数