如何更新传递给 InlineButton 的变量的值
How can update the value of a variable passed to an InlineButton
我最近在使用 Whosebug。
现在我在 Telebot API 上写了一个机器人,我正在尝试制作一个带有用户喜欢和不喜欢的动态键盘。我希望在按钮上显示点击次数。为此,将它们的值写入数据库(我使用 sqlite3)。
最初,值显示正确,但变量的新值只有在重新启动机器人后才会出现。
我应该使用什么函数或方法来在不重启的情况下更新值?
import telebot
import sqlite3 as sql
import config
from telebot import types
connection = sql.connect('lind.sqlite')
q = connection.cursor()
#q.execute('''CREATE TABLE lind (id int auto_increment primary key, like int, norm int, diz int)''')
connection.commit()
teal1 = int(0)
tean1 = int(0)
tead1 = int(0)
q.execute("INSERT INTO lind (like, norm, diz) VALUES ('%s', '%s', '%s')"%(teal1, tean1, tead1))
connection.commit()
q.execute("SELECT * FROM lind")
connection.commit()
re = q.fetchone()
az = re[1]
azz = re[2]
azzz = re[3]
q.close()
connection.commit()
connection.close()
bot = telebot.TeleBot(config.TOKEN)
photo = 'AgADAgAD-6wxG7agqUrFbpkcDO9ste__tw8ABAEAAwIAA20AA4X1BgABFgQ' #'ШУ Гуюаньчунь'}},
def keyboard_reaction():
keyboard = types.InlineKeyboardMarkup()
but_1 = types.InlineKeyboardButton(text='Like {like}'.format(like=az), callback_data='tea1like')
but_2 = types.InlineKeyboardButton(text='Norm {norm}'.format(norm=azz), callback_data='tea1norm')
but_3 = types.InlineKeyboardButton(text='DizL {diz}'.format(diz=azzz), callback_data='tea1diz')
keyboard.add(but_1, but_2, but_3)
return keyboard
@bot.message_handler(commands=['start'])
def first(message):
startmenu = types.ReplyKeyboardMarkup(True, True)
startmenu.row('GO!')
bot.send_message(message.chat.id, 'Hello!✋', reply_markup=startmenu)
@bot.message_handler(content_types=['text'])
def start(message):
if message.text == 'GO!':
bot.send_photo(message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction())
@bot.callback_query_handler(func=lambda c: True)
def inline(c):
if c.data == 'tea1like':
connection = sql.connect('lind.sqlite')
q = connection.cursor()
q.execute("SELECT like FROM lind")
connection.commit()
re = q.fetchone()
az = re[0]
az += 1
q.execute("UPDATE lind SET like ='%s'"%(az))
q.close()
connection.commit()
connection.close()
bot.answer_callback_query(callback_query_id=c.id, show_alert=True, text='You Clicked Like. You number {nl}'.format(nl=az))
bot.send_photo(c.message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction(like=az))
elif c.data == 'tea1norm':
connection = sql.connect('lind.sqlite')
q = connection.cursor()
q.execute("SELECT norm FROM lind")
connection.commit()
re = q.fetchone()
azz = re[0]
azz += 1
q.execute("UPDATE lind SET norm ='%s'"%(azz))
q.close()
connection.commit()
connection.close()
bot.answer_callback_query(callback_query_id=c.id, show_alert=True, text='You Clicked Norm. You number {nn}'.format(nn=azz))
bot.send_photo(c.message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction(norm=azz))
elif c.data == 'tea1diz':
connection = sql.connect('lind.sqlite')
q = connection.cursor()
q.execute("SELECT diz FROM lind")
connection.commit()
re = q.fetchone()
azzz = re[0]
azzz += 1
q.execute("UPDATE diz SET like ='%s'" % (azzz))
q.close()
connection.commit()
connection.close()
bot.answer_callback_query(callback_query_id=c.id, show_alert=True, text='You Clicked Dizlike. You number {dn}'.format(dn=azzz))
bot.send_photo(c.message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction(norm=azzz))
bot.polling()
问题是 inline()
函数中的 az, azz, azzz
变量不同于 keyboard_reaction()
函数中的 az, azz, azzz
变量。您在 inline()
中将此变量初始化为全局变量。
@bot.callback_query_handler(func=lambda c: True)
def inline(c):
global az
global azz
global azzz
...
我最近在使用 Whosebug。
现在我在 Telebot API 上写了一个机器人,我正在尝试制作一个带有用户喜欢和不喜欢的动态键盘。我希望在按钮上显示点击次数。为此,将它们的值写入数据库(我使用 sqlite3)。
最初,值显示正确,但变量的新值只有在重新启动机器人后才会出现。
我应该使用什么函数或方法来在不重启的情况下更新值?
import telebot
import sqlite3 as sql
import config
from telebot import types
connection = sql.connect('lind.sqlite')
q = connection.cursor()
#q.execute('''CREATE TABLE lind (id int auto_increment primary key, like int, norm int, diz int)''')
connection.commit()
teal1 = int(0)
tean1 = int(0)
tead1 = int(0)
q.execute("INSERT INTO lind (like, norm, diz) VALUES ('%s', '%s', '%s')"%(teal1, tean1, tead1))
connection.commit()
q.execute("SELECT * FROM lind")
connection.commit()
re = q.fetchone()
az = re[1]
azz = re[2]
azzz = re[3]
q.close()
connection.commit()
connection.close()
bot = telebot.TeleBot(config.TOKEN)
photo = 'AgADAgAD-6wxG7agqUrFbpkcDO9ste__tw8ABAEAAwIAA20AA4X1BgABFgQ' #'ШУ Гуюаньчунь'}},
def keyboard_reaction():
keyboard = types.InlineKeyboardMarkup()
but_1 = types.InlineKeyboardButton(text='Like {like}'.format(like=az), callback_data='tea1like')
but_2 = types.InlineKeyboardButton(text='Norm {norm}'.format(norm=azz), callback_data='tea1norm')
but_3 = types.InlineKeyboardButton(text='DizL {diz}'.format(diz=azzz), callback_data='tea1diz')
keyboard.add(but_1, but_2, but_3)
return keyboard
@bot.message_handler(commands=['start'])
def first(message):
startmenu = types.ReplyKeyboardMarkup(True, True)
startmenu.row('GO!')
bot.send_message(message.chat.id, 'Hello!✋', reply_markup=startmenu)
@bot.message_handler(content_types=['text'])
def start(message):
if message.text == 'GO!':
bot.send_photo(message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction())
@bot.callback_query_handler(func=lambda c: True)
def inline(c):
if c.data == 'tea1like':
connection = sql.connect('lind.sqlite')
q = connection.cursor()
q.execute("SELECT like FROM lind")
connection.commit()
re = q.fetchone()
az = re[0]
az += 1
q.execute("UPDATE lind SET like ='%s'"%(az))
q.close()
connection.commit()
connection.close()
bot.answer_callback_query(callback_query_id=c.id, show_alert=True, text='You Clicked Like. You number {nl}'.format(nl=az))
bot.send_photo(c.message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction(like=az))
elif c.data == 'tea1norm':
connection = sql.connect('lind.sqlite')
q = connection.cursor()
q.execute("SELECT norm FROM lind")
connection.commit()
re = q.fetchone()
azz = re[0]
azz += 1
q.execute("UPDATE lind SET norm ='%s'"%(azz))
q.close()
connection.commit()
connection.close()
bot.answer_callback_query(callback_query_id=c.id, show_alert=True, text='You Clicked Norm. You number {nn}'.format(nn=azz))
bot.send_photo(c.message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction(norm=azz))
elif c.data == 'tea1diz':
connection = sql.connect('lind.sqlite')
q = connection.cursor()
q.execute("SELECT diz FROM lind")
connection.commit()
re = q.fetchone()
azzz = re[0]
azzz += 1
q.execute("UPDATE diz SET like ='%s'" % (azzz))
q.close()
connection.commit()
connection.close()
bot.answer_callback_query(callback_query_id=c.id, show_alert=True, text='You Clicked Dizlike. You number {dn}'.format(dn=azzz))
bot.send_photo(c.message.chat.id, photo, caption='Бин Дао Юань Ча', reply_markup=keyboard_reaction(norm=azzz))
bot.polling()
问题是 inline()
函数中的 az, azz, azzz
变量不同于 keyboard_reaction()
函数中的 az, azz, azzz
变量。您在 inline()
中将此变量初始化为全局变量。
@bot.callback_query_handler(func=lambda c: True)
def inline(c):
global az
global azz
global azzz
...