• Нужно ли (и как) позаботиться о завершении работы нескольких потоков, которые тоже запущены из отдельного потока?

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

    Vindicar
    @Vindicar Автор вопроса
    RTFM!
    AnythingLLM можно попробовать подружить с LM-Studio или с Jan, тогда не придётся возиться с Ollama.
    Но качество работы пока что неудовлетворительное - надо разбираться.
    Ответ написан
    Комментировать
  • Логика работы Python?

    Vindicar
    @Vindicar
    RTFM!
    Логика предельно простая - на момент обращения к элементу он должен быть определён.
    Простой пример:
    def func_B(s):
        print('B says:')
        func_A(s)
    
    def func_A(s):
        print('Hello from A to', s)
    
    func_B('the world')


    Данный код отработает. Почему, ведь func_A() описана после её вызова в func_B()?
    Потому что поиск этой функции произойдёт в момент вызова func_B() - а тогда функция func_A() уже будет определена.

    А вот тут поменять местами не получится:
    DEFAULT = 'world'
    
    def func_C(s = DEFAULT):
        print('Hello,', s)

    Потому что обращение к DEFAULT происходит в момент определения func_C(), а не в момент её выполнения.
    Ответ написан
    1 комментарий
  • Как поменять for i in range на while?

    Vindicar
    @Vindicar
    RTFM!
    Изменяй. Разрешаю.

    Если серьёзно, то учебные задачи надо решать самостоятельно, иначе какой смысл браться?
    Но тут достаточно понимать, что делает for i in range(x): ...
    Это близкий эквивалент такого кода:
    i = 0
    while i < x:
        ...  # тут тело цикла for
        i += 1

    Ответ написан
    Комментировать
  • Как создать свой xml формат?

    Vindicar
    @Vindicar
    RTFM!
    1. Написать класс-реестр, который по имени тега определяет класс компонента.
    2. Написать базовый класс компонента, который умеет читать своё XML описание, выделять из него прописанные атрибуты (типа цвета, текста и т.д.), а также находить и создавать вложенные компоненты, если они есть. Для определения, какой класс нужно использовать для создания компонента, и нужен реестр.
    3. Отнаследовать от базового класса классы для поддерживаемых тобой компонентов. Они должны брать свои атрибуты (которые выделил базовый класс), а потом создавать и настраивать соответствующий элемент управления. Также они должны предоставлять способ подписаться на события, на которые ты хочешь реагировать, типа изменения поля ввода, клика по кнопке и т.д. И, разумеется, они должны быть прописаны в реестре компонентов, чтобы их можно было вкладывать друг в друга.

    Работы вагон, а толку будет немного, но для тренировки можно попробовать.
    Ответ написан
    Комментировать
  • Как указать правильный путь к файлу с изображением в html?

    Vindicar
    @Vindicar
    RTFM!
    Почитай, как работают относительные URL.
    Если коротко, то, находясь на https://example.com/some/stuff.html, следующие URL будут работать так:
    https://example.com/something/else.html ведёт на https://example.com/something/else.html
    //example.com/something/else.html тоже ведёт на https://example.com/something/else.html, при этом https взято из текущего адреса
    /something/else.html тоже ведёт на https://example.com/something/else.html, при этом схема и имя сайта взяты из текущего адреса, а путь считается от корня.
    something/else.html ведёт на https://example.com/some/something/else.html (схема, имя сайта и имя каталога взяты из текущего адреса, от них считается путь).
    Ответ написан
    Комментировать
  • Данные отсутствуют пишет не правильные селекторы?

    Vindicar
    @Vindicar
    RTFM!
    Может, у тебя и впрямь неправильные селекторы.
    Может, сайт меняет названия классов время от времени, и твои селекторы устарели.
    Может, сайт подгружает данные динамически, и BS получает на вход урезанный вариант страницы. BS не выполняет скрипты.
    Может, сайт понимает, что твой бот - это бот, и отдаёт тебе "уходи, противный" вместо страницы.

    Запиши скачанную страницу в файл, и посмотри, насколько она похожа на то, что ты ожидаешь получить.
    Ответ написан
    Комментировать
  • Python Telebot. Не сохраняется значение в переменную. Сможете помочь?

    Vindicar
    @Vindicar
    RTFM!
    Читай, как работают глобальные переменные (ключевое слово global) в питоне.

    Ты сейчас создаёшь в обработчике события локальную переменную a, которая, разумеется, пропадает, когда обработчик завершается.

    Ну и да, я исхожу из того, что у тебя дальше есть код по запуску бота, которому ты привязал этот обработчик.
    Ответ написан
    Комментировать
  • Какова верная реализация множественного выбора в SQLite через LIKE и REGEXP (Python)?

    Vindicar
    @Vindicar
    RTFM!
    заглавные буквы идут в кодовых таблицах подряд. По идее, будет достаточно что-то типа:
    WHERE substr(word, 1, 1) BETWEEN 'A' AND 'Z'
    если таблица word меняется нечасто, добавь в неё отдельный столбец, содержащий первую букву, и сделай индекс по нему. Может значительно ускорить дело.
    Ответ написан
    1 комментарий
  • Как получить сообщение, на которое ответил пользователь?

    Vindicar
    @Vindicar
    RTFM!
    А зачем ты делаешь get_message(), если message.reply_to_message уже должен содержать информацию о сообщении, на которое был сделан ответ?
    Ответ написан
  • Как записать в переменную упоминание пользователя(в Python)?

    Vindicar
    @Vindicar
    RTFM!
    Упоминание где, блин?

    Если в параметрах команды, то достаточно поставить типом параметра discord.Member.
    Ответ написан
  • Как сложить воедино все символы кроме первого после переделки в list?

    Vindicar
    @Vindicar
    RTFM!
    Ботописатель... я тебе секрет скажу.
    prefix = "!"
    s = "!ping"
    if s.startswith(prefix):
        command = s[len(prefix):]  # срезы в питоне? не, не слышал
        print('Команда', command)
    else:
        print('Это не команда')

    Секрет
    Сначала выучи основы языка, потом разберись как работают сетевые приложения, и только потом пиши ботов. Иначе так и будешь глупости писать.
    Ответ написан
    1 комментарий
  • Можно ли импортировать файл с помощью пути(как например data/config.py) и использовать его как файл через обычный импорт?

    Vindicar
    @Vindicar
    RTFM!
    Теоретически да, например, поигравшись со списком каталогов импорта. Но нахрена?
    Мне нужно именно через путь обязательно

    Я навскидку не назову ни одного случая, когда бы требовалось именно такое. Если у тебя импортируемый файл в подкаталоге относительно выполняемого, его можно прекрасно заимпортить. Например, из main.py у тебя должен нормально отработать import data.config as config безо всяких дополнительных манипуляций.
    Ответ написан
  • Python: как закрыть вкладку в браузере?

    Vindicar
    @Vindicar
    RTFM!
    Встречный вопрос, ответ на который ты не дал: о каком браузере речь?
    Если ты решаешь задачу автоматизации действий на сайте, то да, селениум в помощь. Сам открыл сайт, сам прокликал по нужным местам, сам закрыл.
    Если это запущенный сторонний браузер под контролем пользователя, то ситуация многократно усложняется. По идее, можно закрыть текущую вкладку, отправив в окно браузера нажатие клавиш Ctrl-W. Но это может быть перехвачено, и в целом работа не гарантируется. Перечисление вкладок - вообще та ещё задача, к которой не факт что просто подойти.

    Так что по настоящему важный вопрос звучит так: зачем тебе это? Что ты пытаешься сделать?
    Ответ написан
  • Как мне правильно запустить поток с ткинтером?

    Vindicar
    @Vindicar
    RTFM!
    root.withdraw() для скрытия и root.deiconify() для показа пробовал?
    Ответ написан
    1 комментарий
  • Как именно гарантируется выделения n байт памяти библиотекой stdint.h?

    Vindicar
    @Vindicar
    RTFM!
    Не претендую на глубокое знание плюсов, но...
    Модификаторы типа вроде long или short не гарантируют увеличение или сокращение выделяемой памяти под переменную, а результат зависит от компилятора, - так пишется во многих учебниках. В то же время типы intx_t, описанные в библиотеке stdint.h, якобы гарантируют размер переменной.

    Но ведь stdint.h идёт в комплекте с компилятором, а потому составлен с учётом особенностей этого компилятора.
    Ответ написан
    Комментировать
  • Код не работает до опр. момента, что делать?

    Vindicar
    @Vindicar
    RTFM!
    1. Осознать, что и тот, и другой код полностью занимает поток, в котором он запущен.
    2. Почитать, как работать с многопоточностью - особенно то, что касается работы с одним объектом из нескольких потоков (мьютексы, очереди и т.п.)
    3. Запустить трекер в отдельном потоке, затем запустить GUI в главном потоке.

    Альтенативно - переписать трекер, чтобы вместо while True: ... time.sleep() там был метод, который надо периодически вызывать, и вызывать его используя метод after() в ткинтере. Тогда всё будет работать в одном потоке.
    Ответ написан
    Комментировать
  • Как принимать значение entry в customtkinter?

    Vindicar
    @Vindicar
    RTFM!
    Как ни странно, почитать документацию.
    Ответ написан
    Комментировать
  • Почему через psycopg2 не могу получить список таблиц в postgres?

    Vindicar
    @Vindicar
    RTFM!
    Ну всё правильно. Запрос выполнен, но ты не получаешь строки ответа. Ты же не ожидаешь, что либа для БД будет сама по себе спамить строки в консоль при каждом запросе? =)
    with conn:
        with conn.cursor() as cursor:
            for row in cursor.execute(sql):
                print(row)
    Ответ написан
  • Как обрабатывать свои события?

    Vindicar
    @Vindicar
    RTFM!
    aioschedule. Ну или тупо вечный цикл с asyncio.sleep(2*60*60) внутри, запущенный в отдельной корутине через create_task().
    Ответ написан
    Комментировать