• Как сделать так, чтобы внутри одного виджета выполнялись разные действия?

    Vindicar
    @Vindicar
    RTFM!
    > кнопка брала директорию из первой кнопки
    И вот тут-то и косяк. Не из "первой кнопки", а из специально созданного (в __init__() разумеется) поля класса Convert_App. А записывать данные в это поле должен обработчик нажатия первой кнопки.
    Это азы питоновского ООП, освойте их и таких вопросов возникать не будет.
    Ответ написан
    Комментировать
  • Как сделать отправку сообщеня которое написаное в команде?

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

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

    Vindicar
    @Vindicar
    RTFM!
    «Признак Хаара» это прямоугольный фильтр, разделенный на две области – светлую и темную. Данный фильтр накладывается на некоторую область изображения (окно). Значением (откликом) признака является сумма яркостей пикселей изображения в светлой области минус сумма яркостей пикселей в темной области. Если эта разность превышает некоторый порог, то мы считаем, что данный фильтр дал отклик в данном месте изображения.
    Это примитивный признак-классификатор. При обучении классификатора Хаара с помощью алгоритма бустинга набор таких примитивных классификаторов складывается в один составной классификатор. Но такой классификатор либо работает долго, либо даёт много ложных срабатываний. Даже шанс в 0,01% - это много, учитывая сколько возможнных окон (возможных позиций лица) может быть на изображении.
    Поэтому использует принцип "каскада внимания". Формируется цепочка из нескольких составных классификаторов таким образом, чтобы каждый последующий отсеивал как можно больше отрицательных примеров, но при этом пропускал все или почти все положительные (уровень обнаружения >95%). Это позволяет ограничиться вычислением сравнительно быстрых и простых составных классификаторов для подавляющего большинства окон на изображении.

    Под конец несколько близлежащих окон могут быть слиты в одно с помощью non-maximum suppression. Это нужно, так как лицо может попасть сразу в несколько соседних окон, чуть смещённых относительно друг друга.
    Если в итоге у нас есть отклики, то мы знаем позиции и размеры возможных лиц на изображении. А дальше уже эвристика на основании этих сведений. Например, если нам нужен крупный план, то мы можем отвергнуть изображение, если наибольшее лицо занимает менее 75% площади изображения.
    Ответ написан
  • Почему в 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() для смены значения.
    Ответ написан
    Комментировать
  • Поднятие домашнего облака nextcloud. Опыт использования. На apache или nginx?

    Vindicar
    @Vindicar
    RTFM!
    Я на одного пользователя поднял вообще на lighttpd, работает.
    Но по апачу наверняка больше рекомендаций в сети.
    Ответ написан
    Комментировать
  • Как скрыть или запретить доступ к системе на другом диске?

    Vindicar
    @Vindicar
    RTFM!
    Можно отмонтировать этот раздел напрочь.
    Если он прописан в /etc/fstab, добавь в соответстующую строку параметр noauto или вообще закомментируй её.
    Если он там не прописан, его может подмонтировать udev, тогда надо ковыряться в /etc/udev/rules.d
    Ответ написан
    2 комментария
  • Как устранить проблему невыполнения алгоритма?

    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!
    1. Определяешь формат файла конфигурации. Вариантов много:
    • простой ini-файл (модуль configparser) - удобен, если нужны мало-объемные данные, и не более двух уровней иерархии (т.е. группа-ключ со значением).
    • xml-файл (модуль xml) - громоздкий, но зато поддерживает много уровней вложенности и есть средства проверки корректности
    • json-файл (модуль json) - куда проще в плане синтаксиса, на выходе получаешь комбинацию из словарей и списков питона. Я бы посоветовал его.
    • Можно даже СУБД (типа sqlite3) прикрутить, при желании. Но это оправдано очень не всегда.

    2. Выбираешь место хранения конфига.
    • В папке программы? Будет одна конфигурация для всех пользователей на ПК. Не факт, что у тебя будут права на запись в эту папку. Зато легко копировать программу на другой комп.
    • В папке APPDATA пользователя? Далеко, пользователь вряд ли залезет, зато у разных пользователей на одном компе будут свои настройки. Сложнее перенести программу на другой комп - нужно будет еще найти и скопировать папку настроек. (Сложнее не в плане защиты от копирования, а в плане удобства распространения.)
    • В папке Мои документы пользователя? Не факт что это хорошая идея, но плюсы примерно те же что и выше.
    • Возможна комбинация предыдущих. Например, я делаю так: если в папке с исполняемым скриптом лежит файл с именем "portable", ищу конфиг тут же. Иначе ищу его в APPDATA.

    3. Определяешь, как будешь получать доступ к конфигу внутри программы. Например, отдельный модуль, который будут импортировать все части программы. Модуль содержит класс-синглтон, который содержит значения конфига в форме, удобной для остальной программы. Также этот класс может содержать значения конфигурации по умолчанию. Программа при старте ищет и загружает конфиг в экземпляр этого класса, при работе обращается к этому классу, чтобы получить или задать параметры, а при завершении - сохраняет класс обратно в конфиг.
    Ответ написан
    Комментировать
  • Как правильно написать код на пайтон для моей задачи?

    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))
    Ответ написан
  • Как добавить bash в автозагрузку от имени root?

    Vindicar
    @Vindicar
    RTFM!
    Если убунта новая - то сделай из него systemd модуль. Тебе нужен тип one-shot, т.е. который выполняется и завершается, а не работает постоянно. Вот приблизительный пример. Допустим, файл называется foo.service
    [Unit]
    #человекочитаемое описание
    Description=Setup foo
    
    [Service]
    Type=oneshot
    #это путь к скрипту, который будет выполняться разово при запуске сервиса
    ExecStart=/opt/foo/setup-foo.sh
    #если ExecStart отработал, сервис считается активным
    RemainAfterExit=true
    #это путь к скрипту, который будет выполняться разово при остановке сервиса
    ExecStop=/opt/foo/teardown-foo.sh
    StandardOutput=journal
    
    [Install]
    #когда запускать скрипт при загрузке - когда готовы выполняться от имени пользователей, или когда сеть есть, или ещё когда.
    WantedBy=multi-user.target


    Создав файл, не забудь сделать systemctl daemon-reload чтобы systemd подцепил изменения.
    А чтобы срабатывало при загрузке - systemctl enable foo.service. Если назвал файл иначе, поправь последний аргумент.
    Если твои скрипты не отмечены как испоняемые, или не имеют в первой строке #!/bin/bash, то тогда надо изменить строки ExecStart/ExecStop так:
    ExecStart=/bin/bash /opt/foo/setup-foo.sh
    Ответ написан
    Комментировать
  • 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 комментарий
  • Взаимосвязь Python с программами?

    Vindicar
    @Vindicar
    RTFM!
    Под наивным "взаимосвязь" скрывается несколько совершенно различных технологий.
    Пакеты pyautogui и pywinauto занимаются вопросами имитации пользовательского ввода (и вообще взаимодействия с интерфейсом программы).
    Если тебе нужно лезть в чужую память - то тут уже нужно использовать win32 API функции ReadProcessMemory()/WriteProcessMemory(). Модуль ctypes в помощь.
    Если тебе нужно лезть в трафик чужого приложения, есть такая штука как dpkt.

    Фокус в том, что ни один из этих инструментов не тривиален в использовании. Нужно хорошо представлять устройство памяти процесса в windows, устройство оконного интерфейса в windows или устройство сетевых протоколов, в зависимости от задачи. А это дело не одного месяца.
    Ответ написан
    4 комментария
  • Как в Python вывести таблицу как в примере?

    Vindicar
    @Vindicar
    RTFM!
    Вывести в консоль?
    Ну я бы подходил к этому так.
    1. Преобразовать все выводимые данные в строки и разбить их по переносам строки.
    2. Определить наибольшую ширину каждого столбца с учётом переносов строки. Для каждой ячейки вычисляем наибольшую ширину строки, потом ищем максимум по столбцу. Можно добавить 1-2 символа как "поля", если надо.
    3. При выводе строки, выводим строки ячеек вместе, используя itertools.zip_longest(). Т.е. сначала первую строку в каждой ячейке, потом вторую, и т.д. Если получили вместо одной из строк None, значит в этой ячейке строки уже закончились - выводим пробелы.
    Ширину вывода каждой ячейки мы знаем из пункта 2, выровнять значение пробелами - тривиально.

    # -*- coding: utf-8 -*-
    import typing as t
    import itertools
    
    def print_table(headers: t.Dict[str, str], data: t.Iterable[t.Dict[str, str]]) -> None:
        keys: t.List[str] = list(headers.keys()) #список ключей в таблице - чтобы сохранять порядок столбцов
        split_data: t.List[t.Dict[str, t.List[str]]] = [] #ячейки, разбитые на строки
        max_widths: t.Dict[str, int] = { key:len(value) for key,value in headers.items() } #ширина каждого столбца в таблице
        for line in data:
            #разбиваем ячейки строки на текстовые строки по \n
            split_line: t.Dict[str, t.List[str]] = { key:value.splitlines() for key,value in line.items() }
            #обновляем ширину столбцов, если надо
            for key in keys:
                new_width = max(map(len, split_line.get(key, [''])))
                if new_width > max_widths[key]:
                    max_widths[key] = new_width
            split_data.append(split_line)
        #выводим заголовки
        for key in keys:
            print(f'{{0:<{max_widths[key]}}}'.format(headers[key]), end='|') #можно вместо | поставить пробел
        print()
        print( '+'.join('-'*v for v in max_widths.values()) + '|') #разделитель заголовка и тела таблицы
        #выводим строки таблицы
        for row in split_data:
            for parts in itertools.zip_longest(*(row[key] for key in keys)):
                #parts - кортеж, где каждый элемент либо строка в очередной ячейке, либо None
                for key,part in zip(keys, parts):
                    #None означает, что в этой ячейке строки текста уже кончились
                    print(f'{{0:<{max_widths[key]}}}'.format(part if part is not None else ''), end='|')
                print()
            print( '+'.join('-'*v for v in max_widths.values())  + '|') #разделитель строк, если надо
    
    data = [
        {'ip':'192.168.0.2', 'model':'DES-3200-26', 'uptime': '3d 12:03:05', 'uplink state': '25: up\n26:up', 'uplink err': '0\n11', 'uplink mcast': '24560\n113'},
        {'ip':'192.168.0.2', 'model':'DES-3200-52', 'uptime': '1d 04:00:15', 'uplink state': '49: up\n50:up\n51:down\n52:down', 'uplink err': '10\n1133\n0\n0', 'uplink mcast': '5497812\n3145\n0\n0'},
    ]
    headers = {'ip': 'IP address', 'model': 'Model', 'uptime': 'Uptime', 'uplink state': 'Uplink state', 'uplink err': 'Uplink errors', 'uplink mcast': 'Uplink M-cast'}
    print_table(headers, data)

    IP address |Model      |Uptime     |Uplink state|Uplink errors|Uplink M-cast|
    -----------+-----------+-----------+------------+-------------+-------------|
    192.168.0.2|DES-3200-26|3d 12:03:05|25: up      |0            |24560        |
               |           |           |26:up       |11           |113          |
    -----------+-----------+-----------+------------+-------------+-------------|
    192.168.0.2|DES-3200-52|1d 04:00:15|49: up      |10           |5497812      |
               |           |           |50:up       |1133         |3145         |
               |           |           |51:down     |0            |0            |
               |           |           |52:down     |0            |0            |
    -----------+-----------+-----------+------------+-------------+-------------|
    Ответ написан
    2 комментария
  • Почему Python такой, как им пользуются?

    Vindicar
    @Vindicar
    RTFM!
    Например, чтобы запустить написанный код на другом пк нужно притащить туда интерпретатор python, накатить все библиотеки которые используются в моем творении и запустить скрипт, и будет все это крутиться в консоли.

    1. Правильно, если нужен именно упакованный exe, используется PyInstaller, хотя это и не очень оптимально.
    2. Файлы с расширением .pyw запускаются без окна консоли (на Windows). На Linux системах есть свои средства подавления окна консоли.
    3. Чтобы запустить программу на .NET, нужно, чтобы была установлена правильная версия .NET Framework. Чтобы запустить программу, скомпилированную на C++ с помощью Visual Studio, под виндой обычно требуется MSVC Redistributable правильной версии. Они могут быть предустановлены, но это не факт. Так что вопрос зависимостей есть не только в питоне. Питон хотя бы имеет пакетный менеджер для таких вещей, и в большинстве случаев установка зависимостей сводится как pip install foo bar baz.
    А как им пользуются, запускают код, он "крутиться" что то там делает или вызывают питоновские скрипты из других языков.

    Как правило, самостоятельно, в виртуальном окружении типа venv или docker. Если скрипту не требуются специфичные зависимости, можно использовать интерпретатор питона, установленный прямо в системе.
    Но есть механизмы, позволяющие программе на C++ встраивать в себя интерпретатор питона - тогда можно использовать питон для написания скриптов для автоматизации этой программы, например. Это используется реже.
    Ответ написан
    Комментировать