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

    Vindicar
    @Vindicar
    RTFM!
    Ну технически это возможно, но проблематично.
    WinAPI позволяет получить скриншот окна с указанным дескриптором с помощью серии вызовов GetDC() -> CreateCompatibleDC() -> BitBlt(). Достучаться из Питона до винапи утомительно, но реально, пакет pywin32 в помощь.
    Проблема в том, что рабочий стол может состоять из более чем одного окна - например, фон может быть отдельно, а иконки - отдельно. Это зависит как минимум от версии Windows, и даже может меняться в рамках одной версии (на этом основан трюк, позволяющий поместить окно приложения ПОД иконками).
    Тебе придётся определить окна, принадлежащие рабочему столу, получить их дескрпиторы, сделать их скриншоты, а потом как-то свести их вместе.
    Ответ написан
  • Как подгрузить куки из json в запросы python?

    Vindicar
    @Vindicar
    RTFM!
    Зависит от используемой библиотеки. Ты про requests, что ли? Никогда не переводи названия.
    А вообще, как всегда, прочитай документацию. У методов .get()/.post() есть параметр cookies.
    Ответ написан
    4 комментария
  • Почему API возвращает 400?

    Vindicar
    @Vindicar
    RTFM!
    Использование параметра files подразумевает кодирование Multipart-encoded.
    Я подозреваю, нужно использовать параметр data вместо files в обращении к .post().
    Ответ написан
  • Верно ли, что атрибут класса перекрывает атрибут объекта?

    Vindicar
    @Vindicar
    RTFM!
    Возьми и проверь
    >>> class C:
    ...   x = 42
    ...   def __init__(self):
    ...     self.x = 13
    ...
    >>> i = C()
    >>> i.x
    13
    >>> C.x
    42
    >>>


    Что логично - объект сначала ищет атрибуты в своём __dict__, потом в __dict__ класса, потом идёт по предкам класса.
    Ответ написан
    Комментировать
  • Как исправить RuntimeWarning: coroutine was never awaited?

    Vindicar
    @Vindicar
    RTFM!
    self.pushButton.clicked.connect(self.working)
    А ты уверен, что обработчиком нажатия кнопки может быть корутина (async-функция)?
    По-моему, там должна быть обычная функция.
    Ответ написан
    Комментировать
  • Не читает код на пайтон, нет ошибок, но ничего не делает?

    Vindicar
    @Vindicar
    RTFM!
    У вас в def levenshtein(s1, s2): какая-то каша творится с отступами.
    Начиная с word1 = 'blog' код, похоже, должен быть вне функции, а вы его разместили почему-то внутри.
    Ответ написан
    Комментировать
  • Питон выдает 'missing 1 required positional argument: 'self'', что делать?

    Vindicar
    @Vindicar
    RTFM!
    threadBeginCard = Timer(0.1, beginCard, args=None, kwargs=None)

    Я без понятия, что такое Timer(), но могу догадаться, что он делает.
    Он вызывает beginCard() без позиционных (args) или именованных (kwargs) параметров по наступлению некоторого события.
    Проблема в том, что ты вызываешь метод класса, т.е. фактически Class.beginCard(). Ему нужно первым параметром передать экземпляр класса, т.е. self.
    Если бы ты вызывал метод экземпляра, т.е.
    c = Class()
    c.beginCard()
    То тогда self был бы подставлен автоматически.

    Вывод: создать Timer() внутри экземплярного метода, и передать ему self.beginClass в качестве функции. Обрати внимание на отсутствие скобок.

    Правда, я фз что произойдёт дальше - вызов join() мне не очень нравится, так как он заблокирует поток UI до момента завершения рабочего потока.
    Ответ написан
  • Почему одинаковый код выдает разные ответы?

    Vindicar
    @Vindicar
    RTFM!
    Ты пытаешься выполнить сетевые запросы. Время их выполнения зависит от очень многих факторов, в т.ч. от загруженности каналов связи между тобой и сервером, от политики кэширования, и т.д. Так что смотря какой ответ придёт раньше, может получить управление та или иная корутина.
    Ответ написан
    3 комментария
  • Проблема с MongoDB, поможете?

    Vindicar
    @Vindicar
    RTFM!
    Метод update() не подойдет?
    Ответ написан
    Комментировать
  • Как зациклить увеличение числа?

    Vindicar
    @Vindicar
    RTFM!
    Отвечу вопросом на вопрос: а зачем тебе наращивать число каждый час, если можно вместо этого запомнить, когда это число было изменено в последний раз? Тогда, когда число тебе потребуется, просто посчитаешь, сколько часов прошло с тех пор, и сколько должно быть сейчас. Это проще в исполнении и экономнее в плане ресурсов.
    А то цикл по всем пользователям, да ещё и периодически...
    Ответ написан
    Комментировать
  • Как сделать так чтобы в модуле JSON текст сохранялся в виде кириллицы?

    Vindicar
    @Vindicar
    RTFM!
    Как я уже писал в другом твоём вопросе, укажи параметр encoding='utf-8' при открытии файла.
    Ответ написан
    Комментировать
  • Почему не работает семафор?

    Vindicar
    @Vindicar
    RTFM!
    Потому что процесс обращения к серверу разбит на две части.
    Одна - установка соединения, SSL-рукопожатие, формирование и отправка запроса, а также редиректы. Это - get()
    Вторая - загрузка и декодирование тела ответа. Это - text().
    Ты прячешь под семафор только вторую часть, но вполне возможно, что она занимает пренебрежимо мало времени по сравнению с первой. К слову, если хочешь ограничить одновременнные подключения к серверу, то точно нужно прятать под семафор первую часть тоже.
    Ответ написан
  • Как работает асинхронность в пайтон?

    Vindicar
    @Vindicar
    RTFM!
    asyncio - это, скорее, как обойтись без многопоточности.
    Она хорошо работает для ситуаций, когда большая часть времени потока выполнения уходит на ожидание ввода-вывода - например, на ответ по сети. Если у тебя есть что-то, что занимает CPU, или любая другая операция, выполняемая вне рамок ввода-вывода через asyncio - это остановит выполнение асинхронной программы.
    Если на пальцах, то асинхронная программа состоит из отдельных корутин. Разница с потоками в том, что потоки переключает ОС, а корутины сами отдают управление, когда уходят в ожидание события (грубо говоря, когда делают вызов с await). Это упрощает синхронизацию корутин, так как ты точно знаешь, когда твоя корутина отдаст управление - меньше шансов налететь на состояние гонки из-за внезапного переключения. Опять же, переключение корутин куда более детерминировано, чем переключение потоков, так что "плавающие" баги встречаются реже.
    Тело асинхронной программы - это рабочий цикл (т.н. реактор, он же loop), который проверяет выполняемые операции ввода-вывода, и возобновляет выполнение корутины, когда её операция завершилась. Когда корутина завершится или запланирует ещё одну операцию, она вернёт управление в цикл. Вот почему "задумавшаяся" корутина остановит всю программу.
    Минус в том, что в отличие от многопоточности, нельзя просто вжжжжжжух и сделать код асинхронным. Он должен писаться как асинхронный с самого начала, с прицелом на исполнение в реакторе.
    Ответ написан
    2 комментария
  • Как в функцию передать фильтр, сработавшего хендлера?

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

    Vindicar
    @Vindicar
    RTFM!
    " Ещё одним возможным улучшением была бы возможность передавать сценарию другие файлы и каталоги прямо в командной строке. Эти имена можно получать из списка sys.argv и добавлять к нашему списку source при помощи метода extend класса list."

    Выделение моё.

    А вообще, sys.argv хранит список параметров командной строки. 0й всегда содержит путь и имя исполняемого скрипта, а вот последующие задаются пользователем.
    В простых случаях можете просто работать с sys.argv как со списком, но если у вас что-то более сложное (типа необязательных аргументов), то смотри в сторону argparse.
    Ответ написан
    Комментировать
  • Ошибка TypeError: sequence item 0: expected str instance, dict found что делать?

    Vindicar
    @Vindicar
    RTFM!
    MyFile = open('C:\HP\proverka.txt', 'w')
    MyFile.writelines(persones)
    MyFile.close()

    writelines() ожидает получить на вход массив СТРОК, а ты даёшь массив словарей. Отсюда и ошибка.
    Зачем ты вообще этот фрагмент написал, если чуть дальше у тебя нормальное сохранение в json?
    Ответ написан
  • Как добавить словарь в файл через модуль pickle?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала я бы посоветовал использовать json вместо pickle. pickle даёт бинарную строку, которая нечитаема человеком. Кроме того, как написано большими красными буквами в доках на pickle, он имеет уязвимости, так что ни в коем случае нельзя передавать через него недоверенные данные.

    В коде много кривых вызовов не по делу.
    ff = open(file_name, 'rb')
    baza = {ff}

    Что сиё должно означать вообще? Ты создал множество из одного элемента - файлового объекта ff. Или ты ожидал, что это магически превратит файл в словарь?
    Как правильно:
    import json 
    #оператор with обеспечит закрытие файла, как только управление покинет тело оператора
    #явное указание кодировки подстрахует от получения "кракозябр" на выходе
    #Кодировка utf-8 позволит использовать символы любых алфавитов.
    with open('Список.txt', 'rt', encoding='utf-8') as ff:
        baza = json.load(ff)

    Далее.
    baza.update({users_name.title():users_numbe})
    Зачем? Почему не написать просто:
    baza[users_name.title()] = users_numbe
    Далее.
    f.close
    Ты взял адрес метода close у объекта f. Ты НЕ вызвал метод close. Чтобы метод вызвать, нужно указать круглые скобки. Впрочем, если используешь with, то он вызовет close() за тебя.
    Так что:
    with open('Список.txt', 'wt', encoding='utf-8') as ff:
        json.dump(
            baza, #что записываем
            ff, #куда
            ensure_ascii=False, #не ASCII-строки пишем как есть, без кодирования
            indent="    ", #сделать отступ, не писать всё в одну строку
            sort_keys=True, #отсортировать ключи по алфавиту
        )

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

    Vindicar
    @Vindicar
    RTFM!
    0. Ставишь aiogram и читаешь Quick start, чтобы понять, как в целом будет устроен бот.
    1. Создаёшь и ведёшь базу пользователей бота, например, в sqlite3. Как её наполнять, это уже второй вопрос. Также может потребоваться отдельная таблица напомнинаний, но тебе виднее что за напоминания будут.
    2. В боте создаёшь через asyncio.create_task() бесконечную задачу, которая
    - проверяет время
    - если сейчас подходящее время (скажем, полдень, 1е число месяца, плюс-минус 30 секунд), вызывает корутину уведомления пользователей,
    - засыпает на минуту с помощью await asyncio.sleep() (ни в коем случае не time.sleep()).
    3. Корутина уведомления пользователей должна извлекать из твоей базы уведомления, которые нужно отправить и id пользователей, которым эти уведомления нужно отправить (см. доки по sqlite3 как извлекать данные из БД запросом SELECT). Затем для каждого пользователя она должна отправить текст (см. доки по aiogram) и обработать возможное исключение (например, если пользователь заблокировал бота).
    4. Может потребоваться пара обработчиков команд, чтобы добавлять/менять текст напоминаний.
    Ответ написан
  • Как это реализовать в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну простая же задача, на логику.
    У тебя при вводе команды отрабатывает функция Mishka(), а генерируешь случайный вариант ты вне её, один раз.
    Внеси случайную генерацию внутрь, и будет тебе счастье.
    Ответ написан