Я делаю простую программу для системы управления кафе, которая считывает названия продуктов питания в виде кнопок со стола, также я хочу прочитать цену на продукты из таблицы и умножить ее на количество нажатий кнопок, а затем сохранить их в Text, как я сделай это, пожалуйста
это изображение, которое показывает, где находятся две основные проблемы
from tkinter import *
from tkinter import ttk
import sqlite3
import time
import datetime
import random
variable = 1
bttn_clicks=0
button_dict = {}
button_dic = {}
conn = sqlite3.connect('hoteldb.db')
c = conn.cursor()
def showqurec():
global button,data2
data2 = readqurec()
for index, dat in enumerate(data2):
button= ttk.Button(master, text=dat[0],command=lambda dat=dat:update_count(dat))
button.grid(row=index+1, column=0,padx=0, pady=0)
button_dict[dat] = button
def showqado():
global button,data2
data2 = readqado()
for index, dat in enumerate(data2):
button = ttk.Button(master, text=dat[0],command=lambda dat=dat: update_count(dat))
button.grid(row=index+1, column=1,pady=0,padx=0)
button_dict[dat] = button
def showcasho():
global button,data2
data2 = readcasho()
for index, dat in enumerate(data2):
button=ttk.Button(master, text=dat[0],command=lambda dat=dat:update_count(dat))
button.grid(row=index+1, column=2,padx=0, pady=0)
button_dict[dat] = button
def readfromdatabase():
cur.execute("SELECT qureec.name,qado.name,casho.name FROM qureec,qado,casho")
return cur.fetchall()
def readqurec():
cur.execute("SELECT name FROM qureec ")
return cur.fetchall()
def readqado():
cur.execute("SELECT name FROM qado ")
return cur.fetchall()
def readcasho():
cur.execute("SELECT name FROM casho ")
return cur.fetchall()
def update_count(x):
global bttn_clicks,my_text,price
my_text=StringVar()
for name in data2:
my_text = button_dict[x].cget('text')
bttn_clicks += 1
def Receipt():
txtReceipt.delete("1.0", "4.0")
x = random.randint(10908, 500876)
randomRef = str(x)
Receipt_Ref.set("BILL" + randomRef)
txtReceipt.insert("1.0", 'Receipt Ref: \t\t\t'+Receipt_Ref.get()+"\t\t"+DateofOrder.get()+"\n")
txtReceipt.insert("2.0", 'Items\t\t'+'Quantity\t\t\t'+"Price \n\n")
if variable !=0:
txtReceipt.insert(END, str(my_text)+'\t\t'+str(bttn_clicks)+'\t\t\t'+""+str(bttn_clicks*3)+"\n")
master=Tk()
master.geometry('630x350+100+200')
master.title('Records')
Label = Button(master, text = "meal", width=10,command=showqurec)
Label.grid(row=0, column=0)
BMILabel = Button(master, text = "tea", width=10,command=showqado)
BMILabel.grid(row=0, column=1)
stateLabel = Button(master, text = "fast food", width=10,command=showcasho)
stateLabel.grid(row=0, column=2)
lblReceipt = Button(master,text = "Get Receipt:",anchor='w',command=Receipt)
lblReceipt.grid(row=0,column=4,sticky=W)
txtReceipt = Text(master,bg = "white",width=47,height=17.5)
txtReceipt.grid(row=1,column=4,rowspan=4,columnspan=40)
Receipt_Ref=StringVar()
DateofOrder = StringVar()
master.mainloop()
Сейчас я объявил цены, но как их получить из базы данных У меня также есть еще одна кнопка, нажатие которой увеличивается на каждую нажатую кнопку, как на указанной кнопке
@figbeam, спасибо, я поделился всем кодом, попробуйте еще раз, помогите мне, как я могу получить цену из базы данных и умножить ее на количество нажатий кнопки
У вас есть несколько функций, которые читают из базы данных. Пожалуйста, поменяйте местами чтение базы данных, например данные. У меня нет вашей базы данных.
@figbeam У меня есть три таблицы для завтрака, обеда и ужина, поэтому все несколько функций читаются из этих трех таблиц Я читаю эти имена как кнопки, но я не хочу читать цены в кнопках Я просто хочу сделать словарь, а затем использовать для умножения количества нажатий кнопок в текстовом поле
@figbeam любая помощь или предложения, пожалуйста
ОК. Итак, у вас есть таблицы. Но у меня нет столов. Не могли бы вы предоставить таблицы. У меня проблемы с запуском вашего кода, который использует таблицы, если у меня нет таблиц.
@figbeam, спасибо, братан, таблицы содержат только название еды и цену, если вы можете подключить свою собственную базу данных или где я делюсь с вами
У меня нет установленной базы данных, и я не уверен, что догадываюсь, на что могут быть похожи данные, поскольку я не понимаю слов: qureec, qado, casho, или как они соотносятся друг с другом в структуре базы данных. Приведите мне пример того, как они выглядят, или я ничем не могу вам помочь. Вам очень трудно помочь вам.
@figbeam спасибо братан за все ваше уважение Я отредактировал вопрос и добавил изображение для простого описания, чтобы его было легче понять, а также слова qureec и другие просто названия еды






Получая имя на кнопках вместо только первой буквы, вы должны установить имя для всей строки, а не только для первой позиции:
button = ttk.Button(master, text=dat, command ...
(instead of dat[0])
по каждой из категорий: еда, чай и фастфуд.
У меня нет четкого представления о том, как вы хотите, чтобы это работало, в конце концов. Вы хотите, чтобы квитанция обновлялась по каждому товару или только в конце. Очень странно выглядит функция update_count().
Я бы рекомендовал использовать диктатор для хранения продуктов и цен. Это упростит поиск цен. Если приложение довольно маленькое, я думаю, что предпочтительнее использовать глобальную переменную.
products = {'Soup': 2.40, 'Fish': 3.10, 'Beef': 3.55, 'Pizza': 2.70}
Взгляните на приведенный ниже пример кода, попробуйте запустить его и подумайте, как вы хотите, чтобы все остальное работало. Следует ли обновлять квитанцию при каждом нажатии кнопки? Нужно ли каким-либо образом заказывать квитанцию? Что делать, если вы хотите что-то убрать из чека?
from tkinter import *
from tkinter import ttk
#import sqlite3
import time
import datetime
import random
variable = 1
bttn_clicks=0
button_dict = {}
button_dic = {}
#conn = sqlite3.connect('hoteldb.db')
#c = conn.cursor()
products = {} # Dictionary of products and prices
tally = [] # List of ordered products
def showqurec():
global button, data2
data2 = readqurec()
for index, dat in enumerate(data2):
button = ttk.Button(master, text=dat, command=lambda dat=dat: update_count(dat))
button.grid(row=index+1, column=0, padx=0, pady=0)
button_dict[dat] = button
def showqado():
global button, data2
data2 = readqado()
for index, dat in enumerate(data2):
button = ttk.Button(master, text=dat, command=lambda dat=dat: update_count(dat))
button.grid(row=index+1, column=1, pady=0, padx=0)
button_dict[dat] = button
def showcasho():
global button, data2
data2 = readcasho()
for index, dat in enumerate(data2):
button = ttk.Button(master, text=dat, command=lambda dat=dat: update_count(dat))
button.grid(row=index+1, column=2,padx=0, pady=0)
button_dict[dat] = button
def readfromdatabase(): # This function is never called...
return None
def readqurec(): # Get Meal from database
meal = {'Soup': 2.40, 'Fish': 3.10, 'Beef': 3.55, 'Pizza': 2.70}
products.update(meal)
return meal
def readqado(): # Get Tea from database
tea = {'Tea': 1.20, 'Coffee': 1.00, 'Soda': 1.65}
products.update(tea)
return tea
def readcasho(): # Get Fast food from database
fast_food = {'Hamburger': 1.80,'Hot dog': 1.45,'Pasta': 1.65}
products.update(fast_food)
return fast_food
def update_count(x):
global bttn_clicks,my_text,price
purchase = [x,products[x]] # Get the product and price
tally.append(purchase) # Add this purchase to the tally
print(purchase)
# Leaving the rest of the function as is ...
my_text=StringVar()
for name in data2:
my_text = button_dict[x].cget('text')
bttn_clicks += 1
def Receipt():
txtReceipt.delete("1.0", "4.0")
x = random.randint(10908, 500876)
randomRef = str(x)
Receipt_Ref.set("BILL" + randomRef)
txtReceipt.insert("1.0", 'Receipt Ref: \t\t\t'+Receipt_Ref.get()+"\t\t"+DateofOrder.get()+"\n")
txtReceipt.insert("2.0", 'Items\t\t'+'Quantity\t\t\t'+"Price \n\n")
if variable !=0:
txtReceipt.insert(END, str(my_text)+'\t\t'+str(bttn_clicks)+'\t\t\t'+""+str(bttn_clicks*3)+"\n")
master=Tk()
master.geometry('630x350+100+200')
master.title('Records')
Label = Button(master, text = "meal", width=10,command=showqurec)
Label.grid(row=0, column=0)
BMILabel = Button(master, text = "tea", width=10,command=showqado)
BMILabel.grid(row=0, column=1)
stateLabel = Button(master, text = "fast food", width=10,command=showcasho)
stateLabel.grid(row=0, column=2)
lblReceipt = Button(master,text = "Get Receipt:",anchor='w',command=Receipt)
lblReceipt.grid(row=0,column=4,sticky=W)
txtReceipt = Text(master,bg = "white",width=47,height=17.5)
txtReceipt.grid(row=1,column=4,rowspan=4,columnspan=40)
Receipt_Ref=StringVar()
DateofOrder = StringVar()
master.mainloop()
спасибо за все ваши попытки и уважение, да, вы можете использовать эти данные, так как я могу ввести цену в readqurecp в текст
Обновил свой ответ. Взгляните, запустите и посмотрите, что вы думаете.
да, отлично спасибо, но все же что, если из базы данных, например, "cursor.execute (" ВЫБРАТЬ имя, цену ИЗ еды ")"
еще раз спасибо, но если можно попробовать, исходит ли оно из таблицы
Извините, я не знаю синтаксиса для получения данных из базы данных. Несомненно, должен существовать форум SQL, на котором можно задать такой вопрос.
Еще раз спасибо, вы очень помогаете мне, если я задам вам другой вопрос, если я нажимаю на еду, например, как я могу избавиться от кнопок чая и фастфуда
Вы можете удалить любой виджет с помощью widget.grid_remove(), но вам нужно будет помнить, какие кнопки находятся в каком столбце. Кнопка по-прежнему будет существовать, и вы можете снова показать ее с помощью widget.grid(). Он запомнит, где он был размещен.
Как вы видели, на свои вопросы вы не получите хороших ответов. Одна из причин - это то, что вам нелегко помочь. Ваш код не запускается! Мы пытаемся найти проблемы в вашем коде, запустив его и просмотрев вывод и сообщения об ошибках. Если вы не предоставите работающий код, нам придется угадывать, как он должен работать, и мы можем ошибаться. Вы не предоставляете образцы данных. Вы получаете данные с помощью
cur.fetchall(), но мы не знаем, как эти данные выглядят. Опять же, придется угадывать. Было бы проще, если бы вы предоставили нам эти вещи.