Генерировать функции, в которых есть более одной строки кода

Мой код на самом деле выглядит так: больше кода позади

        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: найден непрочитанный результат "

Вы можете писать строковые литералы с произвольным количеством строк, если они начинаются и заканчиваются тройными кавычками ''' или """. Может я не правильно понимаю вашу проблему.

Michael Butscher 24.04.2023 21:57

Ты слишком все усложняешь. Как вы думаете, почему вам нужно создать отдельную функцию для каждой кнопки, а не одну функцию, которая принимает аргументы? Очень, очень хорошее эмпирическое правило - "не использовать exec". Хотя у него есть свои применения, это не одно из них.

Bryan Oakley 24.04.2023 21:57

вы определенно можете перебирать функции и кнопки, данные, имена, затраты и т. д., чтобы облегчить себе жизнь.

Ori Yarden 24.04.2023 21:58

все ли методы generatebuttoncommandX() делают концептуально одно и то же? Возможно, вам нужен только один из них, которому могут быть переданы некоторые метаданные, чтобы делать правильные вещи.

JonSG 24.04.2023 22:10

Функции должны быть одинаковыми? У первого есть return x, у остальных нет. У последнего вообще нет тела.

Barmar 24.04.2023 22:11

Все зависит от того, что делают функции

Delrius Euphoria 24.04.2023 22:28

@bryanoakley, я принимаю то, что вы говорите, мне просто нужна помощь, потому что я застрял. у вас есть пример на уме?

Pavlos Katsioulis 24.04.2023 23:57

@jonsg я только что добавил его для тестирования, это всего лишь часть кода, просто пример для использования, поэтому он не завершен

Pavlos Katsioulis 25.04.2023 00:02

@bryanOakley, проверьте, что я добавил в конце этого поста, так и должно быть?

Pavlos Katsioulis 25.04.2023 19:37

Сосредоточьтесь на одной конкретной проблеме и одной конкретной реализации и отредактируйте вопрос для этого. Почему вы изменили код запроса из базы данных? И вы не описали, какую задачу надо делать в обработчиках кнопок. Также опубликуйте минимальный воспроизводимый пример.

relent95 26.04.2023 05:54
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
10
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это то, что я сделал

        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)

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