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

    Vindicar
    @Vindicar
    RTFM!
    Если нужно заменить прямоугольник пикселей, то это делается тривиально:
    img1[top1:bottom1, left1:right1] = img2[top2:bottom2, left2:right2]

    Единственное требование - прямоугольники должны иметь одинаковый размер.
    Как следствие, если вторая картинка может заезжать за край первой, то задача усложняется.

    Если же нужно работать с альфа-каналом, то для начала его неплохо бы прочитать.
    image = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)

    UNCHANGED не преобразует в BGR, а грузит как есть, в том числе альфа канал.
    И тогда нужно будет сделать что-то типа
    mask = image[..., 3] > 0  # если считаем, что чем меньше - тем прозрачнее
    background[top:bottom, left:right][mask] = image[mask]  # не забываем про равенство размера!
    Ответ написан
  • Кто подскажет, смогу ли я так сделать?

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

    Vindicar
    @Vindicar
    RTFM!
    1. Сначала проверяй более узкий диапазон (например, 22 часов - 5 часов), потом уже более широкий.
    2. Ты вообще понимаешь, что ты сравниваешь строки, а не целые числа? Строки сравниваются в лексикографическом порядке, т.е. символы берутся слева направо и сравниваются по позиции в алфавите до первого неодинакового символа. Т.е. "5" будет больше "12".
    Ответ написан
    Комментировать
  • Как управлять приложением windows средствами python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Сможете проверить правильность решения моего задания?

    Vindicar
    @Vindicar
    RTFM!
    1. Я подозреваю, что "вывести на экран" относится ко всем трём пунткам.
    2. Числовое значение != целочисленное значение
    Ответ написан
    4 комментария
  • Как реализовать цикл в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Это называется машина состояний.

    Если делать самому, то для каждого пользователя надо хранить сведения о текущем шаге. Например: "вводит значения, введены значения А, Б, В".
    Желательно хранить в перманентном хранилище типа БД, чтобы если что, пользователь не терял введённые сведения.
    При получении сообщения смотреть, на каком шаге находится пользователь, и обрабатывать сообщение в зависимости от этого.

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

    Vindicar
    @Vindicar
    RTFM!
    Вместо обращений по относительным путям, строй обращения относительно корня скрипта. pathlib в помощь.
    import sys
    import pathlib
    
    SCRIPT_DIR = pathlib.Path(sys.argv[0]).parent
    CONFIG = SCRIPT_DIR / 'config.ini'
    
    with open(CONFIG, 'rt') as cfg:
        ...
    Ответ написан
    1 комментарий
  • Как вывести баланс в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    Значит у тебя нет записи в БД для этого юзера. Ты add_user() точно выполнял для него?
    Ответ написан
  • Почему при запуске программы мне выдает пустой список?

    Vindicar
    @Vindicar
    RTFM!
    А ты уверен, что страница, содержащаяся в full_page.content, имеет span с классом DFlfde?
    Попробуй сохранить это содержимое в файл, а потом просмотреть его.
    Ответ написан
  • Можете объяснить код простой программы из ответа по ОГЭ?

    Vindicar
    @Vindicar
    RTFM!
    Потому что нигде не сказано, что последовательность идёт строго по возрастанию.
    Пример: 7 3 500 6 9 5 8
    Без второго условия программа увидит число 5 и перезапишет result = 5, хотя оно меньше чем более раннее 500.
    Ответ написан
    1 комментарий
  • Как не допустить такую ошибку?

    Vindicar
    @Vindicar
    RTFM!
    1. global price2
    Глобальные переменные - хороший способ огрести проблем при одновременном доступе нескольких пользователей. Они работают только если обращается один пользователь за раз.
    2. cur.execute(f"UPDATE
    Никогда не создавай SQL запросы через f-строки, используй подстановку параметров.
    Ответ написан
    Комментировать
  • Ошибка списка: SyntaxError: invalid syntax. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    1.
    interval = list(data('interval') # преобразуйте столбец interval в список

    Не закрыта круглая скобка для list(
    2. for index in data:
    Что за дикий отступ? В питоне отступы значимы, к ним надо относиться очень внимательно.
    Ответ написан
    Комментировать
  • Можно ли импортировать что-то из разных... серверов?

    Vindicar
    @Vindicar
    RTFM!
    И как это сделать?

    sundnl, взять и сделать. Не зная подробностей, тебе никто ничего не подскажет. С такой формулировкой тебя даже на фрилансе пошлют, и будут правы.

    Что за игра, что за сервер? Может, у него уже есть какое-то API, по которому можно вытащить интересующие данные?

    Собственно, что это за данные? Каков их объём? Именно данные, или нужно оповещение о событиях в игре? Разница очень большая, так как будет определять, кто будет проявлять инициативу при отправке данных - сервер или бот.

    Если API нет, есть ли доступ к исходникам сервера? Как организован рабочий цикл сервера? Потребуется ли нам запускать отдельный поток - а значит, синхронизировать доступ к искомым данным? Или же там что-то на базе asyncio, и мы можем просто добавить асинхронную задачу?

    Нужно определиться с форматом отдачи данных - тут лучше не изобретать велосипед, а использовать JSON, если данных не очень много.

    Можно подумать о том, чтобы добавить в серверный скрипт небольшой сервер на Flask, или на базе asyncio streams, или на голых сокетах. Конкретная реализация зависит в том числе от того, кто проявляет инициативу: если бот запрашивает, а сервер отвечает, то Flask позволит обращаться к серверу по HTTP, а не громоздить велосипед на сокетах. Если же сервер может что-то слать по своей инициативе, то тут уже HTTP подойдёт так себе.

    Когда ответишь на все перечисленные вопросы, вот тогда у тебя будет вопрос, стоящий обсуждения. В конце концов, правильно поставленный вопрос - это половина ответа.
    Ответ написан
    Комментировать
  • Насколько допустимо с точки зрения стилистики вызывать Exception в конструкции if/else?

    Vindicar
    @Vindicar
    RTFM!
    Подход, предложенный @Ипатьев, в принципе неплох.
    Но я считаю, стоит помнить, что питон - язык с динамической типизацией. Если какой-то тип умеет выполнять требуемые от него операции, стоит этот тип принимать. Иными словами, тебе необязательно принимать именно список или кортеж - тебе подойдёт любая коллекция, которую можно перечислить, и у которой есть длина.
    Так что я бы посоветовал сделать иначе:
    import collections.abc as abc
    # Collection требует поддержки итерации, проверки вхождения и длины.
    def avg(data_set: abc.Collection[int]) -> float:  # type hint для разработчика и IDE
        # если получим что-то не то, будет выкинуто TypeError - а нам это и надо.
        avg = sum(data_set) / len(data_set)  # такое деление вернёт float
        return avg


    Либо, если тебе хочется своей обработки ошибки:
    import collections.abc as abc
    
    def avg(data_set: abc.Collection[int]) -> float:  # type hint для разработчика и IDE
        # протокол abc.Collection можно проверять через isinstance()
        if not isinstance(data_set, abc.Collection):  
            raise TypeError(f'data_set must be a collection of ints, got {type(data_set)}')
        avg = sum(data_set) / len(data_set)  # такое деление вернёт float
        return avg

    Иными словами, может иметь смысл определить минимально необходимый тебе набор операций, и описывать как входной тип именно его. Хотя зачастую можно и не заморачиваться. Если ты значешь, что будешь передавать в функцию только список - можешь прописывать только список.

    И это будет работать:
    >>> avg([1,2,3])  # список
    2.0  # работает
    >>> avg({1,2,3})  # множество
    2.0  # работает
    >>> avg(x for x in range(3))  # выражение-генератор
    Traceback (most recent call last):  # отказ, у генераторов нет заранее известной длины
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in avg
    TypeError: data_set must be a collection of ints, got <class 'generator'>
    Ответ написан
    Комментировать
  • Как сделать активным свой выбор в меню?

    Vindicar
    @Vindicar
    RTFM!
    Ну гугл по "pygame menu" выводит на одноименный пакет pygame-menu. Посмотри примеры кода, если понравится - установи и пользуйся.
    Ответ написан
  • Как спарсить данные с сайта?

    Vindicar
    @Vindicar
    RTFM!
    Этот формат называется JSON. В стандартной библиотеке Питона есть одноименный модуль для работы с ним.
    Он позволит превратить строку в обычный питоновский словарь. Как со словарём работать, надеюсь, знаешь.
    Вытащишь из словаря нужные данные, и с ними уже делай что надо. Хоть выводи на экран, хоть закинь в другой пустой словарь (чтобы лишнего ничего не было) и запакуй обратно в JSON.
    Ответ написан
    1 комментарий
  • Различия работы requests в Windows и Linux?

    Vindicar
    @Vindicar
    RTFM!
    Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:103.0)

    Попробуй на винде воткнуть User-Agent от виндовой версии мозиллы.
    Ответ написан
  • Почему сайт отклоняет запросы?

    Vindicar
    @Vindicar
    RTFM!
    сначала всё работает хорошо, но черех некоторе время выдает ошибку

    Как ни странно, сайт подозревает, что твой бот-парсер - это бот-парсер.
    Задержки, которые у тебя прописаны внутри скрипта, никакого значения не имеют. К этому моменту данные уже получены с сайта, и с ним ты больше не взаимодействуешь. Имеет значение интервал между повторными вызовами requests.get(). У тебя в скрипте вызов не повторный, но ты же сам скрипт неоднократно дёргаешь, я так понял?
    Ответ написан
    5 комментариев
  • Как прервать и перезапустить программу?

    Vindicar
    @Vindicar
    RTFM!
    if bet != 0 or 1 or 2:
    Ну конечно дословный перевод с русского на питон будет работать неправильно. Это условие интерпретируется как
    if (bet != 0) or (1) or (2):
    В питоне целые числа истинны, если они не нулевые. Т.е. получаем
    if (bet != 0) or (1 != 0) or (2 != 0):
    Как следствие
    if (bet != 0) or True or True:
    А как известно, X or True всегда даст True, независимо от значения X.
    Так что всё условие всегда даст True.
    Правильно или так:
    if (bet != 0) and (bet != 1) and (bet != 2):
    или так
    if bet not in (0, 1, 2):

    По поводу зацикливания - заверни кусок программы, отвечающий за ввод, в цикл while.
    Ответ написан
    Комментировать
  • Как ускорить работу Python в разы?

    Vindicar
    @Vindicar
    RTFM!
    Ты документацию читал?
    get_symbol_ticker(**params)[source]
    Latest price for a symbol or symbols.

    Выделение моё. Судя по докам, get_symbol_ticker() позволяет за один запрос получать инфу сразу о нескольких символах. Готов спорить, что это будет быстрее.

    Так как в заголовке функции **params вместо нормального описания параметров, я подозреваю, что переданные параметры пробрасываются прямиком в API binance. Открываем доки на это API, благо ссылка есть прямо в первых доках. Видимо, что можно в параметрах передать строку symbol, или строку-список symbols вида
    ["BTCUSDT","BNBUSDT"]. Как я понял, это именно строка такого вида, а не список.

    Вот скажи мне, что тебе помешало найти эту информацию самостоятельно? Две минуты гуглежа, и это при том что я с бинансом не работал вообще.

    Ну и да, серьёзно? f'{str(ticker1)}', притом что ticker1 - это уже заведомо строка? Больше строк богу строк...
    Ответ написан
    Комментировать