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

    Vindicar
    @Vindicar
    RTFM!
    1. Храни таблицу языков вида "ID пользователя - ID языка". Если записи для пользователя в таблице нет, то предлагаешь выбрать, или задаёшь какое-то значение по умолчанию.
    2. Храни все постоянные строки, которые отправляет бот, в некотором хранилище. Хранилище должно иметь вид "ID строки - ID языка - содержимое строки". Соответственно при отправке сообщения узнаёшь ID языка пользователя, с которым идёт обмен, и выбираешь нужную строку по ID строки.
    Ответ написан
    2 комментария
  • Как выполнить действие но только 1 раз?

    Vindicar
    @Vindicar
    RTFM!
    > b1=Button(root, text="22211", command=random.choice(A))
    Вот в этот момент у тебя случано выбирается одна из трёх функций, и назначается на обработку нажатия кнопки.
    Только в этот момент! Потом она так и остаётся.
    Так что если хочешь, чтобы случайный выбор делался при каждом нажатии на кнопку - делай его при каждом нажатии на кнопку, т.е. в обработчике нажатия. А не снаружи. Внезапно, да?

    A=['1', '2', '3']
    
    def clickity():
      index = random.randint(0, len(A)-1)
      item = A.pop(index) #выталкиваем элемент из списка и вставляем его в переменную
      print(item)
    
    b1=Button(root, text="22211", command=clickity)
    b1.pack()
    root.mainloop()
    Ответ написан
  • Как сделать так, чтобы если в списке стоят 3 одинаковых числа под ряд то они удалялись?

    Vindicar
    @Vindicar
    RTFM!
    Циклом. Вот только вопрос, а если после удаления снова будут 3 подряд, тоже удалять?
    Например,
    a = [1, 1, 2, 2, 2, 1]
    Должно дать на выходе a = [1, 1, 1] или a = []?

    Если первое, то что-то такое...
    our_list = [1, 2, 3, 3, 3]
    #идём от конца списка к началу - так удаление повлияет только на уже обработанные элементы списка.
    for i in range(len(our_list) - 3, 0, -1): 
      if our_list[i:i+3] ==  [ our_list[i] ] * 3: #сравниваем фрагмент списка с повтором элемента трижды
        del our_list[i:i+3]
    
    print(our_list)
    Ответ написан
    5 комментариев
  • Как по-человечески найти нужный элемент в списке?

    Vindicar
    @Vindicar
    RTFM!
    Ты хочешь указывать ячейку как в морском бое, а1-в3?
    Тогда работай отдельно по строкам и столбцам, так будет проще.
    field = [
      [' ', ' ', ' '],
      [' ', ' ', ' '],
      [' ', ' ', ' '],
    ]
    #обращение к ячейке будет таким: field[1][1] 
    
    columns = ['1', '2', '3'] #обозначения столбцов
    rows = ['a', 'b', 'c'] #обозначения строк
    
    def cell2index(cell):
      # превращаем строку вида b1 в индексы в списке
      row = rows.index(cell[0].lower()) #если номера строки нет, вылетит исключение ValueError
      col = columns.index(cell[1]) #если номера столбца нет, вылетит исключение ValueError
      return row, col #возвращаем кортеж - пару значений
    
    # пример работы - ход крестиков
    while True: #повторяем, пока пользователь не введет правильный номер
      cell = input('Введите ячейку для хода: ')
      try:
        r, c = cell2index(cell) #если номер неверный, тут вылетит исключение ValueError
        if field[r][c] != ' ': #ячейка уже занята?
          print('Ячейка уже занята!')
        else:
          break #если исключения не было, выходим из цикла
      except ValueError:
        print('Номер ячейки неправильный')
    #сюда попадём только если номер ячейки правильный и она свободна
    field[r][c] = 'x'
    Ответ написан
    2 комментария
  • Найдите все пифагоровы тройки, в которых все числа находятся в диапазоне [1; 5000]?

    Vindicar
    @Vindicar
    RTFM!
    Не пойму почему делаете так. Можно куда проще.
    Можно сгенерировать список квадратов чисел:
    squares = [i*i for i in range(1, 5001)]
    При этом индекс элемента в списке i всегда будет на один меньше, чем число, чей квадрат находится по индексу i.
    Теперь задача переформулируется таким образом: найти все пары чисел из этого списка, сумма которых тоже в этом списке.
    for a,a2 in enumerate(squares, 1):
      for b,b2 in enumerate(squares[a:], a+1):
        if (a2+b2) in squares:
          c = squares.index(a2+b2) + 1
          print(a,b,c)

    Работает не очень быстро, но работает.

    EDIT: можно резко ускорить код, если учесть следующее: нам не обязательно искать сумму во всем списке. Мы знаем, что сумма будет больше чем b^2, т.е. будет иметь индекс больше чем b. Также мы знаем, что a^2 + b^2 < (a+b)^2, т.е. сумма будет иметь индекс меньше чем a+b. Отсюда:

    for a,a2 in enumerate(squares, 1):
      for b,b2 in enumerate(squares[a:], a+1):
        if (a2+b2) in squares[b+1:a+b]:
          c = squares.index(a2+b2) + 1
          print(a,b,c)
    Ответ написан
    Комментировать
  • Как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    async def on_report_button(inter):
    member = inter.author
    self.collticku.update_one({'_id': guild.id}, {'$inc': {'tnum': +1}})
    num = self.collticku.find_one({'_id': guild.id})['tnum']

    Поздравляю, ты попался на замыкании. on_report_button() будет всегда ссылаться на ТЕКУЩЕЕ значение guild - а к моменту вызова on_report_button() это текущее значение уже прошло через весь цикл for guild in self.bot.guilds и остановилось на последней гильдии из списка. От того, что ты создал on_report_button() несколько раз, это не изменится.
    Побороть можно через атрибуты функции. Внутри on_report_button() используй не guild, а on_report_button.guild. А после объявления on_report_button() (т.е. ВНЕ самой функции) присвой on_report_button.guild = guild. Тогда каждая версия on_report_button() будет иметь свою гильдию.
    Это касается ВСЕХ переменных, которые on_report_button() захватывает из вышележащей области видимости. Если они изменяются, то все копии этой функции будут видеть только последнее текущее значение.
    Ответ написан
    Комментировать
  • Как Удалить надпись, Бот заблокировал в чате?

    Vindicar
    @Vindicar
    RTFM!
    Смотришь метод Bot.send_message(), которым ты пользуешься.
    Там и впрямь есть параметр disable_notification, который можно передать.
    Так что просто передаёшь этот параметр по имени, как disable_notification=True.
    Ответ написан
    Комментировать
  • Как сделать добавление эмодзи к Ембеду?

    Vindicar
    @Vindicar
    RTFM!
    await channel.add_reaction('')
    реакцию можно добавлять только к сообщениям, а не к каналам.
    Ответ написан
    Комментировать
  • Почему при использовании первого элемента списка выдает ошибку выхода за грани списка?

    Vindicar
    @Vindicar
    RTFM!
    Потому что user_name содержит пустую строку. А вот почему так, это уже второй вопрос.
    Хотя _clean_all_tag_from_str() это тот еще код... вообще разве в title могут быть вложенные теги?
    Ответ написан
    1 комментарий
  • Как сделать отправку сообщеня которое написаное в команде?

    Vindicar
    @Vindicar
    RTFM!
    Плохо искал.
    Находишь искомый канал по id, у текстового канала есть метод send().
    Ответ написан
    Комментировать
  • Не работает бот, что не так?

    Vindicar
    @Vindicar
    RTFM!
    Подозреваю, что до start_polling() атрибут dp.loop имеет значение None.
    Наверняка бот предоставляет событие, которое срабатывает когда бот стартовал - поищи в доках, и запускай задачу внутри этого события.
    Ответ написан
  • Почему в tkinter не обновляется текст на экране?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не понимаешь, что делаешь.
    btn_ent = Button(frame_btn, text='Ввести', font=100, bd=2, height=5, command=click())

    Ты присваиваешь в качестве обработчика щелчка по кнопке результат вызова функции click(). У неё нет ни одного return, так что она возвращает None.
    Если ты хотел назначить click() как обработчик, то нужно было указать саму функцию, а не результат её вызова.
    command=click


    Далее, сравнение
    txt == 'чтототам'
    некорректно, так как StringVar() и str - разные типы данных, и они не будут равны. Используй
    txt.get() == 'чтототам'
    . Одинокий вызов txt.get() в начале click() бесполезен, так как ты игнорируешь возвращаемое get() значение.

    Собственно, я не вижу где ты инициализируешь переменную txt. У тебя нет ни одного вызова txt.set().

    Ну и до кучи, присваивание TextR перед root.mainloop() ни на что не повлияет, так как она использовалась ранее.
    Если хочешь, чтобы присваивание переменной тут же отражалось в элементах управления, нужно использовать еще один StringVar(), и вызывать его метод .set() для смены значения.
    Ответ написан
    Комментировать
  • Как устранить проблему невыполнения алгоритма?

    Vindicar
    @Vindicar
    RTFM!
    operation=input('Выберите персонажа:')
    if operation == 1:

    input() возвращает только строки. Так что он вернет '1', '2' или '3', а это не то же самое что 1, 2 или 3.
    Ответ написан
  • Что делать, если бот не находит пользователя на сервере?

    Vindicar
    @Vindicar
    RTFM!
    member = main_guild.get_member(member_id)
    AttributeError: 'NoneType' object has no attribute 'get_member'
    Ну чего тут гадать, нет такой гильдии. ID точно не перепутал?
    Кроме того, ты уверен что функция не запускает до того как бот подключился?
    Ответ написан
    Комментировать
  • Проблема со вставкой аргументов в sql запрос python, в чем причина?

    Vindicar
    @Vindicar
    RTFM!
    Ни в коем случае не делайте так
    cur.execute("""INSERT INTO commands (user_id, date, command_name) VALUES (7 , {} , 'd')""".format(time_now))

    Поймаете SQL injection, да и косяков со строками тоже будет немеряно. На один вы уже наткнулись.
    Правильно будет так:
    cur.execute("INSERT INTO commands (user_id, date, command_name) VALUES (7 , ?, 'd')", (time_now,))

    В этом случае передаваемый аргумент будет правильно экранирован, завернут в кавычки и пр.
    Это написано в начале документации по модулю sqlite3, но ведь документацию читают только лузеры. правда же?
    Ответ написан
    1 комментарий
  • Как правильно написать код на пайтон для моей задачи?

    Vindicar
    @Vindicar
    RTFM!
    Почитай официальные примеры, там это есть.
    await bot.api.messages.send(
                peer_id=event.object.user_id, message="Спасибо за подписку!", random_id=0
            )

    Можно предположить, что peer_id - это id пользователя, которому нужно отправить сообщение.
    Ответ написан
  • Как перевести число в двочиную систему состоящую из 2 и 5?

    Vindicar
    @Vindicar
    RTFM!
    Перевод числа в строку с записью двоичной системе - это bin(). Единственное, первые два символа префикса 0b оторвать. Для более удобной замены нескольких символов за один раз лучше использовать .translate(). В итоге получаем:
    table = {ord('0'):'2',ord('1'):'5'}
    print(bin(N)[2:].translate(table))
    Ответ написан
  • Discord.py иерархия как сделать?

    Vindicar
    @Vindicar
    RTFM!
    Пишешь список ролей от наиболее авторитетных до наименее авторитетных.
    При выполнении команды кика/мьюта сравниваешь наиболее авторитетную роль отправителя с наиболее авторитетной ролью цели. Авторитетность тут меряется как индекс в списке ролей - чем меньше, тем лучше.
    Ну а дальше, выполняешь команду только если отправитель более авторитетен чем цель.
    Ответ написан
    Комментировать
  • Как открыть другой файл python и там в словарь перезаписать данные?

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

    Vindicar
    @Vindicar
    RTFM!
    cumma = 0
    cumma += searcher(i)

    Вот на кой огурец ты сбрасываешь сумму в 0 на каждой итерации цикла? Конечно 0 + x = x.
    Вынеси cumma = 0 за цикл, инвестор.
    Ответ написан
    1 комментарий