Задать вопрос
Ответы пользователя по тегу Python
  • Как в callback_query_handler вставить register_next_step_handler?

    @twistfire92
    Python backend developer
    Советую начать с выбора модели велика. Это видимо единственный пункт, который выбирается Inline кнопками.
    Да и если у пользователя велосипед не из предложенного набора, тут же соскочит и не будет вводить лишнее.

    возьму ваш же код за основу и чуть видоизменю
    ...
    	elif message.text == ' Регистрация велосипеда ':
    		markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
    		btn1 = types.KeyboardButton(' Где наша мастерская? ')
    	 	btn2 = types.KeyboardButton(' Посмотреть прайс на ремонт ')
    		btn3 = types.KeyboardButton(' Наши контакты ')
    		btn4 = types.KeyboardButton('⏭ Далее ⏭')
    		markup.add(btn1, btn2, btn3, btn4)
    		bot.send_message(message.chat.id, 'Давайте запишем Ваш байк в базу данных.', reply_markup=markup)
    		markup_inline = types.InlineKeyboardMarkup()
    		#  Обратите внимание на callback_data при создании кнопки
    		bk1 = types.InlineKeyboardButton(text='Stels', callback_data='bike_model|Stels')
    		bk2 = types.InlineKeyboardButton(text='Forvard', callback_data='bike_model|Forvard')
    		bk3 = types.InlineKeyboardButton(text='Кама', callback_data='bike_model|Кама')
    		bk4 = types.InlineKeyboardButton(text='Урал', callback_data='bike_model|Урал')
    		markup_inline.add(bk1, bk2, bk3, bk4)
    		bot.send_message(message.chat.id, 'Выберите модель', reply_markup=markup_inline)
    
    #  На случай, если у вас будут еще какие-либо инлайн кнопки,
    #  этот хендлер сработает только на тех, у которых callback_data начинается с bike_model
    @bot.callback_query_handler(func=lambda call: call.data.startswith('bike_model'))
    def reg(call):
        # получаем модель велика
        bike_model = call.data.split('|')[1]
        chat_id = call.message.chat.id
        conn = sqlite3.connect('db.db')
        cursor = conn.cursor()
        cursor.execute(f"UPDATE users SET brand = {bike_model} WHERE chat_id = {chat_id}")
        conn.commit()
        conn.close()
        bot.send_message(chat_id, f'Записали!\nИдем дальше.')
        mes = bot.send_message(chat_id, 'Введите серийный номер')
        bot.register_next_step_handler(mes, serial_number)
    
    def serial_number(message):
      ...

    Дальше идет стандартная череда функций с register_next_step_handler
    Ответ написан
    1 комментарий
  • Как можно оптимизировать код на python?

    @twistfire92
    Python backend developer
    Вы пропустили num==7. В этом случае conf сделал равным 1
    confs = [.9, .8, .8, .77, .8, .8, .85, 1, .85, .8, .8]
    for num, conf in enumerate(confs):

    и удаляем все if elif ниже
    Ответ написан
    Комментировать
  • Как исправить ошибку при получении нового сообщения?

    @twistfire92
    Python backend developer
    Предполагаю, что надо искать не в event.message, а в event.message.text или event.message.raw_text

    if "Первый, кто напишет" in event.message.text:
        ...
    Ответ написан
  • Как только при помощи метода putpixel в pillow нарисовать триугольник?

    @twistfire92
    Python backend developer
    Треугольник - фигура ограниченная тремя линиями. Каждая линия может быть описана уравнением прямой
    y=ax+b
    Задача в итоге сводится к задаче определения принадлежности точки к фигуре.
    Пробегаете по всем пикселям изображения, если точка принадлежит фигуре - закрашиваем.
    Как вариант можно сначала определить достаточные границы поиска, чтобы впустую не обходить часть изображения.
    Ответ написан
    2 комментария
  • Как сделать добавление счета и сохранение в телеграмм боте?

    @twistfire92
    Python backend developer
    Да, нужно что-то, что будет хранить данные не в оперативной памяти. Обычно для этого используют базы данных.

    Если вы только начинаете делать первые шаги в программировании, попробуйте поработать с файлами.
    Прочитали данные из файла, изменили как вам надо, перезаписали файл.
    Информации по работе с файлами в python очень много.

    Потом можете переходить на sql. Для начала достаточно sqlite, да и в python есть для этого своя библиотека.
    Ответ написан
    Комментировать
  • Как сделать так чтобы бот реагировал на сообщения внутри текста?

    @twistfire92
    Python backend developer
    if "ясно" in message.text.lower():
        ...
    Ответ написан
    Комментировать
  • Как сократить условие python?

    @twistfire92
    Python backend developer
    если хотите условие "ни один не равен нулю", используйте
    all([a, b, c])
    где a, b, c - отличные от 0 значения (Если быть точнее, значения эквивалентные True)

    Также существует функция any(). Тоже принимает список значений и проверяет, чтобы хотя бы одно значение было эквивалентно True.

    Как это использовать - задача из области булевой алгебры, 10 класс.
    Ответ написан
    Комментировать
  • Как обработать исключение missing required arguments?

    @twistfire92
    Python backend developer
    В общем через конструкцию try except ловим ошибку TypeError, либо просто приводим ее к строке, либо вытаскиваем первый элемент из args.
    Поиграйтесь с этим кодом, чтобы понять о чем речь
    def foo(name, last_name, age, email):
        return f'{name}, {last_name}, {age}, {email}'
    
    try:
        foo('Vasya')
    except TypeError as e:
        error_text = e.args[0] #  или error_text = str(e)
        print(error_text)


    Дальше можете парсить текст ошибки как вам угодно. Регулярками, или с помощью error_text.split(':') или еще как хотите.
    Ответ написан
    2 комментария
  • Ошибка SyntaxError: invalid syntax как исправить?

    @twistfire92
    Python backend developer
    когда словарь заполняется, элементы словаря перечисляются через запятую
    Ответ написан
    Комментировать
  • Текст не выводится в нужном формате. Почему?

    @twistfire92
    Python backend developer
    Вот предлагаю поиграться с этим кодом. Накидал что первое в голову пришло, но без всяких индексов i j в которых можно легко запутаться
    s = 'Вот какая-то длинная строка, ниже я установил лимит. Строка разбивается на подстроки по длине не превосходящей этот лимит.'
    limit = 20
    
    
    def foo(s, limit):
        rows=[]
        current_row=[]
        length=0
        lst = s.split()
        for word in lst:
            if limit <= (length + len(word) + 1):
                rows.append(' '.join(current_row))
                current_row=[word]
                length = len(word)+1
            else:
                length += len(word)+1
                current_row.append(word)
        rows.append(' '.join(current_row))
    
        return('\n'.join(rows))
    
    print(foo(s, limit))
    Ответ написан
    1 комментарий
  • Как передать значение res[0] в следующий шаг step_2 для создания SQL запроса?

    @twistfire92
    Python backend developer
    Выносите хендлер из функции.
    Если вы хотите через register_next_step_handler передать параметры какие-либо, передавайте их третьим и далее параметром. Пример можете посмотреть в ответах тут.
    Ответ написан
    2 комментария
  • Отправка заявок админу бота?

    @twistfire92
    Python backend developer
    Гуглите aiogram FSM
    Ответ написан
    Комментировать
  • Как сделать, чтобы заработал отклик кнопок telebot-calendar?

    @twistfire92
    Python backend developer
    @bot.callback_query_handler(func=lambda call: call.data.startswith(calendar_1.prefix))
    Ответ написан
    2 комментария
  • Почему неправильно страбатывают матемитические действия в SQLite3?

    @twistfire92
    Python backend developer
    Ваша программа работает ровно так, как вы и написали))
    не заметили закономерность?
    Ставка 46. 1777-46=1731
    Ставка 32. 1731-32=1699.
    Вы прежде чем балланс выводить, вычитайте из него ставку. А так вы выводите предыдущий балланс.

    И вообще прятать логику и вычисления в SQL запросы такая себе идея. вытащите все вычисления из запросов. Записывайте только результат.
    Ответ написан
  • Traceback (most recent call last): File 'tbot.py' line 111 in bot.polling()?

    @twistfire92
    Python backend developer
    трейсбеки читайте снизу вверх.
    Ошибка у вас
    File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\random.py", line 378, in choice
        return seq[self._randbelow(len(seq))]
    IndexError: list index out of range

    Значит пытаетесь обратиться по несуществующему индексу. Выясняйте что не так
    Ответ написан
    2 комментария
  • Как в telebot циклом for заполнить словарь?

    @twistfire92
    Python backend developer
    Поиграйтесь с этим кодом
    import telebot
    
    bot = telebot.TeleBot(token='XXXXXXXXXXXXXXXXXXXX')
    
    
    @bot.message_handler(content_types=["text"])
    def get_text_messages(message):
        if message.text == "Привет":
            bot.send_message(message.from_user.id, "Начнем")
            start(message)
        elif message.text == "/help":
            bot.send_message(message.from_user.id, "Напиши Привет")
        else:
            bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")
    
    
    # Точка старта.
    def start(message):
        # Инициализируем наш словарь, который будем прокидывать в каждую функцию
        data = {}
        mes = bot.send_message(message.from_user.id, "Введите количество бриллиантов:")
        bot.register_next_step_handler(mes, vvod_brill, data)
    
    
    # Получаем бриллианты
    def vvod_brill(message, data):
        if not message.text.isdigit():
            bot.send_message(message.from_user.id, "Нужно ввести число")
            bot.register_next_step_handler(message, vvod_brill, data)
        else:
            brill_count = int(message.text)
            data['brill_count'] = brill_count
            bot.send_message(message.from_user.id, f"Получено бриллиантов: {brill_count}")
            bot.send_message(message.from_user.id, "Введите количество рубинов:")
            bot.register_next_step_handler(message, vvod_rub, data)
    
    
    # Получаем рубины
    def vvod_rub(message, data):
        if not message.text.isdigit():
            bot.send_message(message.from_user.id, "Нужно ввести число")
            bot.register_next_step_handler(message, vvod_rub, data)
        else:
            rub_count = int(message.text)
            data['rub_count'] = rub_count
            bot.send_message(message.from_user.id, f"Получено рубинов: {rub_count}")
            bot.send_message(message.from_user.id, "Введите количество жителей:")
            bot.register_next_step_handler(message, vvod_jit, data)
    
    
    # Получаем количество жителей
    def vvod_jit(message, data):
        if not message.text.isdigit():
            bot.send_message(message.from_user.id, "Нужно ввести число")
            bot.register_next_step_handler(message, vvod_jit, data)
        else:
            jit_count = int(message.text)
            data['jit_count'] = jit_count
            bot.send_message(message.from_user.id, f"Всего жителей: {jit_count}")
            counter = 1
            bot.send_message(message.from_user.id, f"Сколько заработал кубков житель {counter}?")
            bot.register_next_step_handler(message, vvod_cubok, data, counter)
    
    
    # Получаем количество кубков для каждого
    def vvod_cubok(message, data, counter):
        if not message.text.isdigit():
            bot.send_message(message.from_user.id, "Нужно ввести число")
            bot.register_next_step_handler(message, vvod_cubok, data, counter)
        else:
            cubok_count = int(message.text)
            data[f'jit_{counter}_cubok'] = cubok_count
            bot.send_message(message.from_user.id, f"Житель {counter} заработал {cubok_count} кубков")
            counter += 1
            if counter <= data['jit_count']:
                bot.send_message(message.from_user.id, f"Сколько заработал кубков житель {counter}?")
                bot.register_next_step_handler(message, vvod_cubok, data, counter)
            else:
                bot.send_message(message.from_user.id, 'А теперь посмотрим что у нас вышло')
                bot.send_message(message.from_user.id, f'{data}')
    
    
    if __name__ == '__main__':
        bot.polling()

    Я тут набросал основной алгоритм без логики. Я думаю по аналогии справитесь с остальным. Запустите, посмотрите что выводит в конце.
    Вам надо будет доработать свою логику и добавить обработку когда количество жителей 0. Сейчас про одного все равно спрашивается.
    Ответ написан
  • Как получить список дат на неделе?

    @twistfire92
    Python backend developer
    Если удобно вводить даты как '2022-04-03', т.е. в ISO формате, то можно делать так:

    import calendar
    import datetime
    
    def weekdays(input_day):
    	my_day = datetime.date.fromisoformat(input_day)
    	c = calendar.Calendar()
    	for week in c.monthdatescalendar(2022, 4):
    	    if my_day in week:
    	    	return[f'{weekday.year}-{weekday.month}-{weekday.day}' for weekday in week]
    
    print(weekdays('2022-04-03'))

    Если момент с входным форматом принципиален, то строку
    my_day = datetime.date.fromisoformat(input_day)
    можно заменить на
    year, month, day = map(int, input_day.split('-'))
    my_day = datetime.date(year, month, day)
    Ответ написан
    Комментировать
  • Как записать в отдельную функцию выбор стейта vkbottle?

    @twistfire92
    Python backend developer
    Не работал с vkbottle, но можете попробовать сделать так

    async def set_state(peer_id, lvl):
    	states = {
    		2: func.Data.SecondLvl,
    		3: func.Data.ThirdLvl,
    		4: func.Data.FourthLvl,
    		5: func.Data.FifthLvl,
    		6: func.Data.SixthLvl,
    		7: func.Data.SeventhLvl
    	}
    	await bot.state_dispenser.set(peer_id, states[lvl])
    
    @bot.on.private_message(payload = {"cmd":"yeslvlup"})
    async def yeslvlup(message: Message):
        lvl = 1+base.output_lvl(message.peer_id)
        base.input_lvl(message.peer_id,lvl)
        await set_state(message.peer_id, lvl)
        await message.text(
            "Уровень повышен",
            keyboard = Keyboard(one_time = True)
            .add(Text("Продолжить"), color = KeyboardButtonColor.PRIMARY)
            )
    Ответ написан
    Комментировать
  • Как использовать фикстуры в параметризации тестов?

    @twistfire92
    Python backend developer
    Вам надо в параметрах передавать название фикстуры, а в тесте вытаскивать ее через request
    Вот пример

    # conftest.py
    
    @pytest.fixture
    def a_fixture():
        return 'a'
    
    @pytest.fixture
    def b_fixture():
        return 'b'


    # модуль с тестами
    
    @mark.parametrize('data_param, expected', [('a_fixture', 'a'), ('b_fixture', 'b')])
    def test_sample(data_param, expected, request: pytest.FixtureRequest):
        data = request.getfixturevalue(data_param)
        assert data == expected
    Ответ написан
    Комментировать
  • Как выводить боту команду через кнопку, отличающуюся от текста на ней?

    @twistfire92
    Python backend developer
    никак через такие кнопки этого не сделать.

    Пользуйся Inline кнопками, там и о командах не надо будет париться
    Ответ написан
    Комментировать