我在用Python写Telegram机器人,想在某个按钮按下时创建数据库,但Python无法识别创建数据库的函数
@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)