我在用Python写Telegram机器人,想在某个按钮按下时创建数据库,但Python无法识别创建数据库的函数

0 投票
1 回答
41 浏览
提问于 2025-04-13 20:19
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    if call.data == 'companies_list':
        conn = sqlite3.connect('ETP_bot.sql')
        cur = conn.cursor()

        cur.execute("SELECT * FROM users")
        users = cur.fetchall()

        info = ''
        for el in users:
            info += f'<b>Компания</b>: "{el[1]}"\n    <u>Культура</u>: <em>{el[2]}</em>\n'
        cur.close()
        conn.close()
        bot.send_message(call.message.chat.id, info)

    if call.data == 'buy':
        bot.send_message(call.message.chat.id, f'Ознакомьтесь со списком компаний', reply_markup=companies_list)
    if call.data == 'sell':
        def test(message):
            conn2 = sqlite3.connect('ETP_bot_table.sql')
            cur2 = conn2.cursor()

            cur2.execute('CREATE TABLE IF NOT EXISTS table_1 (id int auto_increment primary key, product varchar(50), price varchar(50))')
            conn2.commit()
            cur2.close()
            conn2.close()
....

首先,我为回调数据添加了一个装饰器,在这里我检查传入的数据。如果负责“卖出”数据的按钮被按下,我就像第一次那样创建一个新的数据库(下面的代码)。但是这并没有发生,Python把def test(message)标记成灰色,并拒绝创建数据库。

@bot.message_handler(commands=['start'])
def main(message):
    bot.send_message(message.chat.id, f'Добро пожаловать, дорогой пользователь! Введите название вашей организации.')
    conn = sqlite3.connect('ETP_bot.sql')
    cur = conn.cursor()

    cur.execute('CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, name varchar(50), kultura varchar(50))')
    conn.commit()
    cur.close()
    conn.close()


    bot.register_next_step_handler(message, user_name)
def user_name(message):
    global name
    name = message.text.strip()
    bot.send_message(message.chat.id, f'Теперь введите культуру, которой занимается ваша компания.')
    bot.register_next_step_handler(message, user_kultura)
def user_kultura(message):
    kultura = message.text.strip()

    conn = sqlite3.connect('ETP_bot.sql')
    cur = conn.cursor()

    cur.execute("INSERT INTO users (name, kultura) VALUES ('%s', '%s')" % (name, kultura))
    conn.commit()
    cur.close()
    conn.close()


    bot.send_message(message.chat.id, f'Компания успешно зарегистрирована!', reply_markup=companies_list)

基本上,我尝试在if cal.data == "sell"中删除每一个def,但这样做也没有用。

它显示了这个信息

    product = call.text.strip()
              ^^^^^^^^^
AttributeError: 'CallbackQuery' object has no attribute 'text'

1 个回答

0

看起来你想访问一个叫做 CallbackQuery 的对象里的 text 属性,但这个属性并不存在。回调查询里没有 text 属性;它们有的是 data

callback 函数里,你处理的是一个回调查询,所以你应该查看 call 对象里的 data 属性,这样才能知道哪个按钮被按下了。

像这样:

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    if call.data == 'companies_list':
        conn = sqlite3.connect('ETP_bot.sql')
        cur = conn.cursor()

        cur.execute("SELECT * FROM users")
        users = cur.fetchall()

        info = ''
        for el in users:
            info += f'<b>Компания</b>: "{el[1]}"\n    <u>Культура</u>: <em>{el[2]}</em>\n'
        cur.close()
        conn.close()
        bot.send_message(call.message.chat.id, info)

    if call.data == 'buy':
        bot.send_message(call.message.chat.id, f'Ознакомьтесь со списком компаний', reply_markup=companies_list)
        
    if call.data == 'sell':
        # Define the function for selling
        def sell(message):
            product = message.text.strip()
            conn2 = sqlite3.connect('ETP_bot_table.sql')
            cur2 = conn2.cursor()

            cur2.execute('CREATE TABLE IF NOT EXISTS table_1 (id INTEGER PRIMARY KEY AUTOINCREMENT, product VARCHAR(50), price VARCHAR(50))')
            conn2.commit()
            cur2.close()
            conn2.close()

        # Prompt the user to enter the product they want to sell
        bot.send_message(call.message.chat.id, "Enter the product you want to sell:")
        # Register the next step handler to receive the product name
        bot.register_next_step_handler(call.message, sell)

撰写回答