• Как пофиксить ошибку при запуске собранной программы на pyinstalle?

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

    Vindicar
    @Vindicar
    RTFM!
    Вместо text в callback_query_handler() укажи функцию, которая принимает CallbackQuery и возвращает True, если надо обработать данный запрос, и False, если нужно поискать другой обработчик. Для ускорения можешь все коды запросов в БД пометить отдельным префиксом (например, пусть они начинаются с "db_"), чтобы сразу отсечь посторонние коды.
    Просто погугли callback_query_handler, увидишь что-то типа lambda callback_query: True - это означает "принимать любые коды запроса". Но ведь можно True возвращать не всегда.
    Ответ написан
    Комментировать
  • Хочу прописать арифметические действия телеграм боту. Как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Читай на тему finite state machine. Не знаю конкретно насчёт telebot, а другие библиотеки содержат эту фичу.
    Но в целом идея несложная - ты должен для каждого пользователя помнить, на каком шаге он находится (ожидание первого числа, ожидание оператора, ожидание второго числа) и что он вводил раньше. Получив сообщение, смотришь по ID пользователя его шаг, и обрабатываешь текст сообщения соответственно. Можно это и вручную реализовать.

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

    Vindicar
    @Vindicar
    RTFM!
    Ну немногие фреймворки такое позволяют. Можно подёргать WinAPI, например, SetWindowRgn() (позволяет задать видимую и "осязаемую" область окна). Тогда можно сделать окно на твоём предпочитаемом фреймворке, узнать дескриптор окна, и вызвать эту функцию через ctypes для задания непрозрачных областей.

    Насчёт Qt не скажу, может, оно и умеет такое "из коробки".
    Ответ написан
    Комментировать
  • Как бот дискорд может создать ветку с сообщением или получить айди только созданной ветки?

    Vindicar
    @Vindicar
    RTFM!
    await message.create_thread(name=nick, message=msg)
    TypeError: create_thread() got an unexpected keyword argument 'message'

    А перевести текст ошибки не пробовал? create_thread() не принимает аргумент message. Значит, надо открыть документацию, найти этот метод и посмотреть, какие параметры он принимает.

    Parameters
    name (str) – The name of the thread.
    auto_archive_duration (int) – The duration in minutes before a thread is automatically archived for inactivity. If not provided, the channel’s default auto archive duration is used.
    slowmode_delay (Optional[int]) – Specifies the slowmode rate limit for user in this channel, in seconds. The maximum value possible is 21600. By default no slowmode rate limit if this is None.
    reason (Optional[str]) – The reason for creating a new thread. Shows up on the audit log.

    Никакого параметра message тут нет. Более того, выше прямо сказано: "Creates a public thread from this message." Тут что-нибудь написано про отправку сообщения в создаваемый тред? Нет.

    Зато ниже сказано: "Returns: The created thread. Return type: Thread" Т.е. метод возвращает объект треда, с которым можно взаимодействовать. Смотрим по ссылке, что это за объект, видим в методах send().

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

    Vindicar
    @Vindicar
    RTFM!
    result = numpy.zeros(mask.shape + (3,), dtype=numpy.uint8)
    result[mask > 0] = (255, 255, 255)

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

    Vindicar
    @Vindicar
    RTFM!
    1. Научиться отправлять сообщение в чат с заранее известным ID вместо использования message.answer().
    2. Хранить ID (или список ID), которым надо разослать сообщение.
    3. Научиться пользоваться пакетом aioschedule. В частности, как планировать вызов корутины и что нужно сделать для обеспечения работы пакета.
    4. Понять, как пользоваться asyncio.create_task(), чтобы запускать рабочий цикл aioschedule параллельно с работой бота. В частности, как выполнить код непосредственно при старте бота, а не как реакцию на сообщение.
    5. Свести эти знания вместе.

    При старте бота запускаем рабочий цикл aioschedule и планируем выполнение корутины опроса. Корутина опроса проходит по списку ID и каждому отправляет сообщение, одновременно задавая нужное состояние на машине состояний FSM. Дальше работа идёт как обычно - приняли сообщение пользователя, обработали состоянием, перешли к следующему состоянию.
    Ответ написан
    Комментировать
  • В чем разница между параметрами и атрибутами классов?

    Vindicar
    @Vindicar
    RTFM!
    Параметры метода относятся только к самому методу. Остальной класс про них знает, но только в плане "что нужно передать этому методу при вызове". Как метод использует тот или иной параметр - это его дело.

    Атрибуты класса привязаны к экземпляру класса. По сути, у большинства объектов есть скрытый словарь __dict__, который хранит атрибуты этого объекта. Создание атрибута означает внесение записи в __dict__.

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

    При этом у __init__() есть полная свобода действий в плане того, откуда брать значения для атрибутов класса и какие атрибуты создавать. Пример:
    class Point:
        def __init__(self):
            self.x = 0
            self.y = 0
    
    point = Point()
    # у point есть два собственных атрибута, x и y
    print(point.__dict__)  # {'x': 0, 'y': 0}

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

    Пример параметров, не относящихся к атрибутам:
    class Point:
        def __init__(self, is_3d):
            self.x = 0
            self.y = 0
            if is_3d:  # этот параметр не используется как значение атрибута
                self.z = 0  # а этот атрибут может присутствовать или отсутствовать
    
    point_2d = Point(False)
    print(point_2d.__dict__)  # {'x': 0, 'y': 0}
    point_3d = Point(True)
    print(point_3d.__dict__)  # {'x': 0, 'y': 0, 'z': 0}

    Пример создания атрибута "на ходу":
    class Point:
        def __init__(self):
            self.x = 0
            self.y = 0
    
    point = Point()
    print(point.__dict__)  # {'x': 0, 'y': 0}
    point.name = 'Start'  #  создаём атрибут "на ходу"
    print(point.__dict__)  # {'x': 0, 'y': 0, 'name': 'Start'}


    Опять же, это не самая хорошая практика - куда лучше, когда набор атрибутов у объекта всегда один и тот же, и не меняется во время выполнения программы. Так меньше путаницы.
    Но это пример того, что атрибуты - это, по сути, ключи в связанном с объектом словаре, а потому могут создаваться и изменяться, если это нам требуется.
    Ответ написан
    2 комментария
  • Почему я получаю данную ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Да, таблицу и столбцы нельзя делать через подстановку. В чем именно ошибка непонятна?
    Ответ написан
    Комментировать
  • Как убрать ограничения чтения названия столбца в PostgreSQL?

    Vindicar
    @Vindicar
    RTFM!
    https://www.postgresql.org/docs/7.0/syntax525.htm
    The system uses no more than NAMEDATALEN-1 characters of a name; longer names can be written in queries, but they will be truncated. By default, NAMEDATALEN is 32 so the maximum name length is 31 (but at the time the system is built, NAMEDATALEN can be changed in src/include/postgres_ext.h).


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

    Vindicar
    @Vindicar
    RTFM!
    wget -O - https://mysite/script.sh | bash
    Но это рискованный фокус.
    Ответ написан
  • Как исправить эту ошибку ValueError: invalid literal for int() with base 10: "b'8"?

    Vindicar
    @Vindicar
    RTFM!
    data=str(ArduinoSerial.readline())
    Включи голову. Так ты данные из строки байт (тип bytes) в строку символов (тип str) не преобразуешь.
    Нужно использовать ту или иную кодировку.
    Если у тебя нет кириллицы и т.п. символов (например, латиница и/или цифры), можно использовать
    data = ArduinoSerial.readline().decode('ascii')
    Ну и обработку исключений добавь, а то мало ли что тебе придёт с последовательного порта.
    Ответ написан
  • Насколько критично использование pydantic в асинхронных приложениях?

    Vindicar
    @Vindicar
    RTFM!
    Не стоит спользовать длительные синхронные вызовы в асинхронном коде.
    Во-первых, валидация - это CPU-bound задача, а не IO-bound. Её можно вынести в поток, но и только. Просто асинхронно её не выполнишь.
    Во-вторых, если у тебя не ChatGPT данные валидирует, скорее всего время выполнения валидации будет пренебрежимо малым.
    Ответ написан
    Комментировать
  • Как получить уник. идентификатор устройства?

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

    Vindicar
    @Vindicar
    RTFM!
    Ну лобовое решение - пронумеровать звуковые файлы, и проходить по ним циклом.
    Ответ написан
    Комментировать
  • Как обработать команду в телеграмм боте при работающем расписании на aioschedule?

    Vindicar
    @Vindicar
    RTFM!
    await asyncio.create_task(scheduler())
    Ты ждешь, пока scheduler() не закончит работу. Зачем? Вызов create_task() сам по себе планирует выполнение переданной корутины, её не имеет смысла awaitить - разве что только в плане "дождаться конца задачи".
    Оставь просто вызов create_task(), без await, ну или сохрани возвращаемое create_task() значение в переменную (если нужно будет потом прервать выполнение scheduler()).
    Ответ написан
    1 комментарий
  • Как найти наибольшее по сумме чисел?

    Vindicar
    @Vindicar
    RTFM!
    number //= 1
    Может, всё-таки 10?

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

    Vindicar
    @Vindicar
    RTFM!
    Добавлял уникальный ID к имени товара, к имени фото

    Ну так добавляй ID к имени фото, но не к имени товара, делов-то.
    Ответ написан
    2 комментария
  • Как открыть базу данных и записать туда айди пользователя в VkBottle?

    Vindicar
    @Vindicar
    RTFM!
    В гугле забанили?
    Всегда читай документацию, там обычно есть примеры.
    Вот релевантный.
    from peewee import *
    
    db = SqliteDatabase('people.db')
    
    class Person(Model):
        name = CharField()
        birthday = DateField()
    
        class Meta:
            database = db # This model uses the "people.db" database.
    
    db.connect()
    db.create_tables([Person])
    from datetime import date
    uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15))
    uncle_bob.save() # bob is now stored in the database
    Ответ написан
    3 комментария
  • Как подсвечивать разными цветами текст в виджете text tkinter?

    Vindicar
    @Vindicar
    RTFM!
    1. Почитать документацию о том как работают теги. В частности, методы tag_add(), tag_remove() и tag_config().
    2. Сделать простой пример, чтобы убедиться, что ты понял, как оно работает.
    3. Применить в своём проекте.
    Ответ написан