Ответы пользователя по тегу Python
  • Python sqlite как обновить запись в базе?

    Vindicar
    @Vindicar
    RTFM!
    Убери кавычки вокруг последнего "?". В текущем варианте ты обновляешь баланс пользователя с именем "?", т.е. подстановка из переменной не происходит.
    И да, как посоветовали выше - проверь, что у тебя в переменных money и user перед запросом.
    print('Money:', repr(money))
    print('User:', repr(user))
    repr() выведет строку как строковую константу в питоне, т.е. можно будет увидеть обычно невидимые символы, которые могут присутствовать. Например, пробелы в конце строки.
    Ответ написан
    Комментировать
  • Почему проблема в сортировке?

    Vindicar
    @Vindicar
    RTFM!
    Код феерический. Два запроса вместо одного, выбор всех строк ради сортировки на клиенте, NULL там, где его быть не должно, и так далее.

    Всё это прекрасно делается на уровне запроса к базе!
    SELECT fname, balance FROM users WHERE balance IS NOT NULL ORDER BY balance DESC LIMIT 5

    Выберет имя и баланс пользователей, у которых баланс не NULL (sql-евский NULL превращается в питоновский None, с которым ты и столкнулся при сортировке). Это, к слову, твоя вина, нужно было указать NOT NULL и значение по умолчанию для поля balance при создании таблицы.
    Результат сортируется по полю balance по убыванию, и выбираются не более первых 5 строк (может быть менее).
    Каждая строка результата будет кортежем, где нулевой элемент - имя игрока, а первый - баланс.

    top5 = cur.execute('SELECT fname, balance FROM users WHERE balance IS NOT NULL ORDER BY balance DESC LIMIT 5').fetchall()
    table = []
    for num, (fname, x) in enumerate(top5, 1):
        table.append(f'{num} • {fname} - <b><i>{x}</i></b> монеток.\n' )
    await message.reply('Топ 5 богачей бота.\n\n'+''.join(table))


    Подучи SQL, сильно упростишь себе жизнь при составлении запросов.
    Ответ написан
    Комментировать
  • Как перехватить STDOUT gunicorn`а?

    Vindicar
    @Vindicar
    RTFM!
    А ты уверен, что речь про stdout? Посмотри в p.stderr.
    Ответ написан
  • Как решить задачу, используя одну формулу и не успользуя if, else, elif?

    Vindicar
    @Vindicar
    RTFM!
    Ну вместо if можно использовать список функций (лямбд или обычных).
    x = 1
    [
      lambda: print('x < 0!'), #False = 0
      lambda: print('x > 0!'), #True = 1
    ][x > 0]()

    Дальше просто построить из таких блоков дерево решений методом дихотомии.
    Ответ написан
    Комментировать
  • Как уменьшить диапазон цветов на фото python?

    Vindicar
    @Vindicar
    RTFM!
    Насчёт уменьшения количества цветов могу подсказать одну идею.
    Собираешь коллекцию всех цветов на изображении. Это будет своего рода облако точек в пространстве координат R-G-B. Можешь либо брать все пиксели, либо только уникальные цвета - посмотри, что будет лучше работать.
    Потом применяешь метод k-средних, чтобы это облако разбить на желаемое число кластеров. Реализации метода k-средних можно найти в пакете opencv-python (он же cv2), вместе с механикой загрузки растровых изображений.
    У тебя получится набор из 24 точек - центров кластеров. Это и будут итоговые цвета, только округли их R-G-B координаты до ближайшего целого.
    Затем для каждого пикселя изображения находишь центр кластера, ближайшего к его цвету. Это будет цвет, которым надо будет перекрасить пиксель.

    Мне скорее интересно, как ты собираешься растровое изображение превратить в векторное - это ведь нетривиальная штука.
    Ответ написан
  • Как преобразовать длинный float в строку?

    Vindicar
    @Vindicar
    RTFM!
    print(f'Число: {res:.6f}')
    Выведет тебе число с 6 знаками после запятой.
    Ответ написан
    Комментировать
  • Через что можно взаимодействовать с Дискордом?

    Vindicar
    @Vindicar
    RTFM!
    А чем бот на discord.py не устраивает?
    Если не работать из-под клиентской учётки, то риска бана быть не должно.
    Ну а если готовы рискнуть, библиотека вроде позволяет работать как клиент, а не как бот.
    Ответ написан
  • Как организовать список в одну строку в Питоне?

    Vindicar
    @Vindicar
    RTFM!
    new_list = sum( (item if isinstance(item, list) else [item] for item in a_list) , [])

    По сути, мы каждый элемент a_list превращаем в список, если он не был списком.
    А потом суммируем все эти списки (это будет операция конкатенации).
    Честно говоря, простой цикл for был бы читаемее (и быстрее, я думаю):
    new_list = []
    for item in a_list:
      if isinstance(item, list):
        new_list.extend(item)
      else:
        new_list.append(item)


    Но будет работать только для одного уровня вложенности. Если нужно больше, используй рекурсию или что-то подобное.
    Ответ написан
    4 комментария
  • Как сделать смещение точек?

    Vindicar
    @Vindicar
    RTFM!
    Если ты хочешь сделать "взрыв", т.е. разлёт звёзд из центра, то тебе нужно будет с умом представить сведения о звёздах. Сейчас ты их не хранишь вообще, поэтому у тебя каждый раз звёзды рисуются по разному.
    Что нужно знать для разлёта?
    1. Координаты центра, откуда идёт разлёт. Я полагаю, это будет
    center = (0, 0)
    Надеюсь, ты знаешь что такое кортеж.
    2. Для каждой звезды нужно знать число её лучей. Также для каждой звезды нужно определить шаг по x и по y. Например, так.
    dx = rnd.randint(-5, 5)
    dy = rnd.randint(-5, 5)
    n_beam = rnd.choice([5,7,9,11,13,15,17])
    size = rnd.randint(5, 20)
    star = (dx, dy, n_beam, size)
    У тебя будет список из множества таких кортежей star.
    4. Мы должны знать, сколько шагов мы сделали с момента начала анимации.
    step_count = 0
    Поначалу 0, потом будет увеличивать.

    Сначала генерируешь звёзды.
    center = (0, 0)
    N = 1000
    stars = []
    for i in range(N):
        dx = rnd.randint(-5, 5) #на сколько пикселей по горизонтали сдвинется звезда за шаг
        dy = rnd.randint(-5, 5) #на сколько пикселей по вертикали сдвинется звезда за шаг
        n_beam = rnd.choice([5,7,9,11,13,15,17]) #сколько лучей у звезды
        size = rnd.randint(5, 20) #размер звезды
        star = (dx, dy, n_beam, size) #описание звезды
        stars.append(star) #добавляем звезду в массив звёзд


    Потом делашеь цикл анимации:
    for step in range(100): #сколько кадров анимации сделать
        turtle.clear() #тут нужно очистить экран
        for star in stars: #перебираем звезды
            # определяем координаты центра звезды на этом шаге
            pos_x = center[0] + step * star[0]
            pos_y = center[1] + step * star[1]
            # позиционируем черепашку
            main.up()
            main.setposition(x + 5,y + 5)
            main.down()
            # рисуем звезду
            starFILL(star[1], star[2])
        time.sleep(1.0)


    Как-то так. Более аккуратно было бы использовать не кортежи, а классы. Если интересно, отпишись в комментах, объясню.
    Ответ написан
  • Как исправить код для решения задачи?

    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), потом отсеять все ключи. начинающиеся с __.
    Но метод так себе, в этом файле можно любой код выполнить.
    Ответ написан
    Комментировать