Ответы пользователя по тегу Python
  • Изменение ProgressBar по итерациям в функции?

    Vindicar
    @Vindicar
    RTFM!
    Добавь функции ещё один параметр - callback-функцию, которая будет вызываться каждые X итераций.
    Тогда вопрос "как подружить функцию с индикацией прогресса" сведётся к написанию подходящей callback-функции. Условно:
    from time import sleep
    
    def worker(n: int, cb=None):
        for i in range(n):
            sleep(0.2)  # работу работаем
            if cb is not None and i % 5 == 0:
                cb(i, n)  # оповещаем, если пора и если есть что
        if cb is not None:
            cb(n, n)  # последнее оповещение на 100%. можно убрать
    
    # использование
    def callback(i, n):  # callback для вывода прогресса в консоль
        print(f'{i/n:.1%}')  # выводим процент  завершения
    
    worker(50, callback)  # работаем
    Ответ написан
    2 комментария
  • Как сделать функцию в которой в переменной будет много функций?

    Vindicar
    @Vindicar
    RTFM!
    Блок операторов, вынесенный отдельно и именованный - это и есть функция, вообще-то. Читай про ключевое слово def.
    from turtle import *
    
    color("black", "red")
    m = 100
    
    def myfunc():  # мы говорим "существует функция myfunc, не принимающая параметров"
        forward(12*m)  # функция "увидит" переменную m, описанную выше по коду
        right(940)
    
    begin_fill()
    for i in range(4):
        myfunc()  # вызываем нашу функцию
    end_fill()
    canvas = getcanvas()
    cnt = 0
    for y in range(-100*m, 100*m, m):
        for x in range(-100*m, 100*m, m):
            item = canvas.find_overlapping(x,y,x,y)
            if len(item) == 1 and item[0] == 5:
                cnt += 1
    print(cnt)
    done()
    exit()
    Ответ написан
    2 комментария
  • Почему некоторые декораторы жёлтого цвета а "@" голубого цвета на библиотеке disnake?

    Vindicar
    @Vindicar
    RTFM!
    А библиотека и версия питона тут ни причём. Это используемая тобой среда разработки (IDE) так показывает. На работу кода цвет текста в IDE не влияет. =)

    А вот разницу между
    @decorator
    def func():
        ...

    и
    @decorator()
    def func():
        ...

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

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужно, чтобы запущенные потоки доработали до конца даже при завершении программы - то можно их просто запустить и оставить.
    Сложности обычно начинаются, когда нужно завершить фоновый поток вместе с главным - фоновый поток должен сам проверять, что пора завершаться, и делать это достаточно часто.
    Ответ написан
    Комментировать
  • Логика работы 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. Отнаследовать от базового класса классы для поддерживаемых тобой компонентов. Они должны брать свои атрибуты (которые выделил базовый класс), а потом создавать и настраивать соответствующий элемент управления. Также они должны предоставлять способ подписаться на события, на которые ты хочешь реагировать, типа изменения поля ввода, клика по кнопке и т.д. И, разумеется, они должны быть прописаны в реестре компонентов, чтобы их можно было вкладывать друг в друга.

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

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

    Альтенативно - переписать трекер, чтобы вместо while True: ... time.sleep() там был метод, который надо периодически вызывать, и вызывать его используя метод after() в ткинтере. Тогда всё будет работать в одном потоке.
    Ответ написан
    Комментировать
  • Почему через 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().
    Ответ написан
    Комментировать
  • Почему Python не видит файлы в Linux как в Windows?

    Vindicar
    @Vindicar
    RTFM!
    Если файл лежит в папке со скриптом - надо открывать его, используя путь к пкапке со скриптом, а не надеяться на то, что текущий каталог совпадёт. Под виндой тоже всё зависит от способа запуска скрипта.
    Так что читай про sys.argv[0] и модуль pathlib. Пригодится.
    Ответ написан
    2 комментария
  • Ошибка /usr/local/lib/python3.11/dist-packages/telebot/util.py:92: RuntimeWarning: coroutine 'gpt' was never awaited tas telebot python, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Что за "as" в as def gpt(message, **kwargs):?
    Ты имел ввиду async? Так у тебя программа синхронная, в ней async не к месту. Просто def достаточно.
    Ответ написан
    4 комментария