Я пытался создать функцию для каждой отдельной команды, которая запускается при нажатии каждой кнопки, но мне пришлось создать большую структуру else-if, чтобы отобразить каждую возможную комбинацию напитка и размера.Есть ли более эффективный способ сделать это?
Да, есть.Кнопки ароматизатора и размера должны устанавливать значение, а не вызывать функцию.Затем ваша кнопка добавления может получить значения и сохранить их в базе данных.
Поскольку аромат и размеры являются исключительным выбором (т. Е. Вы можете выбрать только один размер и один аромат), вам следует использовать радиокнопки.Каждая группа может иметь общую переменную.
Например, начните с определения всех возможных разновидностей и размеров.Это должны быть значения, которые вы хотите сохранить в базе данных.Мы сделаем это простым и сделаем так, чтобы значения базы данных и значения, которые пользователь видит в графическом интерфейсе, были одинаковыми.
FLAVORS = ("Cappucino", "Espresso")
SIZES = ("Small", "Medium", "Large")
Нам также нужно создать пару переменных для хранения текущего значения.Поскольку мы хотим, чтобы tkinter мог получать и устанавливать значение, мы будем использовать StringVar
:
flavorVar = tk.StringVar(value=FLAVORS[0])
sizeVar = tk.StringVar(value=SIZES[0])
Мы можем создавать радиокнопки в цикле, а не по одной за раз.В этом коде предполагается, что вы создали кадр с именами flavorFrame
и sizeFrame
для хранения радиокнопок.
for flavor in FLAVORS:
rb = tk.Radiobutton(flavorFrame, text=flavor, value=flavor, variable=flavorVar)
rb.pack(side="top", anchor="w")
for size in SIZES:
rb = tk.Radiobutton(sizeFrame, text=size, value=size, variable=sizeVar)
rb.pack(side="top", anchor="w")
Наконец, нам нужна кнопка добавления и код, чтобы получить значение и поместить его в базу данных.Вместо базы данных в этом примере мы просто напечатаем значение.В этом коде предполагается, что вы создали фрейм с именем buttonFrame
.
def add():
size = sizeVar.get()
flavor = flavorVar.get()
print("flavor: {}, size: {}".format(flavor, size))
addButton = tk.Button(buttonFrame, text="Add", command=add)
. Чтобы сохранить значение в базе данных, просто замените оператор печати на любой код, который вы хотите.
Установка еговсе вместе, вот окончательная версия:
import tkinter as tk
FLAVORS = ("Cappucino", "Espresso")
SIZES = ("Small", "Medium", "Large")
def add():
size = sizeVar.get()
flavor = flavorVar.get()
print("flavor: {}, size: {}".format(flavor, size))
root = tk.Tk()
flavorVar = tk.StringVar(value=FLAVORS[0])
sizeVar = tk.StringVar(value=SIZES[0])
flavorFrame = tk.LabelFrame(root, text="Flavor")
sizeFrame = tk.LabelFrame(root, text="Size")
buttonFrame = tk.Frame(root)
buttonFrame.pack(side="top")
flavorFrame.pack(side="left", fill="both", expand=True, padx=20, pady=20)
sizeFrame.pack(side="right", fill="both", expand=True, padx=20, pady=20)
for flavor in FLAVORS:
rb = tk.Radiobutton(flavorFrame, text=flavor, value=flavor, variable=flavorVar)
rb.pack(side="top", anchor="w")
for size in SIZES:
rb = tk.Radiobutton(sizeFrame, text=size, value=size, variable=sizeVar)
rb.pack(side="top", anchor="w")
addButton = tk.Button(buttonFrame, text="Add", command=add)
addButton.pack(side="left")
tk.mainloop()