• Что делать если не загружается кога discord.py?

    Vindicar
    @Vindicar
    RTFM!
    for filename in os.listdir("./cogs"):
    Ты ищешь подкаталог cogs в текущем рабочем каталоге программы.
    Это не то же самое, что и каталог, где находится программа.
    Ты уверен, что у тебя путь к нужному каталогу?
    from pathlib import Path
    import sys
    # каталог скрипта
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()
    # каталог с когами
    COGS_DIR = SCRIPT_DIR / 'cogs'
    # список имён когов
    COGS = [f.stem for f in COGS_DIR.glob('*.py')]
    Ответ написан
    Комментировать
  • Как верно настроить вероятность в мини - игре?

    Vindicar
    @Vindicar
    RTFM!
    0. Главное: вопрос у тебя звучит "Как верно настроить вероятность". В коде ровно одна строчка с random, и ты не объясняешь что она делает. Собственно, и правила игры (т.е. желаемое поведение кода) ты не озвучил. Что такое "подкрутка"? Что тут посоветуешь...
    1. Если ты ловишь себя на том, что создаёшь переменные вида mine_3, mine_4, mine_5, а дальше делаешь x = eval(f"mine_{mines_kolv}[{now_state}]") тебе нужна индексируемая коллекция! Список или кортеж. Тем более что списки ты уже используешь, значит, знаешь, что это такое. Неужели "список из списков" - это такая сложная концепция?
    2. У тебя в самом первом SQL-запросе подстановка параметров выполняется корректно, а дальше идёт ересь с использованием %-форматирования. Не надо так.
    3. У тебя куча таблиц, из которых ты вытаскиваешь по одному значению. Если эти значения всегда требуются вместе, почему не объединить их в одну таблицу?

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

    Vindicar
    @Vindicar
    RTFM!
    AudioSegment.converter = f"{os.getcwd()}\\ffmpeg.exe"

    Ты уверен, что файл лежит в текущем каталоге? Это не то же самое, что каталог программы.
    Если тебе нужен каталог программы, лучше его и взять:
    from pathlib import Path
    import sys 
    
    SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()
    FFMPEG = SCRIPT_DIR / 'ffmpeg.exe'  # чтобы не париться с разделителем каталогов (/ или \)
    Ответ написан
    Комментировать
  • Метод insert не работает, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ну тут сразу возникает вопрос: какую задачу выполняет этот метод. Ты говоришь, что метод используется другим классом. Окей, это норма. Для чего он используется? Какую задачу другой класс хочет решить вызовом этого метода?
    Вопрос связан с тем, что ты почему-то создаёшь элементы управления в методе put_wigets(). По идее, если твой класс представляет собой группу элементов управления, он должен создавать дочерние элементы в своём конструкторе, и сохранять ссылки на них в приватные (ну, насколько это можно в питоне) поля класса. Методы класса должны к этим полям обращаться. Исходи из того, что локальная переменная в методе (как Ent_numberBox ) живёт только во время вызова этого метода, и не должна содержать ничего, что переживёт этот метод (если это не возвращаемое значение).

    Например, так:
    import tkinter as tk
    
    class InputBox(tk.Frame):
        def __init__(self, master, **kwargs):
            # вызываем унаследованный конструктор
            super().__init__(master, **kwargs)
            # переменные tkinter можно связывать с элементами управления
            # тогда изменение в переменной отобразится в элементе, и наоборот
            # это бывает удобнее, чем дёргать элемент напрямую
            # а ещё можно самим реагировать на изменения значения такой переменной
            self.__value = tk.StringVar()
            # наше поле ввода
            self.__entry = tk.Entry(self, justify=tk.RIGHT, width=22, textvariable=self.__value)
            self.__entry.pack(side=tk.RIGHT, padx=10, pady=15)
            # метка с пояснением
            self.__helptext = tk.Label(self, bg=self['background'], height=3, text="Введите мат. выражение:")
            self.__helptext.pack(side=tk.LEFT)
        
        def get_value(self) -> str:
            """Возвращает введённую строку."""
            return self.__value.get()  # метод get() позволяет прочитать значение переменной tkinter
        
        def set_value(self, value: str) -> None:
            """Заменяет содержимое введённой строки новым."""
            self.__value.set(value)  # метод set() позволяет задать новое значение для переменной
            
        def append(self, symbol: str) -> None:
            """Добавляет символ(ы) к уже введённой строке."""
            self.__value.set(self.__value.get() + symbol)
    
    
    if __name__ == '__main__':
        root = tk.Tk()
        box = InputBox(root)
        box.pack(side=tk.TOP, expand=True, fill=tk.BOTH)
        box.set_value('Hello')
        box.append(', world!')
        root.mainloop()


    Я в этом примере исходил из своего понимания твоей задачи.
    Если это поле ввода, то мы хотим иметь возможность получить введённое значение. Поэтому метод get_value().
    Также ты упомянул необходимость в том, чтобы изменить это значение извне, из другого класса. Значит, нужен метод set_value().
    Также, если это - часть калькулятора, у тебя будет часто встречаться задача "добавить один символ в конец строки". Это можно реализовать через пару get_value()/set_value(), но будет удобнее иметь отдельный метод append().
    Один метод - одна решаемая задача.
    Ответ написан
    3 комментария
  • Как запихнуть в threading.Timer() async-функцию?

    Vindicar
    @Vindicar
    RTFM!
    Если ты хранишь ссылки в БД, то я бы просто сделал отдельную задачу через create_task(), которая с некоторой периодичностью выбирает из БД истекшие ссылки (запрос будет вполне тривиален), рассылает по ним оповещения, а потом удаляет из БД. При таком сценарии таймаут на ссылку переживёт перезапуск бота.
    В принципе можно и без БД, лишь бы в твоём хранилище ссылок хранились сведения о том, когда ссылка должна истечь.
    Ответ написан
    Комментировать
  • Как получить доступ к свойству объекта JSON не зная его название?

    Vindicar
    @Vindicar
    RTFM!
    JSON-объекты загружаются в простой питоновский словарь (а массивы - в список).
    Так что окей, гугл, перебор элементов словаря python.

    В твоём случае что-то вроде
    pages = info["query"]["pages"]
    for page_id, page_data in pages.items():
        ...   # что-то делаешь с page_id и page_data


    Если ты уверен, что у тебя всегда ровно один элемент в словаре, и его ключ тебя не интересует, то можно и так:
    pages = info["query"]["pages"]
    if pages:  # есть что-то в словаре?
        page_data = list(pages.values())[0]
        ...   # работаешь с page_data
    Ответ написан
    1 комментарий
  • Как запустить скрипт используя subprocess и venv из которого запущен главный скрипт?

    Vindicar
    @Vindicar
    RTFM!
    Найди бинарник python, который лежит в этом venv, и укажи его полный путь вместо просто python.
    Но так как ты дожидаешься завевршения скрипта, может иметь смысл такой хак:
    # my_script.py
    import sys
    
    def main(args: list[str]):
        """Тело скрипта здесь..."""
    
    if __name__ == '__main__':
        # скрипт запущен независимо
        main(sys.argv[1:])

    А в главном скрипте будет просто
    import my_script
    
    my_script.main(['--work-dir', work_dir, '--result-dir', result_dir])


    В этом случае тебе не придётся сильно переделывать my_script. Но зато теряешь в удобстве вызова кода, например, если нужно получить значение из этого скрипта.
    Чем больше ты вынесешь из main() в отдельные подпрограммы - тем больше контроля будет у главного скрипта, но и тем больше работы.
    Ответ написан
    Комментировать
  • Почему не получается передать значение в экземпляр класса?

    Vindicar
    @Vindicar
    RTFM!
    self.ship = Ship(screen)
    Ты пытаешься передать в конструктор Ship() локальную переменную screen, которой у тебя нет.
    Тут не C#, если обращаешься к полям класса - явно указывай self.
    Ответ написан
    3 комментария
  • Почему приложение, собранное с помощью Pyinstaller, не находит добавленный в сборку исполняемый файл?

    Vindicar
    @Vindicar
    RTFM!
    subprocess.Popen(("./ffmpeg.exe", …))
    Ты просишь запустить файл ffmpeg.exe, находящийся в текущем каталоге. Текущий каталог может и не совпадать с каталогом, в который pyinstaller распаковал твоё приложение. Почитай, что такое относительный и абсолютный путь.

    Чтобы получить этот каталог, попробуй такой приём из документации:
    import sys
    from pathlib import Path
    
    if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):  # мы запакованы pyinstaller?
        TEMP_DIR = Path(sys._MEIPASS).resolve()  # да - берем каталог приложения
    else:  # нет, мы не запакованы
        TEMP_DIR = Path(sys.argv[0]).parent.resolve()  # берем просто каталог скрипта
    # resolve() делает путь абсолютным, так что при смене текущего каталога путь не сломается
    ffmpeg_path = str(TEMP_DIR / "ffmpeg.exe")  # предполагаю, что ffmpeg лежит не в подкаталоге
    ffmpeg = subprocess.Popen((ffmpeg_path, …))
    Ответ написан
    1 комментарий
  • Почему Discord бот перестает отвечать?

    Vindicar
    @Vindicar
    RTFM!
    Может, уже неакутально, но отвечу.

    asyncio.create_task(bot.start(TOKEN))
    Созданный объект-таск может быть тут же собран garbage collector'ом, так как ты не хранишь ссылку на него. Разумеется, при этом сам таск (в твоём случае бот) прибьётся.
    Сохрани возвращаемый create_task() объект хотя бы в локальную переменную.
    Ответ написан
    Комментировать
  • Дискорд бот на питон не видет команды, почему это может быть?

    Vindicar
    @Vindicar
    RTFM!
    Выглядит так, словно ты выдрал кусок кода, который был оформлен как класс-Cog, тупо воткнул его в основной код бота и ожидаешь, что оно волшебным образом само поймёт. Даже отступы не поправил.

    Вот что тут скажешь кроме "выучи язык сначала"?
    Почитай документацию, как пользоваться когами.
    Ответ написан
    Комментировать
  • Как правильно регистрировать ID пользователя через телеграмм?

    Vindicar
    @Vindicar
    RTFM!
    По твоей схеме - никак. Или бот должен заранее знать ID пользователя, или пользователь должен доказать, что логин - его.

    Я бы на сайте генерил пользователю уникальный одноразовый код и сохранял бы его в БД.
    А в боте по /start выводил бы сообщение, мол, введите свой код. При вводе кода ищи его в БД, если нашел - помечаешь пользователя как зареганного и записываешь его ID.
    Нужно будет навесить пару прибабахов типа возможности запросить новый код, защиту от попыток перебора кодов, и т.п., но суть от этого не меняется.
    Ответ написан
    1 комментарий
  • Как определить большинство и меньшинство по числовой характеристике?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. ты ищешь выбросы (outliers) в данных? Ну вот в этом направлении и гугли. Можно начать с чего-то попроще, скажем, доверительного интервала.
    Или другой подход: если у тебя есть примеры таких наборов данных (а их надо иметь! вслепую много не напишешь), то ты можешь оценить закон распределения расстояний. Например, будет ли распределение похоже на нормальное (гауссово)? Если будет то можно будет оценить параметры распределения (среднее и дисперсию), и для каждого из значений оценить его вероятность. Например, значение, близкое к среднему, будет иметь высокую вероятность, а далёкое от среднего - низкую. Тогда можно будет по некоторому выбранному порогу отсекать "маловероятные" значения.
    Но это будет работать только для достаточно больших групп, хотя бы несколько десятков человек. Для трёх с половиной человек результаты будут очень неточными.
    Ответ написан
    2 комментария
  • Как имитировать физическое движение мыши?

    Vindicar
    @Vindicar
    RTFM!
    Сделай USB-устройство на базе arduino или чего-то подобного, которое имитирует мышь с точки зрения ОС и позволяет управлять собой через какой-то отдельный интерфейс. Всё остальное детектится при желании. А у разрабов игр желание детектить и банить ботов нередко присутствует.
    Ответ написан
    Комментировать
  • По какой логике нарисовать линии для древовидной структуре комментариев?

    Vindicar
    @Vindicar
    RTFM!
    Я бы озадачил дочерний коммент рисованием линии. Тогда ты можешь использовать проверку на вложенность для определения наличия линии, и псевдоселектор :last-child чтобы понять, завершать ли линию на этом уровне, или делать ответвление.
    Ответ написан
    Комментировать
  • Ошибка IndexError: list index out of range. Что делать?

    Vindicar
    @Vindicar
    RTFM!
    Включить голову и подумать, что же ещё.
    value = call.data.upper().split('/')
    Ты ожидаешь, что call.data будет содержать хотя бы один знак /, тогда value будет содержать два элемента - с индексом 0 и индексом 1. Раз IndexError, значит, скорее всего, value содержит только один элемент. А это слуится если call.data не содержит разделителя, в твоём случае /.
    b1 = types.InlineKeyboardButton('USD/EUR', callback_data='usdeur')

    Ну собственно, ты и задаёшь значения callback_data, не содержащие /. Вот и вся разгадка.
    Ответ написан
    Комментировать
  • Как сделать команду которую может использовать только владелец сервера?

    Vindicar
    @Vindicar
    RTFM!
    Читаем доки на has_guild_permissions().
    Similar to has_permissions(), but operates on guild wide permissions instead of the current channel permissions.


    "Работает похоже на has_permissions()"? Окей, тыц по ссылке.
    A check() that is added that checks if the member has all of the permissions necessary.
    Note that this check operates on the current channel permissions, not the guild wide permissions.
    The permissions passed in must be exactly like the properties shown under discord.Permissions.

    И пример кода
    @bot.command()
    @commands.has_permissions(manage_messages=True)  # имя параметра должно быть взято из discord.Permissions
    async def test(ctx):
        await ctx.send('You can manage messages.')

    Тыц по ссылке discord.Permissions, видим большоооой список разрешений. Читаем внимательно, owner нет, но в самом верху есть administrator.
    Значит, нужно has_guild_permissions(administrator=True).

    Делов на две минуты.
    Ответ написан
    1 комментарий
  • Как преобразовать html страницу в картинку на стороне сервера?

    Vindicar
    @Vindicar
    RTFM!
    а браузера на сервере не будет.

    Нет ножек - нет мультиков (с)
    Ты или используешь готовый движок HTML рендеринга и исполнения скриптов (т.е. браузер), или пишешь свой.
    Сразу скажу, последнее - нереально.

    Лучше зайди с другой стороны. Ты можешь использовать matplotlib для генерации статического изображения, так как он умеет не только графики, но и TeX-разметку для формул. А уже это изображение можно закэшировать и вставлять в HTML или в PDF, по желанию юзера.
    Ответ написан
    Комментировать
  • Какое различие между этими функциями?

    Vindicar
    @Vindicar
    RTFM!
    ЕМНИП, нормальное (второе) объявление будет автоматически поднято в начало текущего блока, что позволит вызывать функцию до её формального объявления.
    В первом случае это просто присваивание значения константе, а значит, функция будет доступна только ниже.
    Ответ написан
    Комментировать
  • Как сделать функцию горячих клавиш в telegram боте?

    Vindicar
    @Vindicar
    RTFM!
    Не надо пытаться описывать обработчик в обработчике. Это никогда не сработает так, как ты ожидаешь.
    Если бы дал себе труд погуглить, вышел бы на register_next_step_handler() и как им пользоваться.

    Ну и да, ты спалил токен от бота. Его теперь могут увести, если токен не сменишь.
    Ответ написан
    Комментировать