如何更新传递给 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
    ...