Задать вопрос
Ответы пользователя по тегу Python
  • Почему Python выдает ""(" was not closed"? хотя все нормально?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в строке одинаковые одинарные кавычки - как вокруг всей строки, так и вокруг значения href. Так что https://www.google.com/ оказалось вне строковой константы. Будь внимательнее. И вообще, в HTML кавычки должны быть двойные.
    Ответ написан
    Комментировать
  • Почему дублируется слэш и не работают сырые строки?

    Vindicar
    @Vindicar
    RTFM!
    Обрати внимание, как ты выводишь значение.
    В питоне есть два строковых представления: str и repr.
    str - человекочитаемое представление. Его можно увидеть, сделав просто print(path). Сразу станет видно, что ничего не удваивается.
    repr, же, по идее, представляет объект так, что если его записать прямо в коде, как показано - получим обратно этот объект. Если это вообще возможно.
    В случае с числами разницы нет.
    В случае со строками - она будет. У тебя на скриншоте именно repr-представление строки - в кавычках, и с экранированием спецсимволов. При этом, записав такую константу, получишь ту же самую строку, что логично.
    Ведь 'a\\b' - это то же самое, что и r'a\b'.

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

    Vindicar
    @Vindicar
    RTFM!
    for i in range(word_count, 0, -1):
    На первой итерации цикла i примет значение word_count.
    Символы в строке word имеют индексы от 0 до word_count-1.
    Так что индекс, равный word_count, не существует. Ты поймаешь исключение IndexError.

    И можно ли его написать более компактно? Если да, то как?

    Освоить срезы (slice). part = word[a:b:c] будет (условно) эквивалентно
    part = ''
    i = a
    while i < b:
        part = part + word[i]
        i = i + c

    для положительного c. А для отрицательного будет while i > b:.
    Если a опущено, по умолчанию это начало последовательности (для c > 0) или конец (для c < 0).
    Если b опущено, по умолчанию это конец последовательности (для c > 0) или начало (для c < 0).
    Если c опущено, по умолчанию это 1.

    Так что для обращения строки нам нужно пройтись по всей строке с шагом -1. Получим вот что:
    word_reversed = word[::-1]
    # это эквивалентно
    word_reversed = word[len(word)-1:-1:-1]
    Ответ написан
    1 комментарий
  • Как соединить 2 python файла в один код?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема в том, что во второй файл надо будет передать объект bot, которого, скорее всего, не будет на момент импорта этого файла.
    Есть не слишком изящный, но простой способ.
    # imported_file.py
    import telebot
    from telebot import types
    
    def setup(bot):  # setup() принимает бота и прочее как параметры.
        # да, прописываем обработчики прямо внутри setup()
        # но вот глобальные переменные здесь прописывать не стоит
        @bot.message_handler(content_types=['text'])
        def get_text_messages(message):
            ...
    
    # main_file.py
    import telebot
    from telebot import types
    import time
    
    import imported_file
    
    bot = telebot.TeleBot("ТОКЕН")
    # убедись, что setup() вызывается строго один раз для каждого дополнительного файла!
    imported_file.setup(bot)  
    ...  # дальше работаем как обычно


    Этот вариант позволяет загрузить файл уже в ходе работы бота, но не предусматривает возможности выгрузить файл на ходу. Впрочем, не все библиотеки позволяют отвязать обработчик от события, так что это не только проблема этого подхода.
    Ответ написан
    1 комментарий
  • Почему не создается БД при старте телеграм бота?

    Vindicar
    @Vindicar
    RTFM!
    просто в папке не создается таблица бд и на этом все.

    создает товар и сохраняет в бд без ошибок.

    Дай угадаю, коннект к базе делаешь командой вида sqlite3.connect('somefile.db')?
    Если так, то ты налетел на проблему относительных путей. Основы информатики, начальная школа.
    Путь somefile.db будет рассчитываться относительно текущего рабочего каталога, который может меняться в зависимости от способа запуска скрипта, да и просто в ходе его работы. А может не меняться. Т.е. нет гарантий, что текущий рабочий каталог будет совпадать с каталогом, где лежит скрипт.
    Лучше определить абсолютный путь к файлу самостоятельно.

    from pathlib import Path
    import sys
    
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()  # каталог, где лежит выполняемый скрипт
    DB_PATH = SCRIPT_DIR / 'somefile.db'  # путь к файлу БД в этом каталоге
    
    conn = sqlite3.connect(DB_PATH)
    Ответ написан
    Комментировать
  • Ошибка: sqlite3.OperationalError: no such column: telegram_id: Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    CREATE TABLE IF NOT EXISTS не сработает, если таблица уже существует - но и только. Если она имеет неправильную структуру, данный вызов её не пересоздаст, а оставит как есть. Проверь структуру таблицы, либо через обращение к таблице схемы (хранит структуру всех таблиц к БД), либо подцепившись клиентом к твоей БД.
    Ответ написан
    Комментировать
  • Почему не изменяется значение переменной в python?

    Vindicar
    @Vindicar
    RTFM!
    class Enemy:
        ...
        def mobReturn(self): 
            self.x_mob = self.rect.x
    
    class Bullet(pygame.sprite.Sprite):
        def update(self):
            if x_mob>=100:

    В первом случае ты изменяешь атрибут экземпляра класса Enemy.
    Во втором случае ты читаешь локальную переменную метода update() класса Bullet.
    Это совершенно разные области видимости, они друг о друге ничего не знают.

    Если ты пытаешься решить задачу обнаружения коллизий (т.е. пересечений двух объектов), тебе как-то придётся их "познакомить".
    Или сделай метод у противника, в который передаёшь пулю, и спрашиваешь "вот это в тебя попало?".
    Или сделай метод у пули, в который передаёшь противника, и спрашиваешь "ты вот в это попала?"
    Или вообще сделай отдельную функцию, куда передаёшь врага и пулю, если не хочешь нагружать их этой обязанностью.

    Во всех случаях проверку коллизии нужно будет делать каждый кадр. Так что в главном цикле игры надо будет перебирать активных врагов и активные пули, и проверять их. В простейшем случае - всех со всеми.
    Ответ написан
  • Вылет Python при возврате c_char_p из dll ctypes. Что не так?

    Vindicar
    @Vindicar
    RTFM!
    У тебя возвращаемая переменная размещена на стеке. Возможно, string умирает по выходу из функции, и уносит с собой выделенную строку, так что указатель к моменту возврата из функции уже ни на что не указывает.

    Если обратиться к функции из под C++, она сработает?
    # include <fstream>
    # include <string>
    using namespace std;
    
    const char* readfile(char* filename) {
      ifstream file;
      string lines, line;
      
      file.open(filename);
      if (file.is_open()) {
        while (file >> line) {
          lines += line;
        }
        file.close();
        return lines.c_str();
      } else {
        char* trashVar = "Bad open";
        return trashVar;
      }
    }
    
    int main()
    {
        cout << readfile("filename.txt");
        return 0;
    }
    Ответ написан
    4 комментария
  • У меня в программе ошибка не считает последную функцию не тот ответ как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Впридачу ко всему остальному выше:
    return clas 
    return name

    Отработает только первый return.
    Ответ написан
    Комментировать
  • JSON io.UnsupportedOperation: not readable почему выводиться данная ошибка JSON?

    Vindicar
    @Vindicar
    RTFM!
    with open('values.json') as json_file:
    Для чего открываешь файл? Чтение? Запись? Надо указывать.
    Ответ написан
  • Как можно оптимизировать код для склейки видео по запросу пользователя?

    Vindicar
    @Vindicar
    RTFM!
    a = VideoFileClip("./Video/a.mp4")
    b = VideoFileClip("./Video/b.mp4")

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

    2. Что мешает подставить введённую строку в имя файла?
    Ответ написан
    1 комментарий
  • Возможно ли добавить функцию в бота aiogram, которая будет удалять/изменять текст сообщения?

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

    Vindicar
    @Vindicar
    RTFM!
    1. Записать в переменной ID получателя.
    2. Разобраться, как отправить сообщение по заранее известному ID.
    3. Разобраться, как пользоваться aioschedule.
    Ответ написан
    Комментировать
  • Как сделать так, что бы обновлялось всё время?

    Vindicar
    @Vindicar
    RTFM!
    Я написал такой код:

    Не верю. (с)

    Если бы ты сам его написал, ты бы знал, что у тебя там сначала вечный цикл while True, который прерывается только если нажата клавиша (cv2.waitKey()) с кодом 27, т.е. Esc. Но этот цикл только читает кадр и показывает его в окне. А всё распознавание идёт уже после этого цикла. И там же вывод одного кадра и ожидание любой клавиши.

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

    Vindicar
    @Vindicar
    RTFM!
    А) Запускай скрипт как суб-процесс через os.system() / subprocess / вариации на тему. Годится, если скрипт-сервис должен быть изолирован от основного скрипта.
    Б) импортируй модуль через importlib. Каждый модуль должен иметь точку входа, скажем, класс или функцию с заданным именем, которую основная программа активирует. Более тесное взаимодействие, со всеми плюсами и минусами.
    Ответ написан
    Комментировать
  • Как настроить универсальный хендлер в аиограм?

    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!
    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. Дальше работа идёт как обычно - приняли сообщение пользователя, обработали состоянием, перешли к следующему состоянию.
    Ответ написан
    Комментировать