Задать вопрос
  • Tortoise orm создается объект в бд, из-за не правильного foreign key, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ну вообще-то тебе прямо говорят про default_connection.
    Ты await Tortoise.init() делал?
    Ответ написан
  • Как конвертировать ssh туннель в vpn?

    Vindicar
    @Vindicar
    RTFM!
    Нет, скорее всего.

    Можно либо поднять на том же хосте VPN сервер, либо найти/арендовать готовый VPN, и настроить клиент так, чтобы он коннектился через этот прокси.

    А вообще, какой смысл в этой многослойной конструкции?
    Ответ написан
  • Как совместить pygame и какой-нибудь GUI?

    Vindicar
    @Vindicar
    RTFM!
    Ты имеешь ввиду GUI - graphical user interface?
    pygame-menu посмотри.
    Ответ написан
    Комментировать
  • При создании второго хэндлера CallbackQuery, все остальные перестают работать, как сделать что бы срабатывали оба?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты в обоих случаях прописываешь callback handler, обрабатывающий ВСЕ кнопки (так как в качестве func ты передаёшь предикат, всегда возвращающий истину, т.е. "я готов это обработать").
    Далее, что значит "не помогло"?
    @bot.callback_query_handler(func=lambda call: call.data.startswith('text'))

    Вот прямо так и писал? или всё-таки заменял 'text' на что-то своё?
    Потому что если так и писал, то ты тем самым сказал "вызывай этот обработчик для тех случаев, когда call.data начинается со слова text". У тебя ни в одном случае call.data не начинается с text.

    Тут идея проста как два пальца: сделай иерархию в тексте call.data.
    Например, в первом случае
    item_yes = types.InlineKeyboardButton(text='Принять', callback_data='order_approve.yes')
    item_no = types.InlineKeyboardButton(text='Отказаться', callback_data='order_approve.no')

    Тут order_approve - что-то типа пространства имён, чтобы можно было отличать значения, приходящие по разным поводам (т.е. кнопки, обрабатываемые в рамках разных диалогов).
    И тогда прописать обработчик можно будет так
    @bot.callback_query_handler(func=lambda call: call.data.startswith('order_approve.'))


    Во втором случае сделай по аналогии.
    Ответ написан
    Комментировать
  • Эхо-бот никак не реагирует, что я упустил?

    Vindicar
    @Vindicar
    RTFM!
    bot.mesaage_handler

    В консоль смотрел? Там должна быть ошибка на тему "Attribute 'mesaage_handler' not found."
    Ответ написан
    Комментировать
  • Как наложить одно изображение на другое без размытия, смешивания и прозрачности?

    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. Посмотри примеры кода, если понравится - установи и пользуйся.
    Ответ написан