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

    Vindicar
    @Vindicar
    RTFM!
    На гитхабе вариант с несколькими стейтсами, а мне нужен один.

    В приведённом примере явно два состояния - ожидание фразы "ввести имя" и ожидание собственно имени. Одним тут не обойдёшься. Или изменяй сценарий (нафиг вообще вводить фразу "ввести имя"?) или используй два состояния.
    Ответ написан
    Комментировать
  • Как убрать выведение сообщения err1?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, нужно не if ... if ... if ... print(), а if ... elif ... elif ... else: print()

    Во-вторых,
    if c != "множення" and "додавання" and "віднімання" and "ділення" :

    Очень многие совершают эту ошибку. Так НЕ работает.
    Код вида if x != 2 or 3: эквивалентен if (x != 2) or (3 != 0):, что, в свою очередь даёт if (x != 2) or True:. А что угодно or True даст True, т.е. условие будет всегда выполняться.
    Правильно - if x != 2 and x != 3: или if x not in (2, 3):
    Для своей задачи приспособишь по аналогии.
    Ответ написан
    Комментировать
  • Что это, и как это обойти чтобы не ждать день?

    Vindicar
    @Vindicar
    RTFM!
    Вот тебе реально лениво вставить этот текст в автопереводчик? Там всё написано прямым простым языком.
    Max number of daily application command creates has been reached

    Каждый раз, когда ты запускаешь скрипт, он пытается создать команду заново. Ты исчерпал дневной лимит (200 попыток) на это дело. Впредь отлаживай осторожнее.
    Ответ написан
    6 комментариев
  • Как захватить и транслировать захват экрана в opencv python?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, python capture screen
    Посмотри в сторону vidgear. Репозиторий обновлялся последний раз полгода назад, так что либа вроде ещё живая.
    Пример оттуда:
    # import required libraries
    from vidgear.gears import ScreenGear
    import cv2
    
    # open video stream with default parameters
    stream = ScreenGear().start()
    while True:
        # read frames from stream
        frame = stream.read()
        # check for frame if Nonetype
        if frame is None:
            break
    
        # {do something with the frame here}
    
        # Show output window
        cv2.imshow("Output Frame", frame)
        # check for 'q' key if pressed
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
            break
    # close output window
    cv2.destroyAllWindows()
    # safely close video stream
    stream.stop()
    Ответ написан
    Комментировать
  • Добавление в массив новое число не добавляет число, а добавляет. Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Нужно не путать просто генераторы и генераторы списков.
    a = (sum(new_matrix[i]) for k in range(matrix_1_height))

    Это - выражение-генератор. Оно принципиально "ленивое" - вычисляет свои значения только по запросу, и делает это только один раз. Т.е. ты можешь прогнать цикл for i in a, и значения будут сгенерированы и получены - но если попробуешь тут же прогнать цикл ещё раз на том же выражении, то не получишь ничего.

    b = [sum(new_matrix[i]) for k in range(matrix_1_height)]

    Это - генератор списка. Он вычисляет значения немедленно, все, и возвращает обычный список, который можно итерировать сколько угодно раз.
    По сути, выражение можно записать и так:
    a = (sum(new_matrix[i]) for k in range(matrix_1_height))
    b = list(a)  # прогоняем генератор и превращаем его в список
    Ответ написан
    Комментировать
  • Как извлечь строку из файла?

    Vindicar
    @Vindicar
    RTFM!
    Нет понятия "извлечь строку". Есть понятие "прочитать строку" и "удалить строку".
    В случае с "удалить" подразумевается, что мы
    а) либо перезаписываем файл целиком,
    б) либо перезаписываем всё, что идёт после начала удаляемой строки (т.е. копируем то, что после конца удаляемой строки) и обрезаем конец файла.

    Вообще текстовые файлы - весьма неблагодарная штука для редактирования. Лучше в таких случаях использовать либо другой формат данных, либо вообще другое хранилище.
    Ответ написан
    2 комментария
  • Почему возникает ошибка error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'?

    Vindicar
    @Vindicar
    RTFM!
    _, image = cap.read()
    Не _, а success_code, то бишь признак успешности чтения. Проверь, читается ли у тебя вообще кадр с камеры.
    Ответ написан
    Комментировать
  • Как между асинхроными функциями делиться и перекидывать переменные и их значения?

    Vindicar
    @Vindicar
    RTFM!
    Потому что у каждого пользователя должен быть свой экземпляр хранимых данных.
    Например, вместо одиночного хранилища нужно иметь хранилище вида "ключ-значение", где ключом будет ID пользователя, а значением - данные, которые для этого пользователя актуальны.
    Природа этого хранилища не принципиальна: может быть простой словарь (если не нужно сохранение состоятния между перезапусками бота), может быть БД, может быть ещё что.

    Собственно, в аиограме есть механизм Finite State Machine, который как раз про организацию сценариев, с отслеживанием того, на каком этапе находится конкретный пользователь.

    Но для его использования нужно знать питон на уровне немножечко повыше "Если я пытаюсь исплользовать return то код дальше становится недоступным".
    Ответ написан
    Комментировать
  • Из трёх похожих друг на друга команд, создалась только одна, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Отступы! У тебя всё, что после mathsminus() определено ВНУТРИ mathsminus(). Проверь отступы в начале строк.
    Ответ написан
    1 комментарий
  • Как создать список из картинок и текста и выводить рандомным способом?

    Vindicar
    @Vindicar
    RTFM!
    Ну про random.choice() ты знаешь. В чём проблема-то?
    Если нужно соответствие картинки и текста, то просто храни текст и картинку одним элементом списка - например, через кортеж.
    tarot_list = [
        ('image1.jpg', 'Текст 1'),
        ('image2.jpg', 'Текст 2'),
    ]

    Тогда потом просто делаешь:
    image, text = random.choice(tarot_list)
    и вперёд!
    Ответ написан
  • Почему не получается, если миновать задание переменной, и сразу подставить int(input) в print, вместо переменной a?

    Vindicar
    @Vindicar
    RTFM!
    Потому что input() требует ввода данных с клавиатуры. Если ты вызываешь input() несколько раз - вводить придётся несколько значений. У тебя 4 раза встречается a, так что тебе придётся 4 раза вводить одно и то же значение если ты a заменишь на вызов int(input()). ИМХО, это уже причина так не делать.
    Ответ написан
    Комментировать
  • Как организовать взаимодействие классов?

    Vindicar
    @Vindicar
    RTFM!
    Ну вот так абстрактно мало что можно посоветовать.
    Хотя взаимодействие B, C и D говорит о неудачном распределении обязанностей.
    Есть два варианта.

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

    Б) Один класс (роутер/машина состояний) определяет, какой сценарий взаимодействия с пользователем сейчас выполняется. Другие классы реализуют по одному сценарию взаимодействия каждый, предоставляя интерфейс, хранение данных и выполнение операций в рамках сценария. Они не реализуют переход между сценариями сами - вместо этого они оповещают роутер о желаемом переходе. А тот уже оповещает текущий сценарий о завершении, подгружает другой сценарий (экзепляр класса) и оповещает его о начале работы.
    Ответ написан
  • Из-за чего возникла ошибка 'TypeError: Bot.send_message() missing 1 required positional argument: 'text''?

    Vindicar
    @Vindicar
    RTFM!
    await Bot.send_message(message.from_user.id, message.text)

    Ты пытаешься вызвать метод класса Bot, а не экземпляра bot.

    Поясню. В питоне методы устроены довольно прямолинейно:
    class Test:
        def test(self, x):
            print(f"Я {self} и я получил {x}")
    
    t = Test()  # создаём экземпляр
    t.test(42)  # Я <__main__.Test object at 0x000001BB195CBC70> и я получил 42
    # это тоже сработает, и это практически эквивалентно вызову выше
    Test.test(t, 42)  # Я <__main__.Test object at 0x000001BB195CBC70> и я получил 42
    # а это - то, что попытался сделать ты:
    Test.test(42)  # TypeError: Test.test() missing 1 required positional argument: 'x'
    # потому что вызван метод класса, а не объекта, и его первый параметр (42) интерпретирован как self
    Ответ написан
    4 комментария
  • Как сделать проверку if на тип переменной?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, оператор is проверяет идентичность объектов. Учи язык.
    a = [1, 2, 3]
    b = [1, 2, 3]
    print(a == b)  # True - списки имеют одинаковое содержимое
    print(a is b)  # False - a и b ссылаются на разные объекты-списки, а не на один и тот же.


    Если тебе нужно узнать, содержит ли переменная ссылку на объект указанного типа, используй isinstance().
    a = 1
    b = 1.0
    print(isinstance(a, int), isinstance(a, float))  # True False - a это int, но не float
    print(isinstance(b, int), isinstance(b, float))  # False True - b это не int, это float
    print(isinstance(a, (int, float)))  # True - a является чем-то из двух: или int, или float

    Но это работает только для значений корректного типа - это НЕ позволит проверить, содержит ли строка корректное представление числа, к примеру. Для этого либо используй try-except, либо регулярные выражения. Только вот в except не стоит писать pass - нужно подумать, что программа должна делать, если введено не число.
    Ответ написан
    1 комментарий
  • Бот обратной связи на Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, "не получилось" - это, конечно, офигенно детальное и полезное описание проблемы.

    Во-вторых, я подозреваю, что дело вот в этом:
    photo=message.photo[0].file_id
    Наверняка если к сообщению не приложено фото, коллекция photo пуста, тогда попытка обращения к нулевому элементу выкинет исключение, так как этого нулевого элемента просто нет. Проверяй, есть ли вообще что-то в message.photo.
    Ответ написан
    Комментировать
  • Как вызвать функции зависимо от колбека?

    Vindicar
    @Vindicar
    RTFM!
    У объекта call (тип CallbackQuery) есть свойство data. Ты его можешь задать при создании кнопки (которое почему-то опущено в коде), тогда оно будет иметь значение, соответствующее нажатой кнопке. А дальше просто сравниваешь это значение с желаемым.
    Ответ написан
    3 комментария
  • Можно ли сгенерированный Literal передать в параметры функции?

    Vindicar
    @Vindicar
    RTFM!
    поэтому о статическом литерале речи не идет

    А ничего, что литералы, как и большинство инструментов type-checking, предназначены для статической проверки кода? Интерпретатор их игнорирует при выполнении. Их использование в discord.py, хотя и красивое, но всё же нестандартное.
    Поэтому само сочетание "динамический литерал" есть бессмыслица.

    Принимай жанр как строку, и проверяй её самостоятельно, либо, если очень хочется, прописывай для жанра свой конвертер.
    Ответ написан
    Комментировать
  • Как в reply_markup добавить больше переменных с копками?

    Vindicar
    @Vindicar
    RTFM!
    bot.send_photo(message.chat.id, photo, " Выберите нужную функцию:",
    parse_mode="html", reply_markup=tg, info)

    reply_markup=tg - аргумент, переданный по имени
    info - аргумент, переданный позиционно.
    Питон не позволяет указывать позиционные аргументы ПОСЛЕ именованных. Укажи для info имя аргумента, в который ты хочешь передать это значение, по аналогии с reply_markup= или parse_mode=.
    Ответ написан
    Комментировать
  • Как разделить текст на части?

    Vindicar
    @Vindicar
    RTFM!
    Т.е., если переформулировать: разбить текст по символу перевода строки так, чтобы размер первой части не превышал N символов?
    text = """Текст слово Текст
    Новая строка
    Ещё новее строка"""
    N = 12
    
    start, rest = text[:N], text[N:] # отделяем ту часть текста, где мы ищем перевод строки, от остатка
    first, _, second = text.rpartition('\n') # ищем последний перевод строки в этой части - до него "начало"
    last = (second + rest) if second else rest # "конец" собираем из того что после перевода строки и остатка
    print('-'*10)
    print(first)
    print('-'*10)
    print(last)
    print('-'*10)

    Если перевода строки в первой части текста нет, то текст будет просто разрезан по N символам.
    Ответ написан
    2 комментария