Задать вопрос
  • Как переместить курсор в нужную позицию с помощью JavaScript?

    Vindicar
    @Vindicar
    RTFM!
    Нет, курсор двигать нельзя по очевидным причинам. Представь сайт, который принудительно удерживает курсор на себе, не давая передвинуть его на Х.
    Ты можешь схитрить так: навесить на всплывашку cursor: none, запомнить текущие координаты курсора, и смотреть на смещение курсора относительно этих начальных координат. Не самый надёжный способ, но это кое что.
    Ответ написан
    2 комментария
  • У меня ошибка TypeError: 'list' object is not callable Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Всё перепробовал, а прочитать внимательно - не пробовал.
    Почему ты вообще трогаешь message_handlers, это не декоратор, а список установленных обработчиков. Даже по названию можно догадаться - handlers во множественном числе.
    Тебе нужен message_handler.
    Смотри официальные примеры.
    Ответ написан
    Комментировать
  • Почему не получается запустить клиент через run в Pyrogram?

    Vindicar
    @Vindicar
    RTFM!
    В документации pyrogram английским по белому написано (выделение моё):
    Client.run()
    Start the client, idle the main script and finally stop the client.
    When calling this method without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.

    pyrogram.idle()
    Block the main script execution until a signal is received.

    Отсюда вывод: у тебя дальше self.client.run() управление не пойдёт, даже конструктор Account не завершится, не говоря уж о вызове new_account.start_messaging().

    И к слову о нём: ты сделал этот метод async, а вызываешь его как будто он синхронный. WTF?
    Ответ написан
  • Есть ли альтернатива декораторам из Python в Java?

    Vindicar
    @Vindicar
    RTFM!
    Насколько хватает моих скромных познаний, механизма, полностью эквивалентного питоновским декораторам, нет и быть не может (если не лезть в байткод).
    Но вот каждый отдельный use case для декораторов, наверно, можно реализовать, так или иначе. Так что изволь написать, что ты пытаешься сделать с их помощью.
    Ответ написан
    Комментировать
  • Как проходить список и одновременно удалять элементы, в том числе впереди курсора?

    Vindicar
    @Vindicar
    RTFM!
    Сделай цикл while и наращивай индекс текущего элемента сам, в отдельной переменной. Если элемент не нужен - удаляешь его, если нужен - увеличиваешь индекс.
    Альтернативно, ты можешь просто проходить список с конца, тогда "съезжать" будут только те элементы, которые ты и так уже обработал. Будет простой цикл с шагом -1.
    Ответ написан
    Комментировать
  • Как запустить функцию в отдельном потоке второй раз?

    Vindicar
    @Vindicar
    RTFM!
    1.
    "RuntimeError: threads can only be started once"
    Можно ли это как-то обойти понятным для начинающего в python способом?

    Можно перестать хотеть странного и принять как данность, что завершившийся поток - завершился. С ним уже ничего не сделаешь. Это так на уровне ОС, если что. Так что создавай экземпляр Thread тогда, когда надо запустить поток.
    2.
    Может можно как-то по-другому стартовать, без доп функции?

    И как ты это себе представляешь? Tkinter должен знать, какой твой код выполнить при нажатии кнопки. Единственный способ это сделать - передать ему функцию или иной callable object. Да, можно использовать лямбду, но в лямбду много не уместишь, так что лучше функция.
    А когда придёшь к оборачиванию GUI в классы, поймёшь, что передача функции/метода - наиболее простой и практичный подход.
    Ответ написан
    1 комментарий
  • Как сделать exe файл в python?

    Vindicar
    @Vindicar
    RTFM!
    Для начала можешь переименовать питоновский файл в pyw - это означает запуск без окна консоли.
    А далее, разбираешься с pyinstaller, а лучше сразу с его обёрткой auto-yp-to-exe, там есть опция для оконных приложений.
    Файлы данных внутрь exe я бы не вносил, они всё равно будут распакованы во временный каталог при запуске, так что только запуск замедлишь. Но если очень хочется, такая опция тоже есть, читай доки на вышеупомянутое.
    Ответ написан
    Комментировать
  • Пишу .join в боте и выдает await ctx.command.invoke(ctx), что делать?

    Vindicar
    @Vindicar
    RTFM!
    PyNaCl library needed in order to use voice

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

    Vindicar
    @Vindicar
    RTFM!
    Вся проблема в том, что мне нужно вызвать функцию "Tsize_3" в ручную

    В этом и есть проблема, да. Не нужно вызывать обработчики событий вручную. Если тебе нужно повторить одно и то же действие в двух местах - вынеси его в обычную подпрограмму, и уже эту подпрограмму вызывай и в обработчике, и где там тебе ещё нужно.
    А лучше, опиши, что ты вообще пытаешься сделать - из кода это не очень понятно.
    Ответ написан
    Комментировать
  • Как решить проблему с could not convert string to float?

    Vindicar
    @Vindicar
    RTFM!
    А с чего ты взял, что ты обрабатываешь только колонки mpg и weight? astype(float) ты применяешь ко всему датасету.
    Ты бы и сам догадался, если бы не пытался засунуть всю команду в однострочник - у тебя exception бы вылетел как раз на строке с astype().
    Ответ написан
    Комментировать
  • Как убрать ошибку кода в exe?

    Vindicar
    @Vindicar
    RTFM!
    1. почитать внимательно про auto-py-to-exe и осознать, что он базируется на pyinstaller
    2. почитать, как указать pyinstaller модуль, импорта которого он не увидел (hidden import)
    3. найти, где в интерфейсе auto-py-to-exe можно указать дополнительные опции для pyinstaller (подсказка: секция Advanced)
    4. Вписать в нужный параметр имя comtypes (возможно, придётся указать именно comtypes.stream)
    Ответ написан
    8 комментариев
  • Проблема с customtkinter, параметр command у кнопки и цикл for. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ну классика же, lambda завязывается на саму переменную, а не на её текущее значение. Т.е. если ты изменишь i, то все лямбды это увидят.
    i = 10
    f = lambda: print(i)
    i = 20
    f()  # выведет 20

    Нужно сохранить искомое значение в самой лямбде. Самый простой способ - вот такой хак:
    i = 10
    # сохраняем глобальную i как значение по умолчанию параметра i
    f = lambda i=i: print(i)  
    i = 20
    f()  # выведет 10
    f(30)  # выведет 30

    Как видишь последний вызов работает немножко не так, как мы ожидаем - а ожидаем мы ошибку из-за лишнего параметра. Но можно схитрить так:
    i = 10
    # сохраняем глобальную i как значение по умолчанию параметра i
    # Параметр i может быть передан только по имени: i=30
    f = lambda *,i=i: print(i)  
    i = 20
    f()  # выведет 10
    f(i=30)  # выведет 30
    f(30)  # TypeError: <lambda>() takes 0 positional arguments but 1 was given
    Ответ написан
    1 комментарий
  • Синхронизация двух директорий через ssh?

    Vindicar
    @Vindicar
    RTFM!
    Да, странная. Обычно бэкапы делаются по расписанию, а для этих целей rsync хватает.
    А твой скрипт после написания и отладки как раз и превратится в неполное подобие syncthing, nextcloud и т.п.
    Ответ написан
    1 комментарий
  • Как исправить код?

    Vindicar
    @Vindicar
    RTFM!
    Ну ты уже вот тут глупость сделал.
    self.layer_1 = nn.Linear(inp1, inp2)  # Почему inp2 ?!

    Первый параметр Linear - число входов слоя. Для первого слоя должно совпадать с числом значений для данного входа сети. Второй параметр - число нейронов, т.е. число выходов слоя. Должно совпадать с числом входов следующего слоя сети.
    Вообще правило простое - сколько на выходе одного слоя, столько на входе следующего. Так как concatenate тупо дописывает данные одного входа в конец другого, то для него сумма длин входов должна быть равна выходу (а выход - входу следующего).

    Например, в твоём случае на входе первого Linear должно быть inp1 нейронов, а на выходе - 72 - inp2 нейронов. После concatenate получится (72 - inp2) + inp2 = 72 нейрона - ровно столько, сколько на входе второго Linear.

    Код исправишь сам.
    Ответ написан
    Комментировать
  • Как сделать подсчет скорости нажатий на пробел?

    Vindicar
    @Vindicar
    RTFM!
    Одним голым питоном - трудно, потому что консольный ввод буферизуется. Условно, я зажму пробел, а программа будет видеть как я ввожу один пробел за другим. Да и интервал между нажатиями теряется.
    Тебе нужно ловить пары событий нажатие-отпускание. Ты можешь попробовать использовать tkinter (он в питоне доступен сразу), создать окно, и привязать к нему обработчики соответствующих событий. Причём нужна именно пара событий <KeyPress> и <KeyPress>, а не просто <Key>.
    А реакция на эти события... зависит от того, что тебе нужно. Например, заводишь переменную-счётчик, при отпускании клавиши наращиваешь его на 1, а раз в секунду (в ткинтере есть метод .after(), он хорошо подходит для задач вида "сделай вот это через заданное время") выводишь этот счётчик пользователю, и тут же сбрасываешь его в ноль.
    Ответ написан
    Комментировать
  • Как решать такие задачи?

    Vindicar
    @Vindicar
    RTFM!
    Размер выхода слоя равен размеру входа следующего слоя.
    Вот как узнать размер выхода последнего слоя - я фз, тут недостаточно данных.

    EDIT: ой, блин, я невнимательный. Не увидел, что слои идут не 1->2->3->4, а 4->3->4.
    Тогда ещё проще, выход 4 должен совпадать по размеру со входом 3, а вход 4 - с выходом 3.
    Ответ написан
    2 комментария
  • Что использовать в качестве workerА для отложенных задач?

    Vindicar
    @Vindicar
    RTFM!
    Я бы вообще изобрёл велосипед, если честно.
    У тебя есть список или база активных (неслучившихся) событий. Пусть это будет пара ID-метка времени, остальная инфа нам без надобности.
    При запуске бота выбираем из списка ближайшее событие, и вычисляем время ожидания (с небольшим запасом) и спим в корутине. В случае, если ожидание прервано раньше - повторяем то же самое, чтобы либо "доспать", либо переключиться на ожидание более близкого события.
    Если же ожидание закончилось успешно, обрабатываем событие и снова повторяем поиск ближайшего события.
    Если список событий изменился, прерываем текущее ожидание, чтобы корутина ожидания могла адаптироваться к изменениям.

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

    Vindicar
    @Vindicar
    RTFM!
    Если Normalize может работать нормально с uint8 - то преобразования типа не нужны.
    Если не может - то никакой другой порядок и не заработает.
    Ответ написан
    Комментировать
  • Как склеить 2 и более изображения с помощью поиска локальных особенностей?

    Vindicar
    @Vindicar
    RTFM!
    Можно сделать так:
    1. Вычисляешь матрицу преобразования, которому нужно подвергнуть изображение 2, чтобы склеить его с изображением 1 (далее, 2->1).
    2. Вычисляешь матрицу преобразования 3->2.
    3. Склеиваешь 3 с 2, используя матрицу 3->2.
    4. Склеиваешь сумму 3 и 2 с 1, используя матрицу 2->1.
    Альтернативно, ты можешь подвергнуть 3 преобразованию 3->2, а потом 2->1 (либо последовательно, либо перемножив их матрицы), чтобы перевести его в систему отсчёта изображения 1, и склеить их непосредственно.

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

    Ещё я не вполне понял, что ты имеешь ввиду под "панорамное изображение".
    Но я подозреваю, это может быть вызвано тем, что на выбранном корневом (первом) изображении ракурс отличается от "нормального" - строго перпендикулярного целевой плоскости. Тогда тебе нужно выбрать такое изображение, на котором ты можешь более-менее точно определить целевую плоскость. ТУт может помочь какой-нибудь маркер типо QR-кода, aruco-маркера, да хоть банальный шахматный шаблон (с ним, кстати, проще всего). Главное, чтобы его размер был известен, и он был прямоугольный. Тогда можно будет рассчитать преобразование для этого изображения, которое исправит перспективу. Мы будем "смотреть прямо" на плоскость, где расположен этот шаблон. Это исправленное изображение и будет для нас корневым, к которому мы будем "пристёгивать" остальные.
    Ответ написан
    Комментировать