• Ошибка декодирования строки в base64, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Invalid base64-encoded string: number of data characters (1097) cannot be 1 more than a multiple of 4

    У тебя левые данные в декодируемой строке. Какой-нибудь перевод строки (\n) или подобное не затесался в начало/конец?
    Ответ написан
    Комментировать
  • Как найти одно изображение на другом изображении?

    Vindicar
    @Vindicar
    RTFM!
    Терминология для гуглинга: "Локализация объекта методами компьтерного зрения".
    В качестве инструментария можешь использовать opencv. Для питона это pip пакет python-opencv (импортируется под именем cv2).

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

    Подходы существуют разные. Если не требуется дикоре быстродействие, то можно использовать детектор SIFT.
    Тогда у тебя будет алгоритм вида:
    0. Создаёшь детектор (функция cv2.SIFT.create()) и матчер (можно cv2.BFMatcher(), он тормознутый но простой в использовании).
    1. Грузишь образец искомого объекта и преобразуешь изображения (палитра серого, и т.п.)
    2. Вызываешь метод детектора .detectAndCompute(), чтобы получить найденные особые точки (углы и т.п.) и их описание.
    3. Повторяешь шаги 1,2 для анализируемого изображения (сцены).
    4. У матчера вызываешь метод .knnMatch() c n=2. Это даст тебе 2 лучших совпадения между образцом и сценой по каждой особой точке.
    5. Можно просто брать лучшее совпадение, а можно отсеять те особые точки, у которых два ближайших совпадения слишком похожи - они отсеялись.
    Так или иначе, у тебя должен получиться список пар точек вида "точка на образце - найденная похожая точка на сцене".
    6. Используешь функцию cv2.findHomography() или одну из родственных ей, чтобы найти матрицу преобразования. Грубо говоря, она позволит пересчитать позицию пикселя на изображении образца в позицию пикселя на изображении сцены.
    Примерно так, если представить это наглядно (чтобы получить такую картинку, нужно еще несколько шагов, но она передаёт идею).
    homography_findobj.jpg
    7. Дальше ты можешь использовать эту матрицу как хочешь. Например, возьми координаты центра объекта на изображении-образце, и используй её вместе с cv2.perspectiveTransform(), чтобы найти, где на сцене координаты точки центра объекта. Взяв ещё точку (в углу или на краю), сможешь найти ориентацию.

    Проблема в том, что этот подход работает ТОЛЬКО если в сцене не более одного похожего объекта.

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

    Vindicar
    @Vindicar
    RTFM!
    Используй threading.Event.
    import threading
    
    def run(stop: threading.Event):
      while not stop.wait(timeout=1.0): # ожидание и проверка сигнала о завершении
        schedule.run_pending()
    
    stop_event = threading.Event()
    worker = threading.Thread(target=run, args=(stop_event,))
    worker.start()
    #когда надо остановить поток worker
    stop_event.set()

    Прелесть такого подхода в том, что цикл прервётся немедленно по сигналу stop_event, а не тогда, когда закончится очередное ожидание. Также можно заставить несколько потоков использовать один и тот же объект Event.
    Ответ написан
  • Как использовать кастомные эмодзи в кнопках в discord-components discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Где описаны переменные left, right, trash?

    Ну и да, сделайте setlocale() один раз в начале программы, а не десять раз посередине.
    Ответ написан
  • Как на питоне создать функцию по типу "значимый_тип.функция(аргументы)"?

    Vindicar
    @Vindicar
    RTFM!
    Ты просишь что-то типа extension methods из C#?
    Вообще-то это совершенно не питонично и такие хаки лучше не использовать.
    Для обычных классов можно было бы попробовать модифицировать __dict__ класса, или задать атрибут. Атрибут может быть методом, т.е. функцией.
    Но для встроенных классов такой номер не пройдёт, скорее всего, так как их __dict__ доступен только для чтения.
    Ответ написан
  • Как сделать кик участника из войса discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Почему может не работать оператор write при записи в текстовый файл на Python?

    Vindicar
    @Vindicar
    RTFM!
    Как запускали программу?
    Судя по описанию вы смотрите на окно интерактивного интерпретатора питона.
    Он не должен запускаться при запуске .py файла, так что либо вы как-то не так запускаете, либо питон у вас криво установлен.
    Ответ написан
    Комментировать
  • Не работает код(бот дискорда)?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, ты подставляешь prefix только в последний элемент списка hello_words.
    Во-вторых, ты делаешь client.remove_command('help') и жалуешься, что не работает команда help. Твой собственный метод help() не декорирован как команда или событие.
    В-третьих, почему не использовать существующий фреймворк для команд?

    from discord.ext import commands
    hello_words = ['привет', 'hello', 'прив']
    
    @commands.command(name=hello_words[0], aliases=hello_words[1:])
    async def hello_command(ctx):
        pass #делаешь что хочешь
    Ответ написан
  • Как превратить строку в многомерный массив?

    Vindicar
    @Vindicar
    RTFM!
    Разбить сначала по символу перевода строки (\n), потом каждый кусок разбить по пробелу.
    Гугли методы строки .split() и .splitlines(). Ну и преобразовать в int или float в конце.
    Ответ написан
    Комментировать
  • Как взаимодействовать с сайтом программно?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужно чётче сформулировать задачу.
    Если ты хочешь отправить запрос на простой сайт (имитировать открытие ссылки), то это одна задача. Достаточно будет использовать библиотеку типа requests.
    Если ты хочешь работать с сайтом, который обвешан javascript (как ВК), то это уже другое дело. Тут requests будет недостаточно, или его использование будет затруднительно из-за необходимости расковыривать устройство сайта. Нужно использовать безголовый браузер типа selenium. Но результаты работы с сайтом будут "заперты" в скрипте, т.е. вещи типа прослушивания музыки с сайта уже будут проблематичны.
    Впрочем, селениум вроде умеет работать с обычным окном браузера, почитай доки по нему. Если это так, то под твою задачу должно подойти.
    Наконец, если ничто другое не помогает, pywinauto или pyautogui позволяют имитировать клики мышью и нажатия клавиш в окнах других приложений. pywinauto менее популярен, но pyautogui требует, чтобы приложение находилось на переднем плане.
    Ответ написан
  • Как писать комментарии на ютуб с помощью python?

    Vindicar
    @Vindicar
    RTFM!
    Ютуб очень заскриптован, простой либой типа requests ты не отделаешься. Нужно использовать selenium, и постараться притвориться обычным пользователем.
    Ответ написан
    2 комментария
  • Тихая установка (через bat)+ pip "не является внутренней или внешней программой"?

    Vindicar
    @Vindicar
    RTFM!
    Есть подозрение, что изменение PATH установщиком не затрагивает текущую сессию командного процессора, в которой выполняется ваш .bat файл - только свевжесозданные после установки.
    Ответ написан
  • Как в Windows создать файл с кириллицей в названии файла?

    Vindicar
    @Vindicar
    RTFM!
    The default encoding is platform dependent (whatever locale.getpreferredencoding() returns), but any text encoding supported by Python can be used.

    Так что Ultra-Bad Coder прав. По дефолту на винде у тебя f.txt открывается с кодировкой windows-1251, а в линуксе по дефолту юникод поди.
    Лучше всегда при открытии явно указывать режим и ожидаемую кодировку файла.
    Ответ написан
    Комментировать
  • Как начать логировать ТОЛЬКО то, что я прописал?

    Vindicar
    @Vindicar
    RTFM!
    Определить имена логгеров, используемых библиотеками (поле name в формате сообщения), получить соответствующие объекты через logging.getLogger().
    Потом на выбор
    а) выставить им уровень ERROR, CRITICAL или ещё выше (например, 100500), чтобы обычные записи отсеивались
    б) создать свой Filter, который блокирует все записи, и задать его для этих логгеров через соответствующий метод
    в) выставить им свойство propagate в False, чтобы не пробрасывали свои записи в корневой логгер, который ты настраиваешь.
    Ответ написан
    Комментировать
  • Алгоритм получения квадрата по координатам?

    Vindicar
    @Vindicar
    RTFM!
    Я бы обрабатывал отрезки (пары точек), и использовал формулу расстояния от точки до прямой плюс проекцию точки на прямую, чтобы понять, где точка находится - рядом с серединой отрезка или рядом с концами.
    Ответ написан
  • Почему методы класса не работают в цикле?

    Vindicar
    @Vindicar
    RTFM!
    Uno di Palermo, ключевое слово "должен".
    Ты напрасно выбрал logging для этой цели. Он, например, может и не создавать файл, если не было ни одной фактической записи в лог.
    Вот если бы ты использовал обычный open() и писал строки сам, работало бы куда лучше.

    Я уж молчу про то, что файл может не открыться
    • так как диск полон,
    • так как каталог защищён от записи,
    • так как path, school или artist_name содержали символы, недопустимые для использования в пути
    • так как какая-то другая программа удалила файл в промежутке между созданием и открытием
    • так как какая-то другая программа открыла в файл в исключительном режиме
    • и еще по куче причин

    Так что ещё лучше - просто принять к сведению, что операция по открытию файла может потерпеть неудачу в любом случае. И писать программу соответственно. Блок try-catch IOError в помощь.
    Кроме того, зачем пересоздавать wikiart() в цикле?
    Ответ написан
  • Как переслать сообщения из лс дискорд бота?

    Vindicar
    @Vindicar
    RTFM!
    Ты документацию читал? Есть же событие on_message.
    Ответ написан
    Комментировать
  • Как остановить спам "Пробелом" на сервере после закрытия клиента?

    Vindicar
    @Vindicar
    RTFM!
    while True:
        data = conn.recv(1024).decode('utf-8').lower()
        print(data)

    У тебя сервер вообще не предусматривает выхода из обслуживания клиента. Разве что по исключению, но тогда весь сервер грохнется.
    Не проверяешь, получили ли хоть что-то. Если соединение закрыто, recv() вернёт bytes-объект нулевой длины. Так что проверяй длину, и если она нулевая - прерывай цикл.
    Также в твоем коде ни сервер, ни клиент не предусматривают нормального завершения соединения. Если ты используешь TCP, то нужно вызвать метод s.shutdown(), чтобы дать другой стороне понять, что больше данных не будет, а потом s.close(), чтобы полностью закрыть соединение.
    Для клиента нужно будет определить условие, когда закрывать соединение. Например, если пользовать в ответ на input() ввёл пустую строку.
    Ответ написан
    Комментировать
  • Как сохранять данные пользователя?

    Vindicar
    @Vindicar
    RTFM!
    Можно. Создай БД, используя id пользователя в качестве ключа.
    Смотри модуль sqlite3, а также основы SQL. Просто чтобы понимать, что делаешь.
    Ответ написан
    Комментировать
  • Как удалить сообщения указанного пользователя Discord Python?

    Vindicar
    @Vindicar
    RTFM!
    Либо смириться, что команда ищет твои сообщения среди N последних, а не ищет N твоих последних.
    Либо загрузить историю чата, и найти, сколько сообщений было с момента Nго твоего сообщения.

    Сразу скажу, последнее может быть муторно в реализации и тормознуто на практике. Что, если с момента твоего давнего затираемого сообщения в чате написали 100500 других?
    Ответ написан
    Комментировать