• Как вставить видео в картинку?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала уточни, что ты хочешь получить в результате. Видео с рамкой? А тебе точно для этого нужна своя программа? Утилита ffmpeg может с этим справиться, хотя и муторно будет.
    Если очень хочешь сам, то пакет opencv-python в помощь, смотри классы cv2.VideoCapture() и cv2.VideoWriter(), ну и базовые операции преобразования изображения заодно.
    Потом может потребоваться перекодировать полученное видео тем же ffmpeg'ом.
    Ответ написан
  • Как создать сообщение об ошибке в написании команды?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, неплохо бы писать в вопросе сообщение об ошибке.
    Я, конечно, догадываюсь, что дело в обращении к message.reply_to_message.username, и догадываюсь, что message.reply_to_message будет иметь значение None, если сообщение не является ответом... но я могу и ошибаться.

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

    Vindicar
    @Vindicar
    RTFM!
    Отключить сайт.

    Ты можешь прибегать к разным хитростям, конечно.
    - проверка User-Agent и Referer.
    - проверка на исполнение скриптов
    - browser fingerprinting, т.е. попытка выяснить, что за браузер у клиента по его особенностям реализации

    Но в конечном итоге это будет гонка "кто лучше знает поведение реального браузера". Гонка скорее всего закончится, когда потенциальный скрапер будет дёргать твой сайт селениумом.

    Можешь попробовать зайти с другой стороны, конечно, и требовать двухфакторную авторизацию для входа. Но и это автоматизируется, а вот пользователей отпугнёшь.
    Ответ написан
    Комментировать
  • Как преобразовать значение при использовании dataclass?

    Vindicar
    @Vindicar
    RTFM!
    Я в таких случаях создаю фабричный метод.
    @dataclass
    class Person:
        first_name: str
        last_name: str
        bdate: date
    
        @classmethod
        def make(cls, first_name: str, last_name: str, bdate: str) -> 'Person':
            _bdate = datetime.strptime(bdate, '%Y%m%d').date()
            return cls(first_name=first_name, last_name=last_name, bdate=_bdate)
    
    data = {
        'first_name': 'Adam', 
        'last_name': 'Smith', 
        'bdate': '20220617'
    }
    person = Person.make(**data)

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

    Но вообще это неправильное распределение обязанностей. Обязанность датакласса - хранить данные, а не менять их представление. За смену представления пусть отвечает тот код, который получает значение строки.
    Ответ написан
    Комментировать
  • Ошибка - name 'self' is not defined. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Декоратор отрабатывает при создании собственно класса. На этот момент никаких экземпляров ещё нет.
    self имеет смысл только в контексте тела метода класса, но не "снаружи" методов.

    Так что стоит задуматься, а что именно ты пытаешься сделать. Есть ли смысл в твоём классе-обёртке?

    А если прямо очень надо, можно вспомнить, как работает декоратор, и что его можно вызывать вручную, например, в конструкторе класса.
    @some_decorator_with_params(params)
    def some_func(...):
        ...
    # это всего лишь синтаксический сахар для
    def some_func(...):
        ...
    
    decorator = some_decorator_with_params(params)
    some_func = decorator(some_func)  # вызываем декоратор вручную
    Ответ написан
    Комментировать
  • Почему Telegram бот не хочет отправлять сообщение в котором содержатся кнопки?

    Vindicar
    @Vindicar
    RTFM!
    Дай угадаю, реагирует на /start, и всё.
    Сравни с официальным примером и подумай.
    Подумал?

    - get_mood() не отмечено декоратором @bot.message_handler(), бот про эту функцию ничего не знает. Он знает только про welcome().
    - если не заметил, клавиатура должна отправляться вместе с сообщением, параметром reply_markup. Ты же отправляешь сообщение, потом создаёшь клавиатуру, и далее ничего с ней не делаешь.
    Ответ написан
    Комментировать
  • Ошибка Disnake.py, кто поможет?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же английским по белому написали: у объекта класса ApplicationCommandInteraction нет атрибута message. Если залезть в доки, его и впрямь нет. А ты зачем-то дергаешь inter.message.author. Если тебе нужен отправитель команды, то у объекта inter есть такое поле author. Почитай по ссылке.
    Ответ написан
    4 комментария
  • Почему regex работает некорректно?

    Vindicar
    @Vindicar
    RTFM!
    Упрощённый пример: что сматчит "\d+" в строке "123456"? Очевидно, всё - потому что умолчанию квантификаторы + и * жадные, т.е. пытаются сматчить как можно больше. У тебя .* - т.е. "матчи всё подряд, сколько получится", а ограничивается только тем, что "дальше должна идти запятая и пробел". Обрати внимание на ещё одну запятую с пробелом в конце твоей строки data.
    Что делать?
    а) сделать квантификатор не жадным: type=(.*?), Тогда он будет пытаться сматчить как можно меньше.
    б) уточнить, какие именно символы могут захватываться группой type=([a-zA-Z0-9_]+),
    Ответ написан
    Комментировать
  • Как игровые движки понимают инородные языки?

    Vindicar
    @Vindicar
    RTFM!
    1. Встраивают интерпретатор нужного языка, при необходимости урезают стандартную библиотеку (чтобы не давать коду плагинов лишних возможностей) и подсовывают туда средства общения с хост-программой.
    2. Если нет нужды изолировать плагин от остальной программы, то полагаю что да, накладные расходы на поддержку плагинов уменьшатся в случае, когда плагин написан на том же языке, что и программа. В противном случае организация "песочницы" может занять столько же усилий, сколько встраивание интерпретатора.
    3. Лучше, если язык плагина является или интерпретируемым (как Lua или JS), или компилируется в байткод (как Python/Java/C#). Также желательно, чтобы язык плагина имел средства интроспекции.
    Ответ написан
    Комментировать
  • Как исправить ошибку при использование requests python3?

    Vindicar
    @Vindicar
    RTFM!
    requests не умеет "догадываться" об используемом протоколе, это не браузер, который тупо подставлят https:// где надо и где не надо.
    Тебе придётся указывать протокол (либо https:// либо http://, зависит от ресурса) самому в начале запрашиваемой ссылки.
    Ответ написан
    Комментировать
  • Как создать окно с кнопкой Старт Стоп для данного кода?

    Vindicar
    @Vindicar
    RTFM!
    # if the 'q' key is pressed, stop the loop
    if key == ord("q"):
        break

    А зачем останавливать отладку, когда у тебя уже в коде есть выход по горячей клавише? Или код не твой, ты просто разместил объяву?
    А вообще GUI-средства cv2 нужны сугубо для отладки и для экспериментов, они мало подходят для написания сложного приложения. Так что если хочешь кнопки и поля ввода, придётся дружить cv2 с каким-то GUI-фреймворком.
    Ответ написан
    Комментировать
  • Как связать WEB UI с Python?

    Vindicar
    @Vindicar
    RTFM!
    Пусть Flask-приложение стартует первым и запускает твой worker-скрипт в отдельном процессе. Так они друг другу мешать не будут, и если твой worker вылетит, Flask выживет и сможет сообщить о случившемся (ну и перезапустить worker, если надо будет).
    Вопрос тут в выборе способа обмена данными между скриптом и Flask, а также между Flask и браузером.

    1. Worker -> Flask:
    - запуск worker через multiprocessing, обмен данными через очередь (multiprocessing.Queue).
    Плюс: возможен обмен простыми структурами данных, типа списков и кортежей.
    Минус: требует переделки скрипта-worker, чтобы вместо print() он отправлял данные в Queue, да и в целом его надо будет импортировать в Flask-приложение. Что-то кроме питона той же версии так не запустишь.
    - запуск worker через subprocess, обмен данными через перехват stdout.
    Плюс: worker остаётся без изменений, и может быть запущен отдельно. Строго говоря, любая консольная программа, не требующая ввода, может быть так запущена.
    Минус: обмен данными только как последовательность строк. Что-то другое потребует сериализации на стороне воркера, и десериализации на стороне Flask.

    2. Flask -> browser:
    - Самый простой и дубовый способ - long-running request.
    Твой обработчик запроса на Flask запускает воркера, но не закрывает соединение, а потихоньку читает поступающие от воркера данные и отдаёт клиенту. Проблема в том, что если клиент отрубился, восстановить соединение будет нельзя.
    - Чуточку более сложный - polling. Один обработчик запроса на Flask запускает воркера и всё. Другой обработчик пытается прочитать накопившиеся у воркера данные, и отдаёт их клиенту. Тогда на клиенте должен крутиться JS-скрипт, который будет периодически дергать второй обработчик. Проблема в том, что если данные от воркера долго не считываются (клиент отключился), очередь/pipe для связи между процессами переполнится, и воркер "подвиснет" на операции отдачи данных Flask. Также этот подход не будет работать с двумя и более клиентами.
    - Ещё более сложный, но надёжный - buffered polling. Данные от worker помещаются в какое-то хранилище (грубо говоря, в переменную). Хранилище может хранить как полную историю вывода, так и только последний полученный блок данных - смотря что тебе интересно. Тогда Flask-приложение должно отдельным потоком забирать данные у worker, и помещать их в хранилище. Основной поток будет обслуживать запросы, и отдельный обработчик запроса будет отдавать клиенту текущее состояние хранилища (целиком или последние изменения, смотря сколько хранишь).
    Плюс: такая схема будет работать при любом разумном числе клиентов, в том числе при нуле.
    Минус: доступ к хранилищу нужно аккуратно синхронизировать, например, с помощью threading.Lock().
    Ответ написан
    Комментировать
  • Почему не записываются данные в бд?

    Vindicar
    @Vindicar
    RTFM!
    def user_exists(self, user_id):
        with self.connection:
            ...
    def add_user(self, user_id):
        with self.connection:


    По выходу из блока with соединение закроется. Второй блок with его уже не переоткроет.
    В таких ситуациях блок with использовать не надо.
    Ответ написан
    Комментировать
  • Как дать имя отдельным секторам в изображении?

    Vindicar
    @Vindicar
    RTFM!
    Вообще ответ зависит от конкретной задачи.
    У тебя преобразование каждого кусочка идёт независимо от остальных?
    Если да, то всё сильно упрощается. Опиши функцию вида:
    def process_one_part(part: numpy.ndarray) -> numpy.ndarray:
        ...

    Которая будет обрабатывать один фрагмент изображения.
    А дальше собрать их абсолютно тривиально, точно также, как ты их резал:
    # пустое изображение такого же размера, как исходное, с тремя каналами по 8 бит на канал
    # если на выходе у тебя другое число каналов или тип данных, поправишь
    result = numpy.zeros(image.shape[:2] + (3,), numpy.uint8)
    
    for i in range(img_h // bl_h):
      for j in range(img_w // bl_w):
        cropped = image[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w]
        processed = process_one_part(cropped)
        # нужно, чтобы присваиваемый фрагмент имел такой же размер, как "окно" присваивания
        result[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w] = processed
    # дальше делаешь с result что тебе нужно


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

    Vindicar
    @Vindicar
    RTFM!
    Зависит от того, какое API предлагает твой источник данных о курсе.
    Если он работает просто в режиме "запрос-ответ", то единственный вариант - периодически его опрашивать и смотреть, насколько изменился курс. По какому алгоритму определять, значимое ли изменение, решай сам, так как постоянные мелкие колебания наверняка будут.
    Если же он позволяет так или иначе получать оповещение об изменении курса, можешь попробовать задействовать этот канал. Тут ключевая задача - добиться выполнения питон-кода в ответ на оповещение от сервиса.

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

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала неплохо бы внятно описать, как задаются желаемые элементы.
    Если по индексам, то да, твоё решение через __getitem__() вполне работоспособно.
    import typing as t
    lst = ['a', 'b', 'c', 'd', 'e']  #  не называй переменную list
    
    def split(lst: t.List[t.Any], indices: t.Iterable[int]) -> t.Tuple[t.List[t.Any], t.List[t.Any]]:
        selected = list(map(lst.__getitem__, indices))
        remainder = list(lst)
        # удаляем с конца, чтобы еще не обработанные индексы не поехали
        # вот только с отрицательными индексами это уже не прокатит
        # их придётся самомму пересчитывать в положительные
        for i in sorted(indices, reverse=True):
            del remainder[i]
        return selected, remainder
    
    print(split(lst, [0, 3]))  # (['a', 'd'], ['b', 'c', 'e'])
    Ответ написан
    1 комментарий
  • Как в легенде диаграммы сделать один из элементов в конце списка?

    Vindicar
    @Vindicar
    RTFM!
    Сортируй без "Другие", а его добавляй уже после сортировки.
    Ответ написан
    Комментировать
  • Как вызвать файловый диалог Windows без сторонних библиотек (Python)?

    Vindicar
    @Vindicar
    RTFM!
    comdlg32.dll в помощь, в частности GetOpenFileNameA().
    Более новые диалоги используют Component Object Model для работы. Сразу скажу, мне доводилось общаться с COM-интерфейсами на чистом ctypes, и это тот ещё гемморой.
    Ответ написан
    Комментировать
  • Как в хендлер инлайн кнопки добавить значение, которое введёт пользователь?

    Vindicar
    @Vindicar
    RTFM!
    Не уверен, что у тебя за либа, но читай про state machine. Эта фишка есть во многих библиотеках для создания ботов.
    Ответ написан
  • Реализация многопоточности в vk bot?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, что должен делать этот новый поток?
    Оформи его действия отдельной функцией, и её и задавай.
    Другой вопрос, ты уверен что тебе нужны потоки для этого? И уверен ли ты, что с vk-api можно работать из нескольких потоков?
    Ответ написан