Tkinter, увеличивая цену из таблицы

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

Сейчас я объявил цены, но как их получить из базы данных У меня также есть еще одна кнопка, нажатие которой увеличивается на каждую нажатую кнопку, как на указанной кнопке

Как вы видели, на свои вопросы вы не получите хороших ответов. Одна из причин - это то, что вам нелегко помочь. Ваш код не запускается! Мы пытаемся найти проблемы в вашем коде, запустив его и просмотрев вывод и сообщения об ошибках. Если вы не предоставите работающий код, нам придется угадывать, как он должен работать, и мы можем ошибаться. Вы не предоставляете образцы данных. Вы получаете данные с помощью cur.fetchall(), но мы не знаем, как эти данные выглядят. Опять же, придется угадывать. Было бы проще, если бы вы предоставили нам эти вещи.

figbeam 14.05.2018 12:07

@figbeam, спасибо, я поделился всем кодом, попробуйте еще раз, помогите мне, как я могу получить цену из базы данных и умножить ее на количество нажатий кнопки

mohamed abdallah 14.05.2018 12:13

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

figbeam 14.05.2018 12:33

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

mohamed abdallah 14.05.2018 13:03

@figbeam любая помощь или предложения, пожалуйста

mohamed abdallah 14.05.2018 13:14

ОК. Итак, у вас есть таблицы. Но у меня нет столов. Не могли бы вы предоставить таблицы. У меня проблемы с запуском вашего кода, который использует таблицы, если у меня нет таблиц.

figbeam 14.05.2018 13:42

@figbeam, спасибо, братан, таблицы содержат только название еды и цену, если вы можете подключить свою собственную базу данных или где я делюсь с вами

mohamed abdallah 14.05.2018 21:14

У меня нет установленной базы данных, и я не уверен, что догадываюсь, на что могут быть похожи данные, поскольку я не понимаю слов: qureec, qado, casho, или как они соотносятся друг с другом в структуре базы данных. Приведите мне пример того, как они выглядят, или я ничем не могу вам помочь. Вам очень трудно помочь вам.

figbeam 14.05.2018 21:48

@figbeam спасибо братан за все ваше уважение Я отредактировал вопрос и добавил изображение для простого описания, чтобы его было легче понять, а также слова qureec и другие просто названия еды

mohamed abdallah 14.05.2018 22:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
9
214
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Получая имя на кнопках вместо только первой буквы, вы должны установить имя для всей строки, а не только для первой позиции:

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 в текст

mohamed abdallah 15.05.2018 22:17

Обновил свой ответ. Взгляните, запустите и посмотрите, что вы думаете.

figbeam 16.05.2018 00:32

да, отлично спасибо, но все же что, если из базы данных, например, "cursor.execute (" ВЫБРАТЬ имя, цену ИЗ еды ")"

mohamed abdallah 16.05.2018 22:44

еще раз спасибо, но если можно попробовать, исходит ли оно из таблицы

mohamed abdallah 16.05.2018 23:46

Извините, я не знаю синтаксиса для получения данных из базы данных. Несомненно, должен существовать форум SQL, на котором можно задать такой вопрос.

figbeam 17.05.2018 00:52

Еще раз спасибо, вы очень помогаете мне, если я задам вам другой вопрос, если я нажимаю на еду, например, как я могу избавиться от кнопок чая и фастфуда

mohamed abdallah 17.05.2018 13:32

Вы можете удалить любой виджет с помощью widget.grid_remove(), но вам нужно будет помнить, какие кнопки находятся в каком столбце. Кнопка по-прежнему будет существовать, и вы можете снова показать ее с помощью widget.grid(). Он запомнит, где он был размещен.

figbeam 17.05.2018 14:00

Другие вопросы по теме