• Обработка нажатия кнопки в телеграмм боте?

    @SwitcherN
    Начинаю изучать python
    Во-первых, надо определиться каким образом вы выводите кнопку - от этого отличаются методы обработки событий.

    Есть два вида кнопок - это кастомной клавиатура, которая заменяет собой стандартную клавиатуру, либо онлайн кнопки - выводятся под сообщением. Для того и другого варианта не забудь импортировать библиотеку:

    from telebot import types

    1. Генерация кастомной клавиатуры.

    Я делал отдельную функцию для генерации клавиатуры, которая получает в качестве аргументов. Создание клавиатуры выглядет следующим образом:

    keyboard = utilits.generate_keyboard('Сделать заказ', 'Хочу скидку на заказ', 'Изменить персональную информацию')
    bot.send_message(message.chat.id, msg, reply_markup=keyboard)


    Тут создаем keyboard с помощью функции generate_keyboard, которая у меня лежит в файле utilits. Передаем в качестве аргументов то, что должно быть написано на кнопках.

    Сама функция generate_keyboard:

    def generate_keyboard (*answer):
        keyboard = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
        for item in answer:
            button = types.KeyboardButton(item)
            keyboard.add(button)
        return keyboard


    Здесь вызываем метод ReplyKeyboardMarkup из библиотеки types. Дальше проходимся итеративно по полученным аргументам и генерируем кнопки попутно добавляя кнопки к клавиатуре - keyboard.add(button).
    Возвращаем собранную клавиатуру.

    Далее обрабатываем полученный ответ. Я для обработки полученного ответа придумал следующий костыль - статус каждого клиента, который храню вместе с его ID в базе данных. Статус - по сути место каждого клиента на пути к оформлению заказа:

    @bot.message_handler(content_types=["text"])
    def check_text_message(message):
        status = int()
        try:
            status = config.current_users[message.chat.id][0]
        except Exception as er:
            status = 0
        if status == 0:
            bot.send_message(message.chat.id, 'Извините, я запутался. Давайте начнем сначала')
            first_step(message)
        elif status == 10:
            if message.text == 'Сделать заказ':
                Dialogs.order(message) ...


    То есть проверяю статус - "elif status == 10:"
    Если мы тут и получаем ответ "Сделать заказ", то выводим следующее сообщение, которое генерируем с помощью функции order - "Dialogs.order(message)". Эта же функция у меня и меняет статус, сохраняя его по пути в БД, на случай если бот "ляжет" и забудет кто на каком этапе находиться.

    2. Генерация онлайн клавиатуры.

    Все очень походе. Вот так генерирую такой тип клавиатуры, но тут необходимо помимо надписи на самой кнопке задать еще и команду, по которой мы и будем событие обрабатывать дополнительно (callback_data):

    keyboard = utilits.generate_inline_keyboard(['Имя', 'change_name'],
                                                     ['Телефон', 'change_phone'],
                                                     ['️Адрес', 'change_adress'],
                                                     ['Вернуться обратно', 'back'])


    def generate_inline_keyboard (*answer):
        keyboard = types.InlineKeyboardMarkup()
        temp_buttons = []
        for i in answer:
            temp_buttons.append(types.InlineKeyboardButton(text=i[0], callback_data=i[1]))
        keyboard.add(*temp_buttons)
        return keyboard


    А это обработка событий. Тут проще, можно обрабатывать не через статус, а по конкретной callback_data:

    @bot.callback_query_handler(func=lambda call: True)
    def ans(call):
        try:
            message = call.message
            if call.data == 'change_name':
                Dialogs.change_name(message)
            elif call.data == 'change_phone': ...
    Ответ написан
    Комментировать
  • Как сбросить пароль в macOS?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Судя по всему у вас повреждено криптохранилище. Поврежден именно сам ключ, которым подписаны данные.
    В общем, печальные новости для вас раз сброс пароля не помог. А так проблема не новая.
    Переустанавливайте ОС и восстанавливайте данные из TimeMachine.
    Ответ написан
    Комментировать
  • Ничего не выводит,почему?

    32bit_me
    @32bit_me
    Программист, встраиваемые системы
    #include<iostream>
    using namespace std;
    int main()
    {
        int sogl = 0;
        //const char n = 20;
        //const char b = 20;
        string s = { "bcdfghjklmnpqrstvwxz" }; // согласные буквы
        string h = { "Lolikom" }; // слово в котором согласных букв = 4
       
        for (int i = 0; i < h.size(); i++)
        {
    
            for (int j = 0; j < s.size(); j++)
            {
                if (tolower(h[i]) == s[j])
                    sogl++;
            }
        }
        cout << sogl ;
        return 0;
    }
    Ответ написан
    1 комментарий
  • С чем связанна проблема кодировки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ответ.
    Это может быть связано с неправильной работой с кодировками.
    А именно перекодирование происходит:
    - не в ту кодировку
    - не из той кодировки.
    Обычно неопытные программисты не хотят разбираться с тем как правильно работать с кодировками и что такое юникод, а все проблемы решают методом тыка меняя код пока проблема не исчезнет. Из-за этого у них часто присходят преобразования по умолчанию, которые ломаются при смене операционной системы, при запуске другим спообом (из терминала, от имени другого пользователя, через крон...), при смене умолчаний (локали, настроек терминала, настроек БД).
    А ещё такие неопытные программисты до жути боятся сообщений об ошибках, но решать настоящие пролемы не хотят и гасят их в бесшумном режиме, отчего реальные проблемы маскируются под глобальныйми молчаливыми пустыми обработчиками ошибок. Это приводит к усложнению внутреннего поведения программы и вот таки вот случаям, как у вас.
    Когда у таких программистов возникают проблемы (а за ними дело не встанет), то эти программисты не описывают проблему детально, не показывают исходный код, не обрисовывают архитектуру своей системы, а просто спрашивают в чем может быть проблема.
    Исчерпывающий ответ на такой вопрос дать несложно. Вот он.
    Ответ написан
    Комментировать
  • Проблема с телеграмм ботон на питоне, сам только учусь, поэтому не понимаю ошибка (NameError: name 'InlineKeyboardButton' is not defined) поможете?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    У вас InlineKeyboardButton непонятно откуда берется
    from telebot import types
    
    btn1 = types.InlineKeyboardButton(text = 'Да', callback_data = 'Yes')
    btn2 = types.InlineKeyboardButton(text = 'Нет', callback_data = 'No')
    Ответ написан
    1 комментарий
  • Как можно провести сравнение в цикле?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Эту всю простыню:
    (getattr(obj, fields[0]) == getattr(obj_ok, fields[0])) and (
    getattr(obj, fields[1]) == getattr(obj_ok, fields[1])) and (
    getattr(obj, fields[2]) == getattr(obj_ok, fields[2])) and (
    getattr(obj, fields[3]) == getattr(obj_ok, fields[3])) and (
    getattr(obj, fields[4]) == getattr(obj_ok, fields[4])) and (
    getattr(obj, fields[5]) == getattr(obj_ok, fields[5])) and (
    getattr(obj, fields[6]) == getattr(obj_ok, fields[6])):


    Можно на это заменить:
    all(getattr(obj, x) == getattr(obj_ok, x) for x in fields)
    Ответ написан
    1 комментарий
  • Как в классе из init передать переменную в другую функцию?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    wd = WorkDb(number)
    wd.get_db()

    Почитай про классы.
    Ответ написан
    1 комментарий
  • Проблемы при установки библиотеки?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Вы криво удалили предыдущую версию Python. После удаления в системных переменных Path остались пути к удаленному Python'у.
    Ответ написан
    3 комментария
  • Как сделать так чтобы пользователь мог сам ввести размер массива?

    GavriKos
    @GavriKos
    Читайте про динамическое выделение памяти. Стандартная тема.
    Можно еще коллекции из std зацепить
    Ответ написан
    Комментировать
  • Как сортировать массив с рандомными значениями?

    @res2001
    Developer, ex-admin
    До сортировки дело не доходит.
    1. тут:
    int i, a, n, j, b, d;
    int x[i];

    Как вы думаете, какой размерности будет массив х после этого объявления?
    2. в цикле генерации рандомного массива:
    for(d=0; d < n; d++)
      x[i] = rand();

    Какому элементу массива вы присваиваете значение?
    3. printf("%d", x[i]);
    Какой элемент выводится? Сколько элементом выведется?

    А это вообще праздник какой-то:
    system("chcp 1251");
      system("cls");
      system("title Pr101");
      system("Color F0");

    Но ошибки тут нет :)
    Ответ написан
    Комментировать
  • У меня калькулятор выводит целое число почему?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Оба операнда деления целочисленные, соответственно результат тоже целочисленный.
    y = (c * 1.) / d;
    Ответ написан
    Комментировать
  • У меня калькулятор выводит целое число почему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    y = c / d;

    Вы делите целое число на целое. В языке С в этом случае происходит деление нацело. Чтобы в результате был float, вам надо один из операндов перобразовать во float/double. Можно или явно это написать, или просто прибавить 0.0:

    y = (c + 0.0) / d;
    Ответ написан
    2 комментария
  • Верно ли решено задание?

    EgoRusMarch
    @EgoRusMarch
    C++ Developer
    Перепутал конъюнкцию с дизъюнкцией:
    const int  x = 7;
    const bool A = true;
    const bool B = false;
    
    std::cout << std::boolalpha
              << A && B || !(x*x < 12 && 2*x <= 5) || std::exp(x-1) > 7
              << std::endl;
    Ответ написан
    2 комментария
  • Объясните пожалуйста на каком моменте кода я получил случайное число в выводе?

    fzfx
    @fzfx
    18,5 дм
    вот на этом:
    int c;
    если вы не хотите получать подобные ошибки, не забывайте, что перед использованием переменной её надо объявить и инициализировать. вы сделали только первое.
    Ответ написан
    3 комментария
  • Как сложить все элементы массива, не используя цикл C++?

    @poniyur
    #include <iostream>
    #include <numeric>
    
    int main (){
       const int arrayLength = 3; // раз уж вы пользуетесь массивом, то и длину точно знаете
       int students[arrayLength] = { 1, 4, 7 };   
       int sum = std::accumulate(students, students + arrayLength, 0);
       std::cout << "The array sum is " << sum << std::endl;
       return 0;
    }
    Ответ написан
    2 комментария
  • Как правильно работать с функциями?

    @lnxlnxlnx
    Перед return Status;
    Область видимости функции начинается с открытия фигурной скобки, соответсвенно выход - при закрытии. Советую, перед написаниям продуктов ПО, изучить язык на более лёгком уровне
    Ответ написан
    4 комментария
  • Почему работает (++i)++, но не работает ++(i++)?

    15432
    @15432
    Системный программист ^_^
    (i++) возвращает число, константу, если упрощенно. Которую нельзя инкрементить, потому что это не переменная

    (++i) же возвращает ссылку на переменную, которую можно инкрементнуть ещё раз.

    например, ++(++i) - можно. (i++)++ - нельзя.
    Ответ написан
    3 комментария
  • Как переделать функцию сортировки вставками по убыванию?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Поменяйте < на > там, где у вас сравниваются элементы. Подсказка: у вас массив передан двумя int указателями. Т.е. сами элементы - это там где вы разименовываете какие-то указатели (это операция *что-то).
    Ответ написан
    Комментировать
  • Что неправильного?

    maaGames
    @maaGames
    Погроммирую программы
    1/3 = 0
    Ответ написан
    Комментировать
  • Не могу разобраться со структурами в С++. Как решить задачу?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    string Name[n];

    Зачем вам массив строк? std::string уже внутри сам управляет массивами.

    Раз у вас c++, то используйте только std::string (массивы чаров обычно понадобятся для взаимодействия с Си-шными библиотеками).

    struct info {
        std::string Name;
        int H;
        char Sex;
    };


    В качестве структуры для хранение возьмите std::vector.
    Пример работы с ним в вашем случае:
    std::vector<info> people;
    info man = WriteStruct(info);
    people.push_back(man);

    Пройти по массиву можно вот так:
    for (int i = 0; i < people.size(); i++) {
       info man = people[i];
    }


    upd: WriteStruct следует переименовать в ReadStruct, т.к. это названее лучше описывает происходящий в ней процесс.
    Ответ написан
    3 комментария