Задать вопрос
  • В чём проблема? Как решить?

    Vindicar
    @Vindicar
    RTFM!
    bot = discord.ext.commands.Bot(command_prefix = "|");
    bot.run("ТОКЕН")
    client = discord.Client()
    client.run('ТОКЕН')

    Вот скажи, ЗАЧЕМ тебе и Client и Bot?
    Впрочем, догадываюсь. Читать документацию - это ведь для ламеров, а в видяшке написано @client, значит, нужен класс Client, и не волнует.
    class discord.ext.commands.Bot
    Represents a discord bot.
    This class is a subclass of discord.Client and as a result anything that you can do with a discord.Client you can do with this bot.

    Выделение моё.
    В итоге ты регистрируешь команды на одном клиенте, запускаешь совсем другого, и удивляешься, что ничего не работает.
    Про самописную обработку команд в on_message() комментировать не буду.
    Ответ написан
    Комментировать
  • Как вычитать от даты 2 дня ( дата вида строки)?

    Vindicar
    @Vindicar
    RTFM!
    Храни в БД Unix timestamp (количество секунд от начала эпохи). Оно компактнее, и операции сравнения и плюс/минус интервал делать куда как проще.
    Ну и питон позволяет получить дату/время в виде timestamp, и преобразовать обратно.
    Ответ написан
  • Почему не выводит python в командной строке?

    Vindicar
    @Vindicar
    RTFM!
    Галку py launcher (ассоциировать с файлами .py) не забыл?
    Ответ написан
  • Как грамотнее написать скрипт для обновления данных по таймеру?

    Vindicar
    @Vindicar
    RTFM!
    async def long_task():
        while True:
            await do_stuff()
            await asyncio.sleep(3600) # если нужна простая периодичность
    
    # для запуска
    task = asyncio.get_running_loop().create_task(long_task())
    # для останова
    task.cancel()  #выкинет спец. исключение в long_task(), так что finally отработает
    Ответ написан
    4 комментария
  • Как перезагрузить модуль с помощью строчного названия?

    Vindicar
    @Vindicar
    RTFM!
    1. sys.modules
    This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks.

    2. Ещё может пригодиться importlib.invalidate_caches()
    This function should be called if any modules are created/installed while your program is running to guarantee all finders will notice the new module’s existence.
    Ответ написан
    Комментировать
  • Как на питоне проверить наличие строки в массиве из файла?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почему бы не поискать, как обрезать пробелы и как применить функцию ко всем элементами массива в питоне? Там есть эквиваленты и array_map() и trim().
    Ответ написан
    Комментировать
  • Как определить язык пользователя в Python?

    Vindicar
    @Vindicar
    RTFM!
    Браузер присылает заголовки Accept-Language, также можно полагаться на геолокацию.
    Но это всё должно использоваться только как способ определить язык по умолчанию. Предоставляй пользователю способ сменить язык явно.
    Ответ написан
    Комментировать
  • Как возвращать промежуточный результат?

    Vindicar
    @Vindicar
    RTFM!
    Перепишите скрипт A так, чтобы он позволял сообщать сведения о прогрессе иначе. Упрощенный пример:

    Было:
    import time
    
    for i in range(100):
        time.sleep(1)
        print($"{i}%")


    Стало:
    import time
    
    def run_script(on_progress):
        for i in range(100):
            time.sleep(1)
            on_progress(i)
    
    if __name__ == '__main__':
        run_script(lambda i: print($"{i}%"))


    Тогда в другом скрипте будет:
    from script_a import run_script
    
    def my_progress(i):
        pass # показываешь прогресс скрипта
    
    run_script(my_progress)


    Пример очень упрощённый, если скрипт выдаёт несколько видов информации, то либо on_progress будет иметь несколько параметров, либо потребуется несколько таких функций.
    Ответ написан
    1 комментарий
  • Позиционирование в tkinter не поддается логике?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, нельзя смешивать разные менеджеры в рамках одного контейнера. Если ты этого не понял, я фз что ты читал. Т.е. ты можешь гридом разместить несколько панелей, а потом каждую панель наполнять по-разному.
    Во-вторых, стоит чуть-чуть погуглить, и находишь вот такой материал где прямо прописано, что не так со свойством height (ну и width заодно).
    Height of the button in text lines (for textual buttons) or pixels (for images).

    Решение, мягко говоря, спорное, но оно документировано. Размер виджету нужен только как некоторое предпочтительное значение по умолчанию, так как вообще-то всей геометрией занимается выбранный менеджер геометрии. А раз уж хочешь использовать place, почему ты не обратил внимание на параметры width/height?
    В общем, не принимай собственную невнимательность за чужие ошибки.
    from tkinter import *
    
    frame_bot = Tk()
    frame_bot.geometry("640x480")
    # place() возвращает None, как и stack() / grid()
    Button(frame_bot, text="back", bg='gray').place(x=5, y=405, width=30, height=30) 
    Button(frame_bot, text="write", bg='blue').place(x=45, y=405, width=30, height=30)
    Button(frame_bot, text="home", bg='green').place(x=85, y=405, width=30, height=30)
    
    frame_bot.mainloop()
    Ответ написан
    1 комментарий
  • Как сохранить значение переменной после перезапуска кода?

    Vindicar
    @Vindicar
    RTFM!
    Не присваивай переменной значение прописанное прямо в коде, а читай его из файла. Если переменная и впрямь одна и она примитивная (число/строка) - можно просто из файла, если их несколько - нужна структура и модуль json, если их много - впору задуматься о БД.
    Ответ написан
    Комментировать
  • Как получить данные с функции, при нажатии на кнопку?

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

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

    Во времени - весь приведенный тобой код, вплоть до вызова root.mainloop() (который ты не привёл), выполняется в самом начале работы скрипта - еще до того, как на экране появится окно. Чтобы код мог использовать значение, которое было получено в рамках btn_click(), нужно, чтобы этот код выполнялся гарантированно после btn_click() или же внутри btn_click(), но после получения значения Key. Как это гарантировать - подумай сам. Либо обяжи пользователя нажимать на кнопки в строго определнном порядке, либо привяжи исполнение кода к вызову btn_click().
    Ответ написан
    Комментировать
  • Как накладывать изображения в python?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. если переформулировать вопрос:
    Есть два изображения (A и B) с одинаковым набором маркеров. Нужно трансформировать изображение B так, чтобы его маркеры совпали по положению с маркерами изображения A, а потом наложить результат на изображение A.
    Я так понял?

    Если да, то это делается примерно так.
    1. Формируешь два массива координат - маркеры на изображениях A и B. Как - зависит от типа маркеров, но порядок должен быть одинаковым в обоих массивах. Форма (shape) массивов должна быть (N, 1, 2), где последний индекс отвечает за x или y координату, а N - число маркеров.
    2. Вызываешь
    homography, ptmask = cv2.findHomography(arrayB, arrayA, cv2.RANSAC)
    .
    homography будет матрицей проективного преобразования - как повернуть маркеры B, чтобы они легли на маркеры A. ptmask будет содержать сведения о том, какие пары точек удалось совместить.
    3. Делаешь вызов cv2.warpPerspective(), чтобы повернуть изображение B согласно матрице homography. Параметр размера должен быть таким чтобы второе изображение точно уместилось вместе с первым. Например, можно заранее создать большое изображение по размеру.
    4. Делаешь совмещение. Используешь cv2.PerspectiveTransform(), чтобы понять, где на итоговом изображении будут углы изображения B, делаешь cv2.fillPoly() чтобы создать бинарную маску для наложения. В маске белый пиксель будет означать "сюда поместить пиксель из повернутого B", а черный - "оставить пиксель как есть". Используешь эту маску, чтобы выполнить наложение.

    Пример кода и исходных данных - не совсем то, что тебе нужно, но идею передаст, я надеюсь.
    Ответ написан
  • Tkinter grid, как растянуть сетку на все окно?

    Vindicar
    @Vindicar
    RTFM!
    Адаптивность решается через rowconfigure() и columnconfigure().
    А вот сам вопрос кривой: тебе нужно окно на весь экран, или только виджет на всё окно? Это разные вещи, как бы.

    Если нужно растянуть один виджет на всё окно (root), то просто
    widget.pack(fill='both', expand=True)
    Ответ написан
  • Как получить html страницы,который не активен через запросы?

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

    Vindicar
    @Vindicar
    RTFM!
    У тебя внутренний цикл while разбивает одно число. Перед этим циклом создай новый список, и закидывай числа туда, а не в X. После while закидывай этот список в X.
    Ответ написан
    1 комментарий
  • Как решить данную проблему с SQLite?

    Vindicar
    @Vindicar
    RTFM!
    for row in result:
        singup = str(row[0])

    Молчаливо подразумевает, что в result будет хотя бы одна строка. Это далеко не факт.
    Если result пуст, то singup не будет присвоено значение.
    Ответ написан
    Комментировать
  • Как достать значение ключа из словаря?

    Vindicar
    @Vindicar
    RTFM!
    Вообще очень странная конструкция. Если ключи верхнего уровня гарантированно уникальны, проще будет сделать так:
    my_lst = [ ... тут твой список ... ]
    my_dct = {}
    for item in my_lst:
        my_dct.update(item)

    И тогда можно будет просто оперировать my_dct.keys(). Например,
    keys = list(map(int, my_dct.keys()))
    print(f"{min(keys)}...{max(keys)}")
    Ответ написан
    1 комментарий
  • Как удалить временные файлы?

    Vindicar
    @Vindicar
    RTFM!
    Используй модуль tempfile, он умеет прибирать за собой. Но это лучше всего работает, если тебе нужен именно файловый объект, а не именованный файл в файловой системе. Есть, конечно, класс tempfile.NamedTempFile, но там свои заморочки.
    Ответ написан
    Комментировать
  • UnboundLocalError: local variable referenced before assignment что делать?

    Vindicar
    @Vindicar
    RTFM!
    Если цикл for block in soup.find_all не выполнится ни разу (например, нет подходящих элементов), то task_stack не будет присвоено значение. А ты дальше его читаешь.
    Предусмотри какое-то значение по умолчанию для этой переменной, и проверяй такой случай.
    Ответ написан
    Комментировать
  • Нажимаю на кнопку она не работает, при этом схема собрана правильно, Что не так с кодом?

    Vindicar
    @Vindicar
    RTFM!
    Проверь документацию, может, номер пина не тот? Номер бита в регистре цифрового ввода вывода - это не то же самое, что номер пина на плате.
    И я без понятия, какую нумерацию использует питоновская обертка. Но судя по отсутствию указания модели платы в коде, вряд ли номер пина на плате...
    Ответ написан
    Комментировать