glu-dimaz, connectedComponentsWithStats() обрабатывает бинарное черно-белое изображение и находит в нём изолированные белые "пятна" (блобы), после чего создаёт карту, на которой каждый независимый блоб имеет свою метку (значение пикселей). Для каждого блоба возвращается его метка, его ограничивающий прямоугольник, его площадь и координаты центроида (точки внутри блоба).
Соотв. можешь ориентироваться на высоту ограничивающего прямоугольника - если масштаб скана более-менее одинаков, то все блобы-символы должны быть примерно одной и той же высоты.
Выбрав из массива блобы-символы, перекопируешь их на новое изображение, и уже его распознаёшь.
cornwr, возьми за основу официальные примеры, например, тот же эхобот. Он тебе покажет, как организовывать работу бота в целом. Дальше перетаскивай обработчик за обработчиком в нового бота. Насколько я знаю, работа с пользователями, сообщениями и т.п. не сильно изменилась.
В телефонах NFC-модуль рассчитан на очень конкретный диапазон частот (в районе 13,56 МГц), который отстоит очень далеко от диапазона частот для RFID-меток и ключей. Ты можешь использовать отдельные девайсы-клонилки, даже тот же Флиппер это умеет. Но смартфоны тут ни о чём.
limaximy, польза в простоте, оптимизации и в необходимости для других механизмов.
Значения по умолчанию для аргументов функции вычисляются один раз - в момент создания объекта функции. Не забываем, что в питоне функции - это такие же объекты, как числа, строки, списки и т.д.
Объявление функции - это такой же оператор, как if или while.
А дальше классический вопрос про лямбду. Что выведет этот код?
funcs = []
for i in range(5):
funcs.append(lambda: print(i))
for f in funcs:
f()
Правильный ответ: 5 раз выведет 4, потому что лямбды ссылаются на саму переменную i, а не на её текущее значение. Чинится это так:
funcs = []
for i in range(5):
funcs.append(lambda x=i: print(x))
for f in funcs:
f()
Это сработает как надо, потому что значение по умолчанию аргумента x будет запомнено в момент создания лямбды, и не будет меняться. Если это поведение изменить, то не будет вменяемого способа зафиксировать текущее значение переменной при создании лямбды. В принципе, всё вышеописанное применимо и не к лямбдам, а к обычным функциям.
Если фиксировать значения вместо переменных, это мало того, что сломает глобальные переменные, но и создаст проблемы из-за того, что мутабельные и немутабельные типы будут вести себя по-разному - т.е. как раз то, от чего ты хочешь уйти. Но в ещё большем масштабе.
AmanitaRubescens, тогда модуль subprocess в руки. Если команда короткая, то можно прямо в обработчике команду запускать. А если долгая и спамит в консоль, придётся заморочиться с отдельным потоком и своевременным выкачиванием данных из stdout/stderr.
SoySois, а пустая ячейка - это <td></td> в разметке, или вообще ничего? В первом случае код увидит тег, а в нём пустую строку. Во втором случае код не увидит ничего. Тут только проверять длину списка, и разруливать ситуацию в зависимости от неё.
А из этого репозитория не заводится? У меня оттуда как минимум 3.10 успешно на семерке завёлся. https://github.com/adang1345/PythonWin7
Насчёт 3.12 - там была проблема с поиском подходящей версии numpy.
Это не принципиально. В основном приложении используется subprocess.run(), он затормозит поток пока запущенный процесс не закончит работу. Сколько потоков в запущенном процессе - не важно.
Raddzor788, а что не понятного? У тебя в __add__() вызов return Commuter5(self.value + other).
Это реализует такую цепочку вызовов:
1. self.value + other вызывает int.__add__(self.value, other)
1.1 Так как int не знает, как прибавить к себе Commuter5, отрабатывает Commuter5.__radd__(other, self.value)
2. Commuter5.__new__() (унаследовано от object.__new__()) создаёт новый экземпляр класса Commuter5.
3. Commuter5.__init__() получает экземпляр из 2 и то, что было вычислено в 1.1, и инициализирует этот экземпляр.
4. return возвращает инициализированный экземпляр из 3, завершая вызов Commuter5.__add__().
Т.е. у тебя __init__() заполняет данными новый экземпляр.
Raddzor788, код оформляй кнопкой </> в редакторе, сайт не поддерживает маркдаун.
И свой поток создания тоже, пожалуйста, структурируй на абзацы.
Чем читаемее вопрос - тем больше будет желающих его читать - тем больше шансов получить ответ.
CityCat4, ну справедливости ради, структура корневого каталога в никсах - тот ещё исторически сложившийся бардак, прям как в винде.
По-хорошему-то надо порядок навести, но никто не рискнёт.
И да, то, что делает каноникал - порядком не назовёшь.
Соотв. можешь ориентироваться на высоту ограничивающего прямоугольника - если масштаб скана более-менее одинаков, то все блобы-символы должны быть примерно одной и той же высоты.
Выбрав из массива блобы-символы, перекопируешь их на новое изображение, и уже его распознаёшь.