Задать вопрос
Ответы пользователя по тегу Python
  • Как исправить код для решения задачи?

    Vindicar
    @Vindicar
    RTFM!
    Нужно быть осторожным при переборе индексов списка и его одновременном изменении. Если ты удалил элемент - индексы последующих "съедут" влево, к нулю, и при обычном переборе ты пропустишь элемент сразу за удалённым.
    Хорошее решение - перебирать элементы в обратном порядке, тогда "съедут" индексы уже обработанных элементов.
    for i in range(len(l)-1, -1, -1):
      if l[i] % 2 == 0:
        l[i] = l[i] / 2
      else:
        del l[i]
    Ответ написан
    3 комментария
  • Как максимально эффективно вычислить индекс элемента во вложенной структуре?

    Vindicar
    @Vindicar
    RTFM!
    Если структуру данных строишь один раз, а потом ваыполняешь к ней ряд таких запросов, может иметь смысл пройтись по всей структуре циклом и построить словарь следующего вида.
    Ключ: кортеж (id_родителя, id_элемента)
    Значение: данные элемента

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

    Vindicar
    @Vindicar
    RTFM!
    Если чуть-чуть модифицировать пример, увидим доступные голоса и их id.
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    for voice in voices:
        print('Now speaking:', voice.id)
        engine.setProperty('voice', voice.id)
        engine.say('The quick brown fox jumped over the lazy dog.')
    engine.runAndWait()

    Движок цепляет голоса из настроек TTS в Windows, так что дополнительные голоса нужно ставить там.
    Ответ написан
    Комментировать
  • Как сделать голосовой ответ в голосовом помощнике на python?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, python text to speech.
    Ответ написан
    Комментировать
  • Как отправлять по очереди данные заказа по команде "Дальше" из БД Sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Ответ очевиден. Тебе нужно для пользователя хранить, на какой позиции он остановился, и продолжать оттуда.
    Простой способ - использовать модификаторы OFFSET и LIMIT в SQL запросе. Тогда достаточно будет хранить просто число, которое будет использоваться в OFFSET. При начальном запросе это число ставить в 0, а по нажатию дальше - увеличивать на значение LIMIT.

    Технически это можно оформить таблицей БД с парами "id пользователя - число".
    Ответ написан
    1 комментарий
  • Почему присылает профиля всех хотя указанно where user_id?

    Vindicar
    @Vindicar
    RTFM!
    1. Потому что условие "WHERE {user_id}" будет истинным для любых ненулевых user_id. Тебе нужно условие WHERE id = {user_id} (предполагая, что колонка с id пользователя называется id).
    2. С поправкой на то, что это тебе на самом деле не нужно. НИКОГДА не создавай запросы через подстановку значения в строку, слишком легко ошибиться или поймать sql-инъекцию. Перепиши запрос на использование prepared statements.
    cursor.execute("SELECT money, biz, profitbiz, profitkaz, losemoneykaz, moneykaz FROM users WHERE id = ?", (user_id, ))
    Вместо каждого ? в запросе будет подставлен элемент из кортежа параметров. При этом движок сам позаботится о правильном экранировании.
    3. Переподключаться к БД каждый раз при вызове команды - плохая идея. Создай подключение при запуске бота и используй его. Максимум - создавай новый cursor для вызова команды.
    Ответ написан
    1 комментарий
  • Как сделать, чтобы телеграм-бот отвечал уже вычисленным числом?

    Vindicar
    @Vindicar
    RTFM!
    1. Поставь обработчик "входящее сообщение".
    2. Прогони текст сообщения через float(), а для надёжности можно попробовать использовать locale.atof() - оно понимает региональное форматирование. Например, в США сумма "5,000.00" а у нас "5 000,00", причем и там и там могут написать просто "5000". Выцепить все варианты будет непросто, но atof() для начала сойдёт.
    3. Рассчитай проценты.
    4. Ответь на сообщение рассчитанной суммой процентов.

    Вот и всё. Если хочешь код - изволь предоставить то, что написал сам (и оформить кнопкой </>).
    Ответ написан
    5 комментариев
  • Как переключать язык через radibutton?

    Vindicar
    @Vindicar
    RTFM!
    Не получается по вполне очевидной причине.
    Как следует из названия, root.mainloop() входит в бесконечный цикл, и крутится там, пока окно не будет закрыто. Это считается завершением программы, и только тогда mainloop() возвращает управление.

    А нажатие кнопки у тебя тоже реализовано через бесконечный цикл. Разумеется, работать может только один из них.
    Я бы посоветовал почитать повнимательнее доки на keyboard, и выкинуть цикл while True и вызов keyboard.wait().
    Вместо этого, либо попробуй добавить обработчик через keyboard.add_hotkey(), либо попробуй запланировать вызов своей функции через root.after().
    Внутри этой функции используй keyboard.is_pressed(), чтобы узнать, нажата ли клавиша. Тут будет ещё пачка подводных камней - нужно будет повторно запланировать вызов этой же функции, нужно будет игнорировать нажатие клавиш, если перевод уже сделали (чтобы пока держишь клавиши, комп не переводил непрерывно), и т.п.
    Первый способ проще, но нужно проверить, сработает ли.
    Ответ написан
    1 комментарий
  • Как через код получить текст с консоли и вписать текст, который считывает консоль?

    Vindicar
    @Vindicar
    RTFM!
    Запустить в дочернем процессе, перехватить его стандартный ввод/вывод?
    Если же нужно внутри своего процесса, можно временно заменить sys.stdin на что-нибудь типа io.BytesIO или io.StringIO, заполненный заранее заготовленными данными. Если нужно перехватить stdout, то в модуле contextlib есть такая возможность.
    Ответ написан
    Комментировать
  • Как в существующий файл дописать текст в python?

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

    Проще сделать иначе: создать новый файл рядом со старым, прочитать построчно старый, записать изменённые строки в новый. А потом удалить старый и переименовать новый в старый.

    Насчёт последней части посмотри модуль os, в частности, os.unlink() и os.rename().
    Ответ написан
    Комментировать
  • Как определить атрибуты файла — не магические методы?

    Vindicar
    @Vindicar
    RTFM!
    vars(file), потом отсеять все ключи. начинающиеся с __.
    Но метод так себе, в этом файле можно любой код выполнить.
    Ответ написан
    Комментировать
  • Как использовать переменную из другого файла?

    Vindicar
    @Vindicar
    RTFM!
    Простейший способ - передать словарь в конструктор.
    class voice(commands.Cog):
        #при создании кога передаёшь ему клиента и tdict
        def __init__(self, client, t_dict):
            self.client = client
            self.tdict = t_dict
    
        @commands.Cog.listener()
        async def on_voice_state_update(self, member, before, after):
            print(self.tdict)

    Имей ввиду, в случае с ссылочными объектами, т.е. словарями, списками и т.п., изменения объекта внутри кога изменит его глобально. А вот объекты-значения (числа, строки, кортежи) так изменить не получится.
    Ответ написан
  • Selenium как сохранить картинку в объект?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не понимаешь, что делает from_bytes().
    Creates a copy of an image memory from pixel data in a buffer.
    In its simplest form, this function takes three arguments (mode, size, and unpacked pixel data).

    Оно требует массив значений пикселей, а не содержимое в файле графического формата.
    Используй Image.open(). К слову, open() принимает на вход не только путь к файлу, но и файлоподобный объект. Это открывает две возможности:
    1. Использовать класс io.BytesIO, чтобы хранить данные в памяти вместо временного файла.
    2. Скормить PIL ответ сервера, используя .raw вместо .content.
    Второй вариант предпочтительнее, так как не требует кэшировать в памяти всю картинку, но нужно проверить его работоспособность.
    Ответ написан
    4 комментария
  • Ошибка sqlite3.OperationalError: no such column: cash, как решить?

    Vindicar
    @Vindicar
    RTFM!
    А таблица уже существует в БД? Выведи-ка результат запроса к твоей БД:
    SELECT sql FROM sqlite_master WHERE name = 'users';
    Ответ написан
  • Как для тг бота сделать одновременно слушатель сообщений и выполнение чего-то в цикле?

    Vindicar
    @Vindicar
    RTFM!
    Советую почитать про основы работы асинхронных программ.

    Но если на пальцах, считай, что из bot.polling() программа не выйдет до своего завершения. Она там будет крутиться, ждать события, и дёргать обработчики.

    Поэтому всё, что ты хочешь научить бота делать, нужно делать
    • ИЛИ в рамках фреймворка (какого кстати? pyTelegramBotAPI? Он это не умеет)
    • ИЛИ в рамках отдельного потока, который запускать до вызова bot.polling()
    • ИЛИ вообще в рамках отдельного скрипта, который вызывать по крону.

    Если в рамках потока, нужно будет посмотреть, позволяет ли телебот вызывать методы из другого потока.
    Ответ написан
    2 комментария
  • Как сделать админ-панель бота для Discord?

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужна админ-панель в виде именно сайта - учи Flask, он не очень сложный.
    Грубо говоря, на входящий запрос - питоновская функция обработчик. Почти как в ботах.
    А вот чтобы сайт отправлял нужные запросы, когда открыт в браузере, нужно и HTML понимать. А если хочется красивостей, то и JS.
    Ответ написан
    Комментировать
  • Как написать функци для перевода в код Morse не используя списки, кортежи, словари?

    Vindicar
    @Vindicar
    RTFM!
    Длинная цепочка if-else?
    Ответ написан
    Комментировать
  • Каким образом можно собрать статистику доменов в файле?

    Vindicar
    @Vindicar
    RTFM!
    1. Модуль re
    2. collections.Counter
    Ответ написан
    Комментировать
  • В чём ошибка бота discord?

    Vindicar
    @Vindicar
    RTFM!
    > 'NoneType' object is not subscriptable
    > .fetchone()[0]
    Запрос не вернул ни одной строки, а ты этого не проверяешь.
    И да:
    1. Создание запроса с помощью .format() - говно, и путь к SQL-инъекции (ну или просто багам). Учись как пользоваться плейсхолдерами.
    2. Вставка вызова метода внутрь шаблона форматирования - говно, так как нечитаемо. Да и возвращённое значение не проверишь, как ты только что убедился.
    Вызови метод сначала, закинь результат в переменную, а потом уже её подставляй.
    Ответ написан
    2 комментария
  • Таймер на действие в Python, как сделать?

    Vindicar
    @Vindicar
    RTFM!
    Можно использовать window.after(). Это гарантирует вызов указанной тобой функции примерно через заданное количество миллисекунд. Внутри функции проверяешь, нужен ли ещё один вызов, и если нужен - планируешь его повторным вызовом after().
    Ответ написан
    Комментировать