Кнопка Python Tkinter для индивидуального продукта и размера - PullRequest
0 голосов
/ 10 июля 2019

Я новичок в Python и Tkinter. Я пытаюсь создать программу, в которой я хочу, чтобы пользователь нажимал на напиток, размер напитка и вкус. Я хочу, чтобы эта информация была записана в таблицу базы данных, когда они нажимают кнопку добавления

Я не знаю, как это сделать. Может ли кто-нибудь помочь, пожалуйста?

Я попытался создать функцию для каждой отдельной команды, которая запускается при нажатии каждой кнопки, но мне пришлось создать большую структуру else-if, чтобы отобразить каждую возможную комбинацию напитка и размера. Есть ли более эффективный способ сделать это?

global small
global medium
global large
global Espresso
global Cappucino

small = False
medium = False
large = False
Espresso = False
Cappucino = False

def Espresso():
    global Espresso
    Espresso = True
def Cappucino():
    global Cappucino
    Cappucino = True
def sizeSmall():
    global small
    small = True
def sizeMedium():
    global medium
    medium = True
def sizeLarge():
    global large
    large = True

def add():
    global Espresso
    global Cappucino
    global small
    global medium
    global large

if Espresso == True and small == True:
        backend.insert("Espresso","small")
        Espresso = False
        small = False
    elif Espresso == True and medium == True:
        backend.insert("Espresso","medium")
        Espresso = False
        medium = False
    elif Espresso == True and large == True:
        backend.insert("Espresso","large")
        Espresso = False
        large = False
    elif Cappucino == True and small == True:
        backend.insert("Cappucino","small")
        Cappucino = False
        small = False
    elif Cappucino == True and medium == True:
        backend.insert("Cappucino","medium")
        Espresso = False
        small = False
    elif Cappucino == True and large == True:
        backend.insert("Cappucino","large")
        Cappucino = False

#Small button
smallImage = PhotoImage(file="ResizedItemImages/Function/smallResized.png")
smallButton = Button(topFrame,image=smallImage,command=sizeSmall)
smallButton.grid(column=0,row=4,pady=(15,0))

#Medium Button
mediumImage = PhotoImage(file="ResizedItemImages/Function/medium_Resized.png")
mediumButton = Button(topFrame,image=mediumImage,command=sizeMedium)
mediumButton.grid(column=1,row=4,pady=(15,0))

#Large button
largeImage = PhotoImage(file="ResizedItemImages/Function/largeResized.png")
largeButton = Button(topFrame,image=largeImage,command=sizeLarge)
largeButton.grid(column=2,row=4,pady=(15,0))

#Add button
addImage = PhotoImage(file="ResizedItemImages/Function/addResized.png")
addButton = Button(topFrame,image=addImage,command=add)
addButton.grid(column=3,row=4,pady=(15,0),sticky=E)

#Cappucino Button
cappucinoImage = PhotoImage(file="ResizedItemImages/HotDrinks/cappucinoResized.png")
cappucinoButton = Button(topFrame,image=cappucinoImage,command=Cappucino)

#Espresso Button
espressoImage = PhotoImage(file="ResizedItemImages/HotDrinks/espressoResized.png")
espressoButton = Button(topFrame,image=espressoImage,command=Espresso)

#BACKEND MODULE
def insert(product,size):
    conn=sqlite3.connect("foods.db")
    cur=conn.cursor()
    cur.execute("INSERT INTO food VALUES (NULL,?,?)",(product,size))
    conn.commit()
    conn.close()

window.title("Coffee System")
window.geometry("830x800")
window.resizable(width=False, height=False)
window.mainloop()

1 Ответ

0 голосов
/ 10 июля 2019

Я пытался создать функцию для каждой отдельной команды, которая запускается при нажатии каждой кнопки, но мне пришлось создать большую структуру 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...