Задать вопрос
  • SQL как исправить ошибку?

    Vindicar
    @Vindicar
    RTFM!
    1. Не генерируй запросы через форматирование строк. Используй placeholders. Начиная со слов "the DB-API’s parameter substitution"
    2. Если тебе нужно вставить запись, если её нет, или не делать ничего, если она есть, почитай про INSERT ON CONFLICT DO NOTHING. Ну или про INSERT ON CONFLICT DO UPDATE, если нужно "вставить новую или обновить существующую".
    Ответ написан
    1 комментарий
  • Как передать путь до файлов скрипту на питоне через контекстное меню windows?

    Vindicar
    @Vindicar
    RTFM!
    Не, проблема не в питоне, проблема в винде.
    На стэковерфлоу предложено решение - перенеси свою программу в пункт "Отправить..." (Send To), там требуемое поведение поддерживается лучше.
    Если этого недостаточно, придётся писать плагин для windows explorer.
    Ответ написан
  • Как сделать проверку на совпадении элемента из списка и значение в sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    .fetchone()[0]
    Выстрелил себе в ногу, называется. .fetchone() может вернуть None, если SELECT не нашел ни одной подходящей записи, и тогда попытка обратиться по индексу сгенерирует
    исключение
    TypeError: 'NoneType' object is not subscriptable

    Так что проверяй, что тебе вернул fetchone().
    Ответ написан
  • Какие запросы или домены нагружают сервер?

    Vindicar
    @Vindicar
    RTFM!
    Включить логирование запросов HTTP-сервером на несколько минут (чтобы всё дисковое пространство не забило), потом проанализировать логи?
    Ответ написан
  • Как правильно настроить бот на python?

    Vindicar
    @Vindicar
    RTFM!
    Быстрый гуглинг показывает, что content_types для появления юзера может быть new_chat_members, а не new_chat_member. Проверь, работает ли.
    Ответ написан
  • Как читать документацию discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Вопрос и впрямь странный.
    Нужно определиться, что именно ты ищешь, сообразить, какие могут быть ключевые слова, и искать по ним.
    В списке свойств каждого класса свойства и методы обычно кликабельны, так что можно перейти на подробное описание. Тип свойства указан в синтаксисе type hints стандартного модуля typing.
    Например, discord.Client.activity имеет тип Optional[BaseActivity], т.е. это либо None, либо экземпляр класса-наследника BaseActivity. Перейдя по ссылке, сразу видим список классов-потомков - корневой Activity и три наследника: Game, Streaming, CustomActivity. Дальше уже решаешь, какой тебе подойдёт лучше.
    Ответ написан
    Комментировать
  • При создании команды unban discord.py выдает эту ошибку. Command raised an exception: AttributeError: 'str' object has no attribute 'name' что делать?

    Vindicar
    @Vindicar
    RTFM!
    1. Включить голову.
    2. Почитать документацию про конвертацию параметров в обработчиках команд бота.
    3. Осознать, что в описании обработчика async def unban(ctx,*,member): member не имеет указания типа, а потому discord.py оставляет его строкой.
    4. Сопоставить этот факт с тем, что обращение member.name генерирует ошибку "объект строки не имеет атрибута name"
    5. Хлопнуть себя по лбу.
    6. Вставить в объявление обработчика указание типа для member: member: discord.Member
    Ответ написан
    Комментировать
  • Циклический сдвиг в Python?

    Vindicar
    @Vindicar
    RTFM!
    N=int(input())
    Программа ждёт ввода, не?
    А зачем, кстати, ждёт?
    Ответ написан
    1 комментарий
  • Как сравнить строку с массивом на python?

    Vindicar
    @Vindicar
    RTFM!
    Проще записать допустимые символы не массивом, а множеством, а потом воспользоваться методами множества.
    tag = 'HFDJFUАВЫВHJFDSJK'
    alpha = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }
    if alpha.issuperset(tag): # что делают issuperset() и issubset() почитаешь сам
      print('Всё хорошо')
    else:
      print('Есть недопустимые символы:', set(tag) - alpha )


    Но можно и вручную (может быть несколько медленнее):
    tag = 'HFDJFUАВЫВHJFDSJK'
    alpha = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]
    if all( (symbol in alpha) for symbol in tag ):
      print('Всё хорошо')
    else:
      print('Есть недопустимые символы')
    Ответ написан
    Комментировать
  • Как запустить одновременно два потока Python?

    Vindicar
    @Vindicar
    RTFM!
    В CPython есть проблема - в один момент времени исполняется всегда один поток, даже если ядер у проца несколько. Так что "одновременно" на питоне запустить два потока проблематично. Они будут чередоваться, исполняясь по кусочкам. Исключение - если поток ждёт завершения операции ввода-вывода, или чего-то подобного, т.е. не исполняет непосредственно код на питоне. Тогда он не блокирует другие потоки.

    При этом нет никаких гарантий насчёт порядка их исполнения. Когда ОС решит переключиться с одного потока на другой - ты не контролируешь. У меня, например, твой первый код тоже выводит "hellohello".

    Так что да, твой код выполняется настолько "одновременно", насколько это возможно.
    Ответ написан
  • Как выполнить действие когда закончилась минута?

    Vindicar
    @Vindicar
    RTFM!
    1. Получить текущее время H:M:S
    2. Сделать задержку 60-S.
    3. Вывести время H:M+1

    Сработает почти всегда (ну, кроме високосной секунды).
    Ответ написан
    Комментировать
  • Логика столкновения kivy python?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, зачем удалять и пересоздавать отдельных птиц, если можно просто "телепортировать" их к другому краю экрана?
    Кроме того, если я верно понял, у тебя delete_birds() отработает сразу, не дожидаясь конца анимации, так как метод start() не выполняет анимацию - он только планирует её постепенное выполнение в ходе дальнейшей работы окна. Используй событие on_complete в твоём объекте Animation.
    Подробности, как всегда, в документации.
    Ответ написан
    1 комментарий
  • Что делать если в python не работает match case?

    Vindicar
    @Vindicar
    RTFM!
    Что делать? Голову включить и подумать.
    Судя по message.from_user.id, message - это какой-то объект. А ты его пытаешься сравнивать со строками. Может, всё же match message.text: или что-то подобное?
    Ответ написан
    Комментировать
  • Как сделать чтобы бот отправил любое сообщение?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию на discord.py, и вопросы отпадут.
    async def command(ctx, param: str) даст первое слово в строке (до пробела, или строку в кавычках).
    async def command(ctx, *params: str) даст каждое слово в строке (разделенной по пробелам, с учётом кавычек) отдельно, в виде кортежа.
    async def command(ctx, *, param: str) даст всё содержимое строки в виде одной строки.
    Ответ написан
    Комментировать
  • Как использовать цикл for в python итерируясь по "динамическому" списку?

    Vindicar
    @Vindicar
    RTFM!
    Похоже, что тебе нужно два потока, связанных Queue. Один поток периодически парсит сайт, и складывает новые данные в queue, а воторой поток использует методы queue чтобы спать, пока не появятся новые данные, извлекать их и обрабатывать.
    Ответ написан
    1 комментарий
  • Как менять вид рабочего стола, панель задач через питон?

    Vindicar
    @Vindicar
    RTFM!
    Разве что менять параметры в реестре через модуль winreg. Гуглинг указывает на ключ
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3
    , но там еще нужно разбираться со структурой данных.
    Ответ написан
  • Python. Создание голосового ассистента. Не могли бы помочь с оптимизацией кода?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, твоя задача меняется с написания голосового помощника под фиксированный набор команд на написание фреймворка для создания голосовых помощников. Это надо иметь ввиду, и проектировать помощника так, чтобы программисту (тебе) было удобнее его дорабатывать.
    Например, возьми за образец Flask или многие либы для создания ботов, которые используют декораторы для регистрации команд. Тогда скрипт превращается в набор функций, реализующих саму логику команд, а фреймворк/библиотека занимаются нижележащими базовыми вещами типа общения с сервером.
    В твоём случае, этими базовыми вещами будут:
    1. Рабочий цикл бота
    2. Обнаружение и распознавание речи пользователя
    3. Определение, обращается ли пользователь к боту.
    4. Опционально, синтез ответа пользователю.
    Таким образом, можно спрятать тонкости распознавания речи от отдельных команд - пусть работают с текстом!
    Вывод: в итоговом боте, помимо базовых вещей, будут отдельные функции-команды. Каждая команда будет помечена декоратором, и с его помощью будут задаваться текстовые строки, на которые она должна реагировать.
    Примерно так:
    @command('привет')  # на какую команду реагировать?
    def hello(message: str) -> typing.Optional[str]:
      # параметр - полная текстовая строка, которую мы приняли
      return "и тебе привет" # возвращаемое значение - None, или строка, которую нужно произнести

    Это позволит легко дополнять функциональность бота, и не строить длинные цепочки if-elif-else. Теперь надо подумать, как это лучше реализовать.
    Так как текстовые строки могут иметь вариации, или переменные части (например, погоду на какой день надо узнать?), то стоит использовать не поиск подстроки, а регулярные выражения. Тогда функция бота будет выглядеть как-то так.
    @command(r'погода\s+город\s+(.+)')  # строка должна начинаться со слов "погода город", а всё что дальше - мы запоминаем.
    def hello(match: re.Match) -> typing.Optional[str]:
      # параметр - результат сопоставления принятой строки с регуляркой
      city = match.group(1)
      weather = get_weather_for(city) # узнаём (как-то) погоду, город выбираем по запомненной строке
      # возвращаемое значение - None, или строка, которую нужно произнести
      return f"Погода в городе {city}: {weather}"

    Это всё хорошо, но как это реализовать? Почитай про декораторы. Если коротко, это просто функции, которые принимают другие функции на вход.
    Пример (упрощённый) реализации декоратора command:
    import re
    # список зарегистрированных через декоратор команд
    registered_commands = []
    
    def command(regexp: str):
      def decorator(command_func):
        global registered_commands
        reg = re.compile(regexp, re.I) # компилируем регулярку, чтобы потом она быстрее работала
        item = reg, command_func
        registered_commands.append(item) # добавляем регулярку и команду в список команд
        return command_func # декоратор должен вернуть функцию, которую обработал
      return decorator # возвращаем декоратор для использования

    По сути, следующие два кода тогда будут эквивалентны:
    @command('команда')
    def some_func(match):
      pass
    # это то же самое что и ниже
    decorator = command('команда') # получили функцию-декоратор
    # объявили декорируемую функцию
    def some_func(match):
      pass
    # применили декоратор к функции
    some_func = decorator(some_func)

    Таким образом, все функции, которые мы отдекорируем через @command, будут автоматически собраны в списке registered_commads. Тогда при обработке очередной команды мы сможем этот список перебрать, и найти нужную. А дальше просто. Делаешь рабочий цикл бота (код абстрактный, но идею должен передать).
    while True:
      voice = record_user_voice() # детектируем и записываем слова пользователя
      text = speech_to_text(voice) # превращаем голос в текст
      if text.startswith('имя бота'): # пользователь должен сказать имя бота, чтобы мы напрасно не реагировали
        text = text[len('имя бота'):].strip() # убираем имя бота из текста
        for regexp, command in registered_commands:
          match = regexp.match(text) # пытаемся сопоставить текст с регуляркой
          if match is not None: # успешно?
            # да
            try:
              response = command(match) # пытаемся выполнить команду
            except Exception as err: # неудачно - сообщаем об ошибке
              print(err)
              response = "Возникла ошибка"
            if response: # если есть что сказать
              say(response) # проговариваем ответ
            break # так или иначе, мы нашли совпадение с командой. Дальше не ищем.
        else: # этот else относится к for ... in registered_commands и сработает если не было break
          say("Я не понял команду") # мы не нашли команду

    Как-то так.
    Ответ написан
  • Как синхронизировать БД sqlite и виджет tkinter ttk.treeview?

    Vindicar
    @Vindicar
    RTFM!
    Питоновский модуль для sqlite этого не умеет, хотя sqlite сама по себе предоставляет update_hook. См stackoverflow.
    Более простое решение - периодически опрашивать сервер, но это может быть напряжно.

    Но с учетом твоего другого вопроса, PostgreSQL реализует синтаксис LISTEN/NOTIFY. Есть модули для питона, которые позволяют этим пользоваться. Периодический опрос всё ещё потребуется, но он будет потреблять куда меньше ресурсов, чем SELECT.
    Ответ написан
    Комментировать
  • Понять понять из-за чего не работает команда мут?

    Vindicar
    @Vindicar
    RTFM!
    Как понять? Голову включить и документацию прочитать.
    @commands.has_any_role('mute' , 908382396112592926 )

    Читаем доки:
    A check() that is added that checks if the member invoking the command has any of the roles specified. This means that if they have one out of the three roles specified, then this check will return True.

    "Если участник, вызвавший команду, имеет любую из указанных ролей". Т.е. этой командой может пользоваться только участник, у которого есть либо роль с названием 'mute', либо роль с id 908382396112592926.

    Далее, смотрим на нижележащую глупость.
    muted_role = discord.utils.get( ctx.message.guild.roles, name = mute )

    Ты в качестве name передал функцию mute. Это по-твоему вообще имеет смысл? Может, всё же имел ввиду name = 'mute'? Но тогда означает, что команду может вызвать только замьюченный пользователь. Я сомневаюсь, что ты этого хотел.
    Ответ написан
  • Как синхронизировать два файла базы данных sqlite в приложении на python?

    Vindicar
    @Vindicar
    RTFM!
    Сделать нормальный сервер БД вместо SQLite. Возьми MariaDB, или Postgre, или что угодно.

    Потому что иначе всё равно придётся разрешать конфликты записей. Например, в таблице X один пользователь добавил запись A с id=10, а другой независимо добавил запись B с id=10. Придётся одну перенумеровывать. А если у них ещё и связанные записи в других таблицах?
    Ответ написан
    Комментировать