@doshikd

Как правильно оформить код для телеграмм бота (калькулятор систем счисления) с кнопками?

Написала код для калькулятора системы счисления с кнопками. Не могу понять, почему бот не реагирует на кнопку 'Калькулятор чисел из любой системы счисления в 10' и при нажатии на кнопку ''Калькулятор чисел из 10 системы счисления в другую' выполняет не то действие

import telebot
from telebot import types

bot = telebot.TeleBot('#####')


@bot.message_handler(commands=['start'])

def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
    item1 = types.KeyboardButton('Калькулятор чисел из 10 системы счисления в другую')
    item2 = types.KeyboardButton ('Калькулятор чисел из любой системы счисления в 10')
    markup.add(item1, item2)
    bot.send_message(message.chat.id, 'Введите число', reply_markup = markup)


@bot.message_handler(content_types=['text'])
def bot_message(message):
    if message.chat.type == 'private':
        if message.text == 'Калькулятор чисел из 10 системы счисления в другую':
            bot.send_message(message.chat.id, 'Введите число')
            bot.register_next_step_handler(message, get_number)
def get_number(message):

    try:
        a = message.text
        bot.send_message(message.chat.id, 'Введите основание системы счисления, в которое Вы хотите перевести число')
        bot.register_next_step_handler(message, convert_number, a)
    except ValueError:
        bot.send_message(message.chat.id, 'Пожалуйста, нажмите на кнопку "Калькулятор", чтобы заново начать операцию')


def convert_number(message, a):
    try:
        n = int(message.text)
        s = ''
        al = 'ABCDEF'
        while a > 0:
            c = a % n
            if c < 10:
                s = str(c) + s
            else:
                s = al[c - 10] + s
            a //= n
        bot.send_message(message.chat.id, f'Ответ: {s}')
    except ValueError:
        bot.send_message(message.chat.id, 'Пожалуйста, нажмите на кнопку "Калькулятор", чтобы заново начать операцию')

    elif message.text == 'Калькулятор чисел из любой системы счисления в 10':
        bot.send_message(message.chat.id, 'Введите число')
        bot.register_next_step_handler(message, get_number)
def get_number(message):
    try:
        y = message.text
        bot.send_message(message.chat.id, 'Введите основание системы счисления, из которой Вы хотите перевести число')
        bot.register_next_step_handler(message, convert_number, y)
    except ValueError:
        bot.send_message(message.chat.id, 'Пожалуйста, введите число')


def convert_number(message, y):
    try:
        z = int(message.text)
        power = 1
        ans = 0
        for i in y[::-1]:
            if i < 'A':
                ans += int(i) * power
            else:
                ans += (ord(i) - ord('A') + 10) * power
            power *= z
        bot.send_message(message.chat.id, f'Ответ: {ans}')
    except ValueError:
        bot.send_message(message.chat.id, 'Пожалуйста, введите основание системы счисления')

bot.polling()
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
В функции bot_message надо проверять обе кнопки:
if message.text == 'текст первой кнопки':
    ...
elif message.text == 'текст второй кнопки':
    ...
else:
    bot.send_message(message.chat.id, 'Моя твоя не понимать...')


Сейчас же обрабатывает только одну, вторая не обрабатывается.

Далее нетрудно заметить, что в коде два раза объявляются функции с одинаковыми именами. Последующее определение перекроет предыдущее, и работать будут только последние.

Вообще говоря, мне кажется не очень осмысленным делать два варианта перевода между системами счисления. Не лучше ли спросить основание исходной и конечной и затем провести преобразование в общем случае? Заодно можно научиться делать перевод между произвольными системами счисления вплоть до 36-ричной? 10 арабских цифр плюс ещё 26 символов латиницы можно использовать как цифры, и даже формула для всех букв алфавита ord(i) - ord('A') + 10 будет хорошо работать...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы