Задать вопрос
Ответы пользователя по тегу Python
  • Как сделать, чтобы телеграм бот принимал обрабатывал сообщение по команде?

    Vindicar
    @Vindicar
    RTFM!
    человек вводил команду(/start например), после этого бот просил написать что нибудь, человек писал какой то текст и бот что то делал с ним

    Тебе нужны Finite State Machines (автоматы состояний). Стоит почитать, что это вообще такое.
    Проблема в том, что в pyTelegramBotAPI их реализации из коробки вроде нет. Есть сторонние библиотеки, которые нужно искать. Ну или реализовывать самому.

    Идея, в общем-то, простая: тебе нужно для каждого пользователя хранить его текущее состояние (например, ввёл он команду /start или нет). Тогда в обработчике сообщения ты сможешь узнать состояние этого пользователя, и решить, что делать с этим сообщением.
    Сложности будут, когда тебе потребуется хранить какие-то ещё данные вместе с сообщением.
    Ответ написан
    Комментировать
  • Как искать процесс с помощью регулярного выражения?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почитай, как пользоваться регулярными выражениями.

    Создаёшь объект регулярки по твоему шаблону с помощью re.compile(), потом у этого объекта вызываешь метод match(), чтобы проверить совпадение строки с этим шаблоном. Если match() вернул не None - строка совпала.
    Ответ написан
  • Не работает условие Python, SQLite как решить и почему?

    Vindicar
    @Vindicar
    RTFM!
    1. chat_verification = {message.chat.id}
    chat_verification - это множество из одного элемента, вместо простого значения. Зачем?
    2.
    cursor.execute(f"SELECT chat_id FROM chat_id_table WHERE chat_id ='{chat_verification}' AND verification = 1")

    Никогда не используй f-строки. С целыми числами прокатит, со строками - очень рискованно. Используй подстановку параметров.
    cursor.execute("SELECT chat_id FROM chat_id_table WHERE chat_id = ? AND verification = 1", (message.chat.id, ))

    3.
    check = cursor.execute(...
    if check is True:

    execute() вернёт ссылку на всё тот же cursor, независимо от запроса. Тебе нужно выбрать строку из этого курсора с помощью метода fetchone(). Метод вернёт или кортеж с одним значением chat_id, или None, если ни одна строка не удовлетворяет условию.
    cursor.execute("SELECT chat_id FROM chat_id_table WHERE chat_id = ? AND verification = 1", (message.chat.id, ))
    result = cursor.fetchone()
    if result is None:
        print('Нет такой строки')
    else:
        chat_id = result[0]
        print('есть результат:', chat_id)
    Ответ написан
  • Как вывести данные из массива в сообщение?

    Vindicar
    @Vindicar
    RTFM!
    for product in select_db():
        @dp.callback_query_handler(text=product['name_but'])
        async def pole(message: types.message):
            await bot.send_message(message.from_user.id, product['desk'], reply_markup=but.nav_button)

    Ты делаешь глупость.
    Просто потому, что после того, как этот код отработает, созданные тобой копии обработчика pole() останутся, и будут мешать.
    Используй один, более общий обработчик callback_query_handler, и в нём уже смотри, какой текст тебе пришёл, какой пользователь его отправил, и что с этим текстом надо делать.
    Ответ написан
    1 комментарий
  • Как сделать условие в SQLite Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну так у тебя второй запрос запршивает всех пользователей, без условия.
    А вообще приведённый код не имеет смысла и не должен работать вообще никак.
    for i in cursor.fetchone("SELECT ID FROM user_info WHERE RANK = '1'"):

    Ты перебираешь столбцы в первой строке (fetchone), для которой RANK = '1'. Это при том, что запрос возвращает тебе только один столбец - ID. А ещё метод fetchone() не принимает параметров. Ты пропустил вызов execute()?

    Потом ты почему-то берёшь 0й символ этого столбца. Если он равен 1 (а он не будет равен 1, так как это символ, а не число).
    Потом ты перебираешь всех пользователей, и отправляешь им сообщения (при этом у тебя в вызове send_message() две опечатки - в имени переменной и незакрытая скобка).

    А ещё у тебя отступы кривые - почему for i с отступом?

    В общем, по такой бредятине понять, в чём дело, нереально.
    Ответ написан
    4 комментария
  • Возможно ли сделать обработку кнопки в сокете на python?

    Vindicar
    @Vindicar
    RTFM!
    WOLF3252, ты не понимаешь как работает Tkinter, для начала.
    tkinter.Button(btn_0)
    Ты попытался создать новую кнопку, передав её в качестве родителя какую-то строку (а нужно передать родительский виджет), и тут же эту кнопку выбросил, ничего с ней не сделав. Вместо того, чтобы конфигурировать (configure()) уже существующую кнопку.
    А то я думал, что только текст передавать можно

    Через сокеты можно передавать только поток байт. И точка.
    Фокус в том, как ты этот поток байт интерпретируешь, т.е. какой у тебя протокол передачи данных. Например, ты можешь решить, что будешь передавать два числа (известного размера в байтах), где первое число - номер кнопки, второе - номер цвета в некотором списке. По нажатию кнопки одна сторона сформирует и отправит эту пару чисел, а другая, увидев, что поступили новые данные, их примет, прочитает и интерпретирует. Это будет очень простой протокол, но он будет работать.

    Главная сложность в таких приложениях в другом. По умолчанию сетевые операции останавливаются (блокируют поток) на время своего выполнения. Т.е. если тебе не передали данные, а ты вызвал recv() - программа не вернётся из recv() пока данные не придут или пока соединение не разорвётся.
    А оконным приложениям для работы нужен непрерывно работающий цикл обработки действий пользователя, им нельзя "задумываться", иначе приложение на вид "зависает". Бороться с этим можно разными способами, я бы посоветовал освоить функцию select(), чтобы заранее (до вызова recv()) понять, есть ли непрочитанные данные или нет.
    Ответ написан
    Комментировать
  • Как конвертировать числа в формат доллара?

    Vindicar
    @Vindicar
    RTFM!
    >>> import locale
    >>> locale.setlocale(0, 'en-us')
    'en-us'
    >>> locale.currency(123400/100)
    '$1234.00'
    >>> locale.currency(123400/100, grouping=True)
    '$1,234.00'
    >>>
    Ответ написан
    Комментировать
  • Как поменять начало координат на выделеной области cv2?

    Vindicar
    @Vindicar
    RTFM!
    Не очень понятно, что ты имеешь ввиду. cv2 всегда сообщает клики в координатах окна. Они, как правило, совпадают с координатами внутри показанного в окне изображения: та же точка отсчёта, то же направление осей, масштаб 1:1. Единственное отличие - если ты увеличил размер окна, клик может оказаться за пределами показанного изображения.

    Если тебе нужна другая координатная система, пересчитывай координаты сам.
    Ответ написан
    Комментировать
  • Как сделать автозамену при выводе?

    Vindicar
    @Vindicar
    RTFM!
    replacements = { 10: "лошадь", 20:  "куница", 30:  "рыба", 40: "заяц" }
    barn = [1, 2, 3, 4, 10, 20, 30, 40]
    for b in barn:
        # если ключ в словаре - взять значение словаря, иначе оставить ключ как есть
        print(replacements.get(b, b))


    А вообще у тебя в одном списке разноплановые значения. Это плохо. Подумай, нельзя ли сделать другую структуру данных.
    Ответ написан
    2 комментария
  • Как получить части строки по шаблону?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как сопоставить два изображения чтобы убрать сдвиг?

    Vindicar
    @Vindicar
    RTFM!
    cv2.goodFeaturesToTrack() чтобы найти "узнаваемые точки" на каждом изображении.
    cv2.calcOpticalFlowPyrLK() чтобы понять, насколько они сдвинулись. Далее выбираешь точки вокруг интересующего объекта, вычитаешь из их позиций их предыдущие позиции, усредняешь, получаешь вектор среднего смещения за кадр. На основании этого вектора уже что-то делаешь с изображением.
    Например, если тебе нужно сглаживать резкие рывки, может иметь смысл отслеживать значение среднего смещения от кадра к кадру. Если смещение в каком-то кадре резко изменилось (заметно отличается от среднего за предыдущие N кадров), значит, кадр нужно сдвинуть.
    Ответ написан
  • Как динамично создавать кнопки?

    Vindicar
    @Vindicar
    RTFM!
    Кнопка добавляется вызовом определённого метода. Параметры метода могут быть не константами, а переменными. В Питоне есть циклы.

    Вот и всё. Выбираешь список показываемых продуктов, делаешь цикл по результатам, для каждого генерируешь кнопку, подставив сведения о продукте вместо текста кнопки.

    Единственный вопрос, как различить, какая кнопка была нажата. Тут уже зависит от библиотеки.
    Ответ написан
    Комментировать
  • Как ответить пользователю через бота?

    Vindicar
    @Vindicar
    RTFM!
    Хранить где-то (в БД, например) какое сообщение закрытого чата соответствует какому пользователю. При получении сообщения-ответа в закрытом чате узнать ID отвеченного сообщения, посмотреть в базе, какой пользователь отправил оригинал, переслать текст этому пользователю.
    Ответ написан
  • Как реализовать рекурсию в UML (диаграммы классов)?

    Vindicar
    @Vindicar
    RTFM!
    Особенно никак? Диаграмма классов не описывает содержимое методов, а приведённый код бессмысленен даже как пример.
    Можно, конечно, сделать отношение зависимости от Foo к нему же, но будет затруднительно пояснить его природу.
    Ответ написан
    Комментировать
  • Как вызвать скрипт python для работы с GPIO Raspberry Pi 3 из php файла?

    Vindicar
    @Vindicar
    RTFM!
    Подозреваю, что дело в правах - скрипт на питоне выполняется от имени пользователя веб-сервера, у которого может не быть прав на доступ к GPIO.
    Ответ написан
    Комментировать
  • Как сделать так, что бы бот работал то время, пока у меня запущена программа на пк?

    Vindicar
    @Vindicar
    RTFM!
    register_next_step_handler() нужен для сценариев из нескольких шагов, где каждый шаг выполняется один раз.
    В твоем случае достаточно простого обработчика текстовых сообщений.
    Ответ написан
    Комментировать
  • Как достать текст сообщения пользователя и вписать в description embed сообщения?

    Vindicar
    @Vindicar
    RTFM!
    await message.delete()
    embed = discord.Embed(
        description=f"{message.content}",
        color=discord.Colour.blurple(),
    )

    Ты сначала удаляешь сообщение, а потом пытаешься к нему (уже удалённому) обратиться.
    Неужели это не кажется странным?
    Ответ написан
    Комментировать
  • Как перевести декартовые координаты в полярные и найти полярный угол?

    Vindicar
    @Vindicar
    RTFM!
    Тригонометрию в школе проходили?
    Есть прямоугольный треугольник. Одна точка - начало координат О, вторая - искомая точка в декартовых координатах A, третья - её проекция на ось X (назовем точка B).
    Тогда гипотенуза - это отрезок ОA, а катеты - OB и AB. Тебе нужно найти угол AOB.
    Вспоминаем определения:
    sin AOB = |AB| / |OA| =>
    cos AOB = |OB| / |OA|
    tg AOB = |AB| / |OB|

    Как найти длину гипотенузы OA ты уже знаешь.
    Длина AB будет координатой y, а длина OB - координатой x.
    Используй любое из указанный выражений для нахождения AOB, только не забывай про коррекцию знаков (так, cos AOB не изменится, если сменить знак координаты y, а вот знак угла при этом должен измениться).
    Ответ написан
    Комментировать
  • Ошибка TypeError: 'tuple' object is not callable?

    Vindicar
    @Vindicar
    RTFM!
    result = cursor.execute("SELECT id, name, price, colvo FROM tovars").fetchone()
    return result

    fetchone() возвращает либо None, либо кортеж (tuple). Значит, get_item() возвращает None (если такой строки нет) или tuple (если она есть).

    result = get_item()
    tgitem = result()

    Ты пытаешься вызвать (call) кортеж (tuple), как будто это функция. Так нельзя, и питон тебе так и говорит:
    TypeError: 'tuple' object is not callable

    Читай учебник, что такое кортежи.
    Ответ написан
    9 комментариев
  • Как улучшить цикл for?

    Vindicar
    @Vindicar
    RTFM!
    Я вижу одну проблему: i может содержать спецсимволы регулярных выражений, а ты это не учитываешь. re.escape() в помощь.
    Также, если в списке st не так много строк (<100), может иметь смысл сделать одно регулярное выражение.
    # если список st меняется не для каждой строки, 
    # имеет смысл его подготовить один раз, заранее
    parts = '|'.join(list(map(re.escape, st)))
    regexp = re.compile(f'\\b(?:{parts})\\b', re.IGNORECASE)
    # при обработке строки md
    if match := regexp.search(md):
        print(x.group(0))
    Ответ написан
    Комментировать