• Как копировать canvas текст python?

    @o5a
    from tkinter import *
    
    def onObjectClick(event):
        obj_id = event.widget.find_withtag('current')[0]
        copy_text = event.widget.itemcget(obj_id, 'text')
        root.clipboard_clear()
        root.clipboard_append(copy_text)
    
    root = Tk()
    
    canv = Canvas(root, width=100, height=100)
    obj1 = canv.create_text(50, 30, text='Click me')
    canv.tag_bind(obj1, '<Button-1>', onObjectClick)
    canv.pack()
    
    root.mainloop()

    Альтернативно для копирования можно использовать pyperclip
    Ответ написан
    1 комментарий
  • Ошибка погодного телеграм бота "Город не найден"?

    @o5a
    В новых версиях библиотеки owm нужно использовать manager для работы, и уже через него запрашивать данные
    owm = pyowm.OWM(OWM_KEY, {'language': 'ru'})
    mgr = owm.weather_manager()
    observation = mgr.weather_at_place(location)
    Ответ написан
    4 комментария
  • Почему у меня переменная pe не изменяеться а записываеть только первый id пользователя?

    @o5a
    SQL запрос без явной сортировки, вроде этого 'SELECT * FROM users_id', не гарантирует упорядоченность результатов (user_id 1 может идти не первым), так что пытаться по нему определять какие-то упорядоченные id неправильно. Да и в целом не особо понятно без пояснений, что предполагалось сделать всеми этими манипуляциями наподобие
    peremenna_user_id = peremenna_user_id + str(pe[1])

    Если цель - выбрать пользователя по id, то нужно не городить перебор всех значений, а использовать синтаксис SQL, примерно так
    cursor.execute('SELECT * FROM users_id WHERE user_id = ?', (user_id, ))

    Если такого user_id нет в базе пользователей, то cursor.fetchone() вернет None.

    У Вас в целом совершенно неправильный подход к использованию SQL базы данных. Почитайте хотя бы основы SQL. Не должно быть никаких отдельных таблиц под каждого пользователя. Таблицы создаются под сущности (например, пользователь, склад, продукт), id пользователя прописываются в полях.
    Ответ написан
  • Как из текста пользователя в телеграмм сделать переменную?

    @o5a
    Судя по логике, хотите иметь возможность получить запрашиваемый после "Введите текст" текст?
    Тогда нужно использовать register_next_step_handler. В нем прописывается следующая функция, которая принимает уже ввод текста.

    bot.send_message(message.chat.id, 'Введите текст')
    bot.register_next_step_handler(message, get_text)
    
    def get_text(message):
        message.text будет как раз запрашиваемый текст
    Ответ написан
    Комментировать
  • Как сделать так чтобы пользователь вводил город в котором нужно найти погоду?

    @o5a
    По-простому можно запрашивать ввод команды с параметром - местом для погоды, забирая его из строки, например так

    @bot.message_handler(commands=['weather'])
    def start(message):
        if ' ' in message.text:
            place = message.text.split(maxsplit=1)[1]
            # работаем с нашим place
        else:
            bot.send_message(message.chat.id, 'Укажите город')


    Если нужна логика с последующим вводом города после запроса параметра, то смотрите на работу register_next_step_handler
    Ответ написан
  • Как изменить значение ключа?

    @o5a
    Если это не одноразовая задача, можно написать какую-нибудь универсальную функцию обновления таких цен независимо от формата словаря, просто пробегать и изменять все цифровые значения в цикле, например так

    from operator import add, mul
    
    # val - изменяющее значение, oper - выбор операции добавления или умножения
    def update_prices(shop, val=1, oper=add):
        for k, v in shop.items():
            if type(v) in (int, float):
                shop[k] = oper(v, val)
            else:
                update_prices(v, val, oper)
    
    shop = {'Молочное':{'молоко': 100, 'кефир': 60, 'йогурт':40},'Овощи':{'картошка':50, "морковь":55, 'свекла':65}}
    
    update_prices(shop)
    # {'Молочное': {'молоко': 101, 'кефир': 61, 'йогурт': 41}, 'Овощи': {'картошка': 51, 'морковь': 56, 'свекла': 66}}
    
    update_prices(shop, 10)
    # {'Молочное': {'молоко': 111, 'кефир': 71, 'йогурт': 51}, 'Овощи': {'картошка': 61, 'морковь': 66, 'свекла': 76}}
    
    update_prices(shop, 10, mul)
    # {'Молочное': {'молоко': 1110, 'кефир': 710, 'йогурт': 510}, 'Овощи': {'картошка': 610, 'морковь': 660, 'свекла': 760}}
    Ответ написан
    Комментировать
  • Как полученные данные из файла предоставить в виде списка?

    @o5a
    У Вас второй кусок кода повторяет первый, не знаю, что хотели сделать.
    Если цель - разбить на строки и каждую строку на элементы, то можно так
    s = '''x1, z1, y1
    x2, z2, y2'''
    data = [row.split(', ') for row in s.splitlines()]
    print(data)
    # [['x1', 'z1', 'y1'], ['x2', 'z2', 'y2']]
    Ответ написан
    Комментировать
  • Ошибка когда написал код в python, что делать?

    @o5a
    Перед использованием mgr нужно его создать
    mgr = owm.weather_manager()
    observation = mgr.weather_at_place(place)
    Ответ написан
    Комментировать
  • Строки и символы. Как решить задачу эту задачу?

    @o5a
    Последняя буква не выводится потому, что во втором блоке (когда символ не совпадает) нет вывода для конца строки (if y < a ... else) как для первого случая. В результате если последний символ отличается от предпоследнего, ничего и не происходит.

    Я бы лучше предложил вариант попроще: завести один счетчик (длины последовательности) и собственно переменную для символа. Напишу алгоритм, возможно будет интереснее написать самому.

    # инициализируем 2 переменные, текущий символ (ключ), который группируем, и его счетчик
    key = line[0]
    cnt = 0
    # в цикле проходим все символы строки
    for x in line:
         # если текущий символ совпадает с ключом, увеличиваем счетчик
    
         # в противном случае (последовательность закончилась) печатаем наш ключ и счетчик (или вместо печати все заносим в список для вывода в самом конце)
         # также после этого устанавливаем значение ключа на текущий символ (key=x) и сбрасываем счетчик на 1
    # после окончания цикла еще раз выводим текущие значения ключа и счетчика (это понадобится для случая, когда последней идет последовательность символов)


    Еще для данной задачи хорошо подходит функция itertools.groupby. Она группирует одинаковые последовательности, т.е. из 'aaaabbсaa' сформирует отдельные группы по 4 'a', 2 'b', 1 'c', 2 'a'. Так что это можно использовать для решения задачи:

    from itertools import groupby
    
    line = 'aaaabbcaa'
    groups = [f"{k}{len(list(g))}" for k, g in groupby(line)]
    print(''.join(groups))
    # a4b2c1a2
    Ответ написан
    Комментировать
  • Как укоротить код?

    @o5a
    Так например. Половинная длина + 1, если и начало и конец четные. Т.к. олимпиадная, то сразу код наверное не буду приводить.
    int((r-l)/2+0.5) + "1, если и начало и конец четные"
    Ответ написан
    Комментировать
  • Как сделать проверку на схожесть элементов списка?

    @o5a
    Использовать множества (set). В множестве все элементы уникальны.
    mylist = [1,2,1,3,2,4]
    myset = set(mylist)
    print(myset)
    # {1,2,3,4}


    Таким образом, чтобы проверить, есть ли повторы, нужно сравнить длину изначального списка и множества от этого списка.

    И для создания изначально уникальных чисел можно сразу использовать random.sample. Он из указанной последовательности выберет N уже уникальных значений.
    mylist = random.sample(range(1, 40001), 47)
    Ответ написан
    3 комментария
  • Как выводить нужный текст, имея значение из БД?

    @o5a
    Правильно будет сразу запросить в базе запись по нужному пользователю (название поля свое)
    cursor.execute('SELECT grup FROM Users WHERE user_id = ?', (message.from_user.id, ))
    row = cursor.fetchone()
    if row:
        grup = row[0]
        # в grup будет значение поля из таблицы по данному пользователю
    else:
        # пользователь не найден в базе
    Ответ написан
    Комментировать
  • Как решить проблему с выводом в sqlite3?

    @o5a
    Судя по всему поле в таблице было создано как DATE, а не TIMESTAMP, поэтому при выгрузке оно пытается преобразовать к типу DATE без времени.

    Можно или использовать правильный тип поля изначально, или явно указать тип в запросе
    select time_to_next_pay as "time_to_next_pay [timestamp]" from vip_users
    Ответ написан
    Комментировать
  • Как правильно пользоваться индексами pandas?

    @o5a
    Считаем сумму в группировке по найденной колонке с максимальным значением из трех, и от результата берем idxmax. Примерно так
    df.groupby(df.iloc[:,2:5].idxmax(axis=1)).sum()['electors'].idxmax()
    Ответ написан
    4 комментария
  • Как в Pandas преобразовать IP в CIDR?

    @o5a
    Так у Вас там нет никакой замены, в строке замены снова указан шаблон поиска. Должно быть например так
    df.replace({'ip': r'([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)[0-9]{1,3}'}, {'ip': r'\1\2\g<3>0/24'}, regex=True)
    Ответ написан
    1 комментарий
  • Как отправлять список TelegramBotApi?

    @o5a
    a = ['valera', 'sasha' ]
    print(", ".join(a))
    # valera, sasha
    Ответ написан
    Комментировать
  • Почему вместо изображений черный экран в pygame?

    @o5a
    Отрисовка drawWindow() должна происходить внутри основного цикла игры (т.е. поправьте отступ).
    Ответ написан
  • Можно ли сократить код?

    @o5a
    Не до конца понятна необходимость таких манипуляций. Если это для того, чтобы как-бы 1 раз пройти по VALUES, то по факту это же просто переставляет местами 2 перебора.
    перебор по VALUES:
        перебор по всем параметрам:

    вместо
    перебор по по всем параметрам:
        перебор VALUES:


    Насколько я вижу, эта функция просто высчитывает некий порог срабатывания для каждого параметра. Тогда эти функции можно переписать так:
    def threshold (values, x):
        for i, val in enumerate(values, 1):
            if val > x:
                return i
        return None
    
    def My_Code(a,b,c):
    
        #VALUE - any data to calculation
        VALUES = list(range(100))
    
        Count_a = [threshold(VALUES, x) for x in a]
        Count_b = [threshold(VALUES, x) for x in b]
        Count_c = [threshold(VALUES, x) for x in c]
    
        return Count_a,Count_b,Count_c
    
    if __name__=='__main__':
    
        #input data
        a=[1,2,3,4,5]
        b=[2,4,8,10,12]
        c=[7,6,5,4,3]
        #d=...
        #e=...
        #...
    
        Count_a,Count_b,Count_c = My_Code(a,b,c)
        #result
        print(Count_a,Count_b,Count_c)
    
    # [3, 4, 5, 6, 7] [4, 6, 10, 12, 14] [9, 8, 7, 6, 5]

    Не стал менять структуру возвращаемого Counter_a, ..., но вообще это тоже можно объединить во вложенный список, чтобы не было этих отдельных a, b, c, Counter_a, Counter_b, Counter_c, но это уже как удобнее.

    В целом если нужно повысить производительность, то лучше посмотреть в сторону numpy, тем более тут чисто работа с массивами чисел.
    Ответ написан
  • Почему окно pygame не отвечает?

    @o5a
    Так не нужно включать консольный ввод input() в цикл работы pygame, у Вас окно "зависает" потому что постоянно ждет ввод в консоль. Никаких input быть не должно.

    Заодно, если рисуете квадрат, стоит добавить очистку экрана перед pygame.draw..., чтобы за ним не тащился "след".
    win.fill((0,0,0))
    Ответ написан
    1 комментарий