Как создать кнопки проверки с целочисленным значением в цикле for?

#python #python-3.x #loops #for-loop #tkinter

Вопрос:

Я создаю проект для своего класса в колледже. Я создаю графический интерфейс с помощью python для ресторана пиццы. Я создал 5 контрольных кнопок, отображающих 5 разных пицц с разной ценой на каждую пиццу. Я создал кнопку «Рассчитать». Как я могу создать функцию для кнопки «Рассчитать», чтобы отображать цену каждой пиццы в зависимости от того, какие из них выбраны? Если выбрано несколько, то будет написано » цена пепперони: $», «цена сыра: $»,…и т. Д.? Как я могу присвоить каждой пицце другое значение в цикле for? Код здесь:

 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)  

»’

Комментарии:

1. Тебе нужно переехать var_list[i] = IntVar() раньше button = Checkbutton(...).grid(...) . И button это None потому , что это результат grid(...) , а не Checkbutton(...) . Также назначение одной и той же переменной в цикле for бессмысленно.

2. Я получил его, чтобы вывести значение (цену) каждой пиццы, когда нажата только одна. Как бы я это сделал, если бы было нажато несколько, отображая уникальную цену каждого из них?

3. Это потому, что вы ставите ценники в одно и то же положение. Вы должны сначала построить прайс-лист, а затем создать этикетку с прайс-листом. Предложите создать ярлык один раз и обновить его внутри 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 вместо диапазона для перебора каждого элемента в списке пицц, все еще получая индекс, который можно использовать для установки номера строки. Также используется zip для того, чтобы я мог перебирать как пиццу, так и var_list одновременно.

Функция calc не слишком отличается от вашей собственной, она просто добавляет новую часть в строку, если установлен флажок для пиццы.

Комментарии:

1. Спасибо, очень помогли! Как вы отображаете выходные данные функции на этикетке? Я вижу, у вас есть priceStr.set(прайс-лист), затем вы создаете метку, выводя текст в качестве переменной priceStr? Что именно делает priceStr.set(прайс-лист)?

2. Чтобы задать текст в tkinter, вы можете задать значение метки напрямую или использовать StringVar. Выполнив priceStr.set, я изменяю текст внутри priceStr. Когда он изменяется, любой другой виджет tkinter, связанный с этой строкой, автоматически изменяется.

3. Ладно, в этом есть смысл! Еще один вопрос.. что происходит в списке переменных? Я понимаю первую часть, в которой вы объявляете ее как целочисленную переменную, я полагаю, но что делает пицца for_in?

4. @Исайя, Это понимание списка. for _ in pizzas значит, делайте это столько раз, сколько элементов в переменной pizzas . Таким образом, расширяясь [IntVar(root) for _ in pizzas] до английского утверждения, это означает «Создайте мне список объектов IntVar такой же длины, как список пицц».