Мой код на самом деле выглядит так: больше кода позади
names = aoracandlestudiodb.cursor()
names.execute('SELECT _name FROM items')
item_name = names.fetchall()
i = 0
distance = 0
name = 1
for item in item_name:
for j in range(len(item)):
buttoncommandstr = "generatebuttoncommand{}".format(i)
print(buttoncommandstr)
result_button = eval('self.' + buttoncommandstr)
fontanierabutton = ctk.CTkButton(self, text=str(item[j]), width=200, height=20,
fg_color='grey',
bg_color='white',
corner_radius=5,
text_color='black', font=("Arial bold", 20),
command=lambda: result_button(name))
fontanierabutton.place(x=80, y=distance)
print(name)
i = i + 1
name = name + 1
distance = distance + 40
def generatebuttoncommand0(self, x):
print(x)
return x
def generatebuttoncommand1(self, x):
print(x)
def generatebuttoncommand2(self, x):
print(x)
def generatebuttoncommand3(self, x):
и т. д.
Но я должен выполнить команду «def generatebuttoncommand{num}» в зависимости от элементов, которые у меня есть в базе данных sql. Но! Вы скажете, что я мог бы легко добиться этого, выполнив второй новый «для», например
names = aoracandlestudiodb.cursor()
names.execute('SELECT _name FROM items')
item_name = names.fetchall()
i = 0
distance = 0
name = 1
for item in item_name:
for j in range(len(item)):
exec(f"def generatebuttoncommand{i}(): ...")
i = i + 1
это будет генерировать функции, но я мог бы добавить только максимум 10 строк, но код, который я хочу добавить на каждую кнопку, больше похож на 80 строк с новыми кнопками и новыми «командными» вызовами для них.
Результат, который я хотел бы получить: (имея 10 элементов в моей таблице sql)
(кнопка элемента 1) ---> Метка с (_name, _cost, _price, _category) в отдельных полях и получение новой кнопки ---> Обновление данных sql, если я хочу изменить любой из этих столбцов
(кнопка элемента 2) ---> Метка с (_name2, _cost2, _price2, _category2) в отдельных полях и получение новой кнопки ---> Обновление данных sql, если я хочу изменить любой из этих столбцов
а затем, если я добавлю новый элемент, он автоматически сгенерирует все эти функции и кнопки.
Я попробовал другой способ создания кнопок в зависимости от базы данных sql, но я получил другую ошибку от этого
CallDB = aoracandlestudiodb.cursor()
CallDB.execute('SELECT * FROM items')
items_ID3 = CallDB.fetchall()
i = 1
distance = 0
for item in items_ID3:
for j in range(len(item)):
print("hi")
query_name = 'SELECT _name FROM items WHERE iditems=%s'
query_ID = 'SELECT iditems FROM items WHERE iditems=%s'
item_NAME = CallDB.execute(query_name, (i,))
print(item_NAME)
items_ID = CallDB.execute(query_ID, (i,))
self.MakeButtonsForItems(item_NAME, distance, items_ID)
i = i + 1
distance = distance + 40
def MakeButtonsForItems(self, buttonname, distance, buttonid):
buttonGenerator = ctk.CTkButton(self, text=buttonname, width=200, height=20,
fg_color='grey',
bg_color='white',
corner_radius=5,
text_color='black', font=("Arial bold", 20),
command=lambda: self.genaratebuttoncommand0(buttonid))
buttonGenerator.place(x=80, y=distance)
ошибка "Traceback (последний последний вызов): Файл "C:\Users\katsi\PycharmProjects\PycharmProjects\pythonProject\test3.py", строка 173, в приложение = БазовоеОкно() Файл "C:\Users\katsi\PycharmProjects\PycharmProjects\pythonProject\test3.py", строка 63, в инициализации items_ID = CallDB.execute(query_ID, (i,)) Файл "C:\Users\katsi\PycharmProjects\venv\lib\site-packages\mysql\connector\cursor_cext.py", строка 303, выполняется self._cnx.handle_unread_result() Файл "C:\Users\katsi\PycharmProjects\venv\lib\site-packages\mysql\connector\connection_cext.py", строка 921, в handle_unread_result поднять InternalError ("Найден непрочитанный результат") mysql.connector.errors.InternalError: найден непрочитанный результат "
Ты слишком все усложняешь. Как вы думаете, почему вам нужно создать отдельную функцию для каждой кнопки, а не одну функцию, которая принимает аргументы? Очень, очень хорошее эмпирическое правило - "не использовать exec". Хотя у него есть свои применения, это не одно из них.
вы определенно можете перебирать функции и кнопки, данные, имена, затраты и т. д., чтобы облегчить себе жизнь.
все ли методы generatebuttoncommandX() делают концептуально одно и то же? Возможно, вам нужен только один из них, которому могут быть переданы некоторые метаданные, чтобы делать правильные вещи.
Функции должны быть одинаковыми? У первого есть return x, у остальных нет. У последнего вообще нет тела.
Все зависит от того, что делают функции
@bryanoakley, я принимаю то, что вы говорите, мне просто нужна помощь, потому что я застрял. у вас есть пример на уме?
@jonsg я только что добавил его для тестирования, это всего лишь часть кода, просто пример для использования, поэтому он не завершен
@bryanOakley, проверьте, что я добавил в конце этого поста, так и должно быть?
Сосредоточьтесь на одной конкретной проблеме и одной конкретной реализации и отредактируйте вопрос для этого. Почему вы изменили код запроса из базы данных? И вы не описали, какую задачу надо делать в обработчиках кнопок. Также опубликуйте минимальный воспроизводимый пример.






Это то, что я сделал
CallDB = aoracandlestudiodb.cursor()
CallDB.execute('SELECT * FROM items')
items_ID3 = CallDB.fetchall()
print(items_ID3)
i = 1
distance = 0
for item in items_ID3:
get_name = get_NameOfItem(i)
get_ID = get_IDOfItem(i)
self.MakeButtonsForItems(get_ID, get_name, distance)
i = i + 1
distance = distance + 40
def MakeButtonsForItems(self, buttonid, buttonname, distance):
ButtonVariable = buttonid
buttonGenerator = ctk.CTkButton(self, text=buttonname, width=200, height=20,
fg_color='grey',
bg_color='white',
corner_radius=5,
text_color='black', font=("Arial bold", 20),
command=lambda: self.genaratebuttoncommand0(ButtonVariable))
buttonGenerator.place(x=80, y=distance)
def genaratebuttoncommand0(self, Item_id):
...
и сделал эти функции для получения информации из базы данных sql
def get_IDOfItem(VarForPick):
CallDB = aoracandlestudiodb.cursor()
query = 'SELECT iditems FROM items WHERE iditems= %s '
CallDB.execute(query, (VarForPick,))
stage_get = CallDB.fetchall()
stage_set = str(stage_get)
Item_ID = stage_set[2:-3]
return int(Item_ID)
def get_NameOfItem(ID_item):
CallDB = aoracandlestudiodb.cursor()
query = 'SELECT _name FROM items WHERE iditems= %s '
CallDB.execute(query, (ID_item,))
stage_get = CallDB.fetchall()
stage_set = str(stage_get)
Item_Name = stage_set[3:-4]
return str(Item_Name)
def get_PriceOfItem(Price_item):
CallDB = aoracandlestudiodb.cursor()
query = 'SELECT _price FROM items WHERE iditems= %s '
CallDB.execute(query, (Price_item,))
stage_get = CallDB.fetchall()
stage_set = str(stage_get)
Item_ID = stage_set[2:-3]
return float(Item_ID)
def get_CostOFItem(Cost_item):
CallDB = aoracandlestudiodb.cursor()
query = 'SELECT _cost FROM items WHERE iditems= %s '
CallDB.execute(query, (Cost_item,))
stage_get = CallDB.fetchall()
stage_set = str(stage_get)
Item_Cost = stage_set[2:-3]
return float(Item_Cost)
def get_CategoryOfItem(Category_item):
CallDB = aoracandlestudiodb.cursor()
query = 'SELECT _category FROM items WHERE iditems= %s '
CallDB.execute(query, (Category_item,))
stage_get = CallDB.fetchall()
stage_set = str(stage_get)
Item_Category = stage_set[3:-4]
return str(Item_Category)
def get_StockOfItem(Stock_item):
CallDB = aoracandlestudiodb.cursor()
query = 'SELECT _stock FROM items WHERE iditems= %s '
CallDB.execute(query, (Stock_item,))
stage_get = CallDB.fetchall()
stage_set = str(stage_get)
Item_Stock = stage_set[2:-3]
return int(Item_Stock)
Вы можете писать строковые литералы с произвольным количеством строк, если они начинаются и заканчиваются тройными кавычками
'''или""". Может я не правильно понимаю вашу проблему.