#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 такой же длины, как список пицц».