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

    Vindicar
    @Vindicar
    RTFM!
    Сделай хранилище вида "id сервера - id роли", по типу словаря. Этот словарь можешь сохранять в файл (например, с помощью json), или в базу данных всякий раз при изменении настроек, и загружать при старте бота.
    Ответ написан
    Комментировать
  • Python logging, как включить поддержку русских букв?

    Vindicar
    @Vindicar
    RTFM!
    В исходниках говорится, что у конструктора класса JsonFormatter есть соответствующий параметр.
    Как его передать через конфиг, я фз.
    Попробуй просто добавить json_ensure_ascii=False в секцию "formatter_json".
    Ответ написан
  • Как можно сохранить страницу браузера в PDF?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, python html to pdf.
    https://pypi.org/project/pdfkit/
    Ответ написан
    Комментировать
  • Как удобно получить все значения dict?

    Vindicar
    @Vindicar
    RTFM!
    Ну идею-то тебе верную подкинули - рекурсия в помощь. В большинстве случаев сработает. И, думаю, будет проще создать новый словарь.
    import typing as t
    def transform(inp: str) -> str:
        return inp   # тут твоё преобразование строк
    
    def change_list(lst: t.List[t.Any]) -> t.List[t.Any]:
        result: t.List[t.Any] = []
        for item in lst:
            if isinstance(item, str):
                result.append(transform(item))
            elif isinstance(item, list):
                result.append(change_list(item))
            elif isinstance(item, dict):
                result.append(change_dict(item))
            else:
                result.append(item)
        return result
    
    def change_dict(dct: t.Dict[str, t.Any]) -> t.Dict[str, t.Any]:
        result: t.Dict[str, t.Any] = {}
        for k, v in dct.items():
            if isinstance(v, str):
                result[k] = transform(v)
            elif isintance(v, dict):
                result[k] = change_dict(v)
            elif isinstance(v, list):  # что делать со списками, если они будут?
                result[k] = change_list(v)
            else:
                result[k] = v
        return result
    Ответ написан
    Комментировать
  • Можно создать собственный Viber bota?

    Vindicar
    @Vindicar
    RTFM!
    Ты вообще гуглить пытался? Или лень?
    https://developers.viber.com/
    Use our solutions to build and connect bots to interact with your users. Use Viber’s API to connect a bot, or team up with a trusted partner to develop the solution that suits you.
    Check our NodeJS sample to see Viber bot in action


    А если нужен именно питон, то тоже кое-что есть.
    Ответ написан
    Комментировать
  • В чем проблема решения?

    Vindicar
    @Vindicar
    RTFM!
    Код заваливается, если на входе строка из одного символа.

    И вообще всё можно упростить, зачем тебе столько индексов?

    line = input()
    last = None
    counter = 0
    for ch in line:
        if ch != last:
            if last is not None:
                print(counter, end='')
            counter = 1
            last = ch
            print(ch, end='')
        else:
            counter += 1
    if last is not None:
        print(counter, end='')

    Ответ написан
    1 комментарий
  • Можно ли сделать привязку в окну, выполнение скрипта в фоновом режиме?

    Vindicar
    @Vindicar
    RTFM!
    Нельзя, keyboard мониторит/имитирует работу клавиатуры, а куда потом попадают события - его не интересует.
    Смотри в сторону pywinauto.
    Ответ написан
    Комментировать
  • Как убрать панель управления окном?

    Vindicar
    @Vindicar
    RTFM!
    При создании окна с помощью WinAPI можно задать свойства рамки окна, в т.ч. наличие кнопок управления, наличие заголовка, и т.п. с помощью стилей окна.
    GUI-фреймворки могут эту функциональность выставлять наружу, предоставляя средства управления стилями окна, которое они создают. А могут и не выставлять.
    В то же время, поскольку под капотом они всё равно обращаются к WinAPI, можно использовать соответствующие функции для манипуляции окном, созданным с помощью GUI-фреймворка.

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

    Vindicar
    @Vindicar
    RTFM!
    dtNow = datetime.datetime.now()
    dtDeadline = datetime.datetime(dtNow.year, 3, 10) # 10 марта
    if dtNow > dtDeadline:
        print("Дедлайн прошел")
    Ответ написан
    1 комментарий
  • Как сделать реагирование на реакции в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    В обработчике команды:
    1. Делаешь хранилище, словарь-dict с ключом вида (message id, user id) и значением в виде объектов asyncio.Event.
    2. Когда отправляешь сообщение для реакции, помещаешь в хранилище пару (id сообщения, id адресата), а значением задаешь новый asyncio.Event().
    3. С помощью asyncio.wait_for() и Event.wait() ждешь срабатываения этого объекта Event или желаемого таймаута.
    4. Если объект сработал и функция wait_for() вернула значение, то реакция была. Действуешь соответственно.
    5. Если wait_for() выбросила asyncio.TimeoutError, то произошел таймаут. Действуешь соответственно.
    В обоих случаях удаляешь из хранилища ключ (id сообщения, id адресата)

    Что касается реакции, то тебе нужно событие on_raw_reaction_add() и ассоциированный с ним объект класса RawReactionActionEvent. Оттуда можно достать сведения о пользователе, сообщении и эмодзи. Ищешь в хранилище пару (id сообщения, id пользователя), если нашел - значит, это одно из наших специальных сообщений. В обработчике этого события выбираешь соответствующей этой паре объект asyncio.Event и дергаешь его метод set(), чтобы просигналить вышеприведенному алгоритму (он тогда пойдёт по ветке 4). Иначе не делаешь ничего.
    Ответ написан
    Комментировать
  • Как после вывода рандомного списка пересгенерировать его заново?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, внести код генерации случайного текста внутрь обработчика.
    Снаружи можно оставить только неизменные части - например, всё что до работы с random.choice().
    К слову, а накой огурец ты подключаешь сюда numpy? Чем тебя встроенный random не устроил?
    Ответ написан
    Комментировать
  • Ошибка Task exception was never retrieved, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Повнимательнее глянуть в документацию.
    Message.get_args() - это не асинхронный метод (не async), а потому при его вызове не нужно использовать await.
    Ответ написан
    2 комментария
  • Проблема с кодом на Python. Поможете?

    Vindicar
    @Vindicar
    RTFM!
    pronoun == "I" or "he" or "she" or "it"
    Так работать не будет. Если тебе нужно проверить несколько вариантов, либо используй логическое ИЛИ правильно
    pronoun == "I" or pronoun == "he" or pronoun == "she" or pronoun == "it"

    либо проверяй на вхождение в коллекцию
    pronoun in ("I", "he", "she", "it")
    Ответ написан
    1 комментарий
  • Почему не работает поиск уникального числа в списке?

    Vindicar
    @Vindicar
    RTFM!
    Пропускаешь свой список через Collections.Counter, получишь число вхождений каждого элемента.
    Потом ищешь элементы, у которых число вхождений равно 1.

    А если хочешь именно циклом, то можно так:
    def find_uniqs(arr):
        uniqs = set()
        srtd = sorted(arr)  # список идёт по возрастанию
        for i in range(1, len(srtd)-1):
            # если элемент не равен соседям, то он один такой в списке
            if srtd[i-1] != srtd[i] and srtd[i] != srtd[i+1]:
                uniqs.add(srtd[i])
        # обрабатываем края списка, если они есть, т.е. список из >1 элемента
        if len(srtd) > 1:
            if srtd[0] != srtd[1]:
                uniqs.add(srtd[0])
            if srtd[-1] != srtd[-2]:
                uniqs.add(srtd[-1])
        elif srtd: # у нас один элемент в списке?
            uniqs.add(srtd[0]) # ну тогда его и добавляем.
        return uniqs
    Ответ написан
    2 комментария
  • Ошибка в 5 строке. как сделать без ошибки?

    Vindicar
    @Vindicar
    RTFM!
    Включаю режим телепатии... ошибка "SyntaxError: unexpected EOF while parsing"?
    Если да, то включить голову и подумать.
    Ты вызываешь a=eval(t.get()). Т.е. пытаешься выполнить код, записанный в поле ввода t.
    Учитывая, что у тебя интерфейс ещё только создаётся, в этом поле ввода сейчас пусто.
    Строка выполняется до того как ты увидишь окно и успеешь туда что-то ввести.
    Вот eval() и ругается на пустую строку.
    Собственно, замечания только 2.
    1. Напиши обработчик щелчка по кнопке, и забирай значение из поля ввода в этом обработчике.
    2. На кой огурец тебе eval()? Чем int() не устроил?
    Ответ написан
    5 комментариев
  • Как убрать все цвета с фото кроме черного?

    Vindicar
    @Vindicar
    RTFM!
    image: numpy.ndarray = ...  # тут твоё изображение как массив BGR-пикселей формой (H,W,3)
    mask = image.max(axis=2) > 35  # логический массив формой (H,W), где True будет там,
    # где наибольшая составляющая соответствующего пикселя > 35
    image[mask] = [255,255,255]  # заменяем значения пикселей, помеченных маской, на желаемые.

    Магия numpy, однако.
    Ответ написан
    4 комментария
  • Python. Не могу понять данный пример на фото, объясните подробнее и попроще??

    Vindicar
    @Vindicar
    RTFM!
    Срезы пишутся в виде "откуда:докуда" или "откуда:докуда:шаг", при этом любая часть может быть опущена, получив значение по умолчанию.
    "откуда" определяет номер первого элемента, который мы выбираем, включительно. Если он опущен, то это эквивалент указания 0.
    "докуда" определяет номер первого элемента, который мы УЖЕ НЕ выбираем, т.е. не включительно. Если он опущен, то это эквивалент "до конца списка".
    "шаг" определяет шаг, с которым мы идём по коллекции, т.е. берем ли мы каждый элемент, или каждый второй (через один), или каждый третий, и так далее. Если шаг не указан, то это эквивалент шага 1.

    В общем-то и всё, остались мелочи типа отрицательного шага (идём в обратном порядке). Что именно непонятно?
    Ответ написан
    1 комментарий
  • Как научить чат-бота в телеграм воспринимать буквы?

    Vindicar
    @Vindicar
    RTFM!
    q.execute("update config set bitcoin = " + str( new_bitcoin ) + " where id = 1")

    За такое надо бить по рукам. Железной линейкой. Поясню почему:
    если new_bitcoin присвоить число 1234 или строку "1234", то получим запрос
    update config set bitcoin = 1234 where id = 1
    Этот запрос синтаксически корректен с точки зрения языка SQL.
    А вот если new_bitcoin присвоить строку "foobar", получим запрос
    update config set bitcoin = foobar where id = 1
    С точки зрения SQL это обращение к столбцу foobar. Которого, разумеется, нету.

    А теперь, внимание, вопрос: какого огурца ты не ознакомился с азами использования СУБД, а именно с синтаксисом подстановки значения?
    Читай тут, начиная со слов "Instead, use the DB-API’s parameter substitution". Осознай, и больше так не делай.

    Ну и до кучи: что будет, если в bitcoin будет строка вида "0; --"?
    update config set bitcoin = 0; -- where id = 1
    Всё, что после "--" это комментарий, и будет проигноировано. Т.е. запрос перезапишет весь столбец bitcoin нулями.
    Ответ написан
    Комментировать
  • Как перевести с Python на php?

    Vindicar
    @Vindicar
    RTFM!
    Ну например, curl для запросов и функции json для работы с форматом.
    Ответ написан
    Комментировать
  • Python как обновить вывод в консоли?

    Vindicar
    @Vindicar
    RTFM!
    Кури curses или аналоги. Но встроенный модуль curses работает только под линуксом, а под винду нужно поискать что-то другое, типа asciimatics или unicurses.
    Ответ написан
    Комментировать