Задать вопрос
  • Как решить проблему с экземпляром класса?

    Vindicar
    @Vindicar
    RTFM!
    3Create, вот и ответ - не нужно вызывать экземплярные методы на классе.
    Поясню. Если у тебя есть такой класс:
    class A:
      #это экземплярный метод - нет декоратора @classmethod или @staticmethod
      def test(self, x, y): 
        print(x+y)


    То при обычном вызове в духе
    a = A() #создаём экземпляр класса
    a.test(1, 2) #вызываем метод экземпляра

    ссылка на объект a автоматически помещается в self, тогда 1 попадёт в x, а 2 в y.
    Если же вызывать A.test(1,2), то поскольку экземпляра нет, его нужно явно указывать. Тогда в self попадёт 1, в x попадёт 2, а для y значения не найдётся, что приведёт к ошибке.
    Можно вызвать это так: A.test(a, 1, 2), но это по сути то же самое, что a.test(1,2).
    Ответ написан
    Комментировать
  • Как добавлять данные в список при использовании multiprocessing?

    Vindicar
    @Vindicar
    RTFM!
    В multiprocessing есть класс Queue, используйте его.
    Ответ написан
    Комментировать
  • Как с помощью discord бота сохранить файлы от пользователя на свой компьютер?

    Vindicar
    @Vindicar
    RTFM!
    discord.py
    Событие on_message для обработки входящих и исходящих сообщений (пример).
    Свойство attachments объекта Message, чтобы проверить прикреплённые файлы.
    Если же сброшенное изображение - это ссылка, то тут нужно регулярками шерстить текст сообщения.
    Ответ написан
    Комментировать
  • Как создать объект с запретом на изменение чего-либо на глобальном уровне?

    Vindicar
    @Vindicar
    RTFM!
    Если вы не доверяете импортируемому коду, вы можете отчасти изолировать его в другом процессе с помощью модуля multiprocessing - в том числе по отношению к globals. По-крайней мере, разрушительные действия этого кода будут ограничены. Но он всё ещё может наворотить дел, например, в файловой системе. Кое-что можно будет поправить в нашей функции-обёртке для импорта модуля, но это непростая задача, и реализуется по-разному в зависимости от ОС, под которой работает интерпретатор.
    Например,
    from multiprocessing import Process
    
    def run_module(modulename: str): #обёртка для импорта модуля.
        try:
            #модуль может содержать код, который выполнится прямо в этот момент
            import modulename 
            #либо мы можем потребовать, чтобы в целевом модуле была отдельная функция-точка входа, например run()
            modulename.run() 
        except Exception as err:
            raise #можем добавить какую-то общую реакцию на ошибки модуля
    
    # описываем новый процесс
    p = Process(target=run_module, args=('module_name', ))
    p.start() #API процессов имитирует API потоков.

    Также модуль предоставляет механизмы для общения между процессами.
    Ответ написан
    5 комментариев
  • Как прочитать файлы с кириллицей/разными символами?

    Vindicar
    @Vindicar
    RTFM!
    1. Вот что ты ожидал получить, открыв docx просто через open()? Разумеется, ты получаешь содержимое файла... содержимое, а не текст. Потому что docx - это на самом деле zip архив с пачкой xml файлов внутри. Из них можно выколупать текст самостоятельно, но это муторно.

    2. Это уже ближе, но серьёзно, включи мозги - у тебя предполагаемое имя файла содержит то, что выглядит как текст документа. Т.е. судя по всему, функция docx2txt.process() возвращает текст документа как есть, строкой. А ты действуешь как будто она пишет его в файл и возвращает имя этого файла. Наверняка в документации к этому модулю её поведение описывается.
    Ответ написан
    Комментировать
  • Как создать интерфейс на питоне в браузере?

    Vindicar
    @Vindicar
    RTFM!
    Тебе, по-сути, нужно разработать локально работающий сайт.
    Погугли в сторону django, например.
    Хотя для очень простых вещей можно обойтись и встроенным HTTP сервером питона, с ним не очень удобно работать.
    Ответ написан
  • Куда всунуть аргумент self?

    Vindicar
    @Vindicar
    RTFM!
    Для начала, что такое main() - метод или свободная функция? Если метод, метод вызывается как self.main(). Это азы синтаксиса Питона, их нужно знать прежде чем бросаться воевать с Ткинтером.
    Во-вторых, зачем лямбда? Если метод не требует параметров, то можно указать просто self.main без скобок. Лямбда нужна, если параметры, передаваемые кнопкой, не совпадают с параметрами, требуемыми методом.
    Ответ написан
    6 комментариев
  • Как в discord.py сделать чтобы создатель сервера мог указывать роли для команд?

    Vindicar
    @Vindicar
    RTFM!
    Нужна база данных, так как эту информацию нужно будет сохранять при перезапуске бота.
    Если задача стоит как "укажите, какая роль будет модератором", то тогда в базе должна быть таблица, где сопоставляется ID сервера и ID роли.
    Тогда алгоритм задания роли будет такой:
    1. Проверяем, что отправивший команду является владельцем сервера.
    2. Определяем ID сервера.
    3. Вытаскиваем из параметров команды название роли.
    4. Перебираем роли на сервере, ищем роль с таким названием, запоминаем её ID.
    5. Помещаем пару сервер-роль в таблицу БД. Для обычной базы данных на основе SQL (вроде строенной питоновской sqlite) хорошо использовать запрос вида INSERT ... ON CONFLICT UPDATE ... - это позволит не париться, была ли уже задана роль модератора для этого сервера.

    Алгоритм проверки роли будет такой:
    1. Получаем ID сервера, на котором была отправлена команда.
    2. Получаем ID роли отправителя команды.
    3. Проверяем, есть ли в таблице строка с такой парой сервер-роль.
    4. Если есть, разрешаем выполнить команду.

    В качестве упражнения для обучения это хорошая идея.
    С практической точки зрения - это абсолютно бесполезно, потому что роль с правами модератора может кикать и банить по правому щелчку мыши по юзеру, безо всяких ботов.
    Ответ написан
    Комментировать
  • Как описать обработку исключения при неудачной попытке подключения к IP-камере?

    Vindicar
    @Vindicar
    RTFM!
    1. OpenCV умеет работать с четырьмя источниками видео: видеофайл, набор файлов-кадров, подключённая камера, видеопоток по сети. На втором скриншоте ошибка про CAP_IMAGES намекает, что OpenCV пытается интепретировать URL во втором режиме вместо четвёртого. Стоит указать дополнительный параметр конструктора VideoCapture, задающий режим открытия источника видео.

    2. API OpenCV довольно непоследователен в своей сигнализации ошибок, и выбрасывает исключения только если скормить функции некорректные данные. Ситуации типа некорректного формата изображения сигнализируются возвращаемыми значениями. В вашем случае всё, что остаётся - подождать пару секунд, периодически опрашивая isOpened(). Если она не вернула истину по окончанию интервала, считаем попытку неудавшейся. Альтернатива - пытаться перехватывать сообщенеи в консоль, оно, похоже, выводится стандартным модулем logging. Но это тот ещё хак.

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

    Vindicar
    @Vindicar
    RTFM!
    Гугл нашел issue на гитхабе kivy. Последний пост от февраля этого года указывает на необходимость добавить пару каталогов в переменную окружения PATH, примерно так.
    # you must add to the path the location of your SDL2 binaries
    os.environ['PATH'] += ';' + os.path.expandvars('%AppData%\\Python\\share\\glew\\bin')
    os.environ['PATH'] += ';' + os.path.expandvars('%AppData%\\Python\\share\\sdl2\\bin')


    Однако выше упоминается, что это необходимо только если питон установлен по нестандартному пути. Также стоит проверить, установлен ли питон от админа (для всех пользователей) или нет.
    Ответ написан
    Комментировать
  • Что означает Non-UTF-8 code starting with '\xff'?

    Vindicar
    @Vindicar
    RTFM!
    Если скрипт содержит кириллицу или иной юникод (пусть даже в комментариях или в строках), первая строка файла должна содержать указание кодировки. У тебя, я полагаю, кодировка виндовая, windows-1251. Либо укажи её явно, либо пересохрани файл в UTF-8.
    Ответ написан
  • Почему слетает кодировка?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию на json.dump(), точнее на параметр ensure_ascii.

    If ensure_ascii is true (the default), the output is guaranteed to have all incoming non-ASCII characters escaped. If ensure_ascii is false, these characters will be output as-is.
    Ответ написан
    2 комментария
  • Почему замерает окно приложения PyQt5?

    Vindicar
    @Vindicar
    RTFM!
    Потому что join() останавливает поток выполнения - в твоем случае поток GUI, который отвечает за работу окна приложения - пока целевой поток не завершится. Т.е. что ты делаешь - это эквивалент как если бы ты просто вызвал self.sucess_send_request(link, valid_proxy) прямо в обработчике события.

    Нужно дождаться завершения к какому моменту? К моменту закрытия окна? Или ещё к какому?
    Я бы сделал так: создай глобальные объекты (например, поля класса), доступные всем потокам. Один - типа threading.Lock, один - счётчик и один - типа threading.Event().
    Когда поток запускается, он захватывает Lock, увеличивает счётчик и сбрасывает Event (метод clear()), отпускает Lock.
    Когда поток готов завершиться, он захватывает Lock, уменьшает счётчик. Если после уменьшения счётчик стал равен 0, устанавливает Event (метод set()). Затем отпускает Lock. Убедись, что это происходит внутри try: finally:, чтобы непойманное исключение не сломало систему.

    Тогда главный поток приложения может просто время от времени проверять текущее значение счётчика (число активных потоков). А если надо, то может ждать на объекте Event, чтобы дождаться завершения всех потоков.
    Ответ написан
    3 комментария
  • Как отправить post запрос с изменяющимися данными?

    Vindicar
    @Vindicar
    RTFM!
    Разобраться как они генерируются и сгенерировать самому. Без вариантов.
    Ответ написан
  • Почему сначала заканчивается func1, а уж потом выводит, что func1 началась?

    Vindicar
    @Vindicar
    RTFM!
    t = threading.Thread (target = func1())
    Ты запускаешь поток, в качестве тела которого указываешь то, что вернула после вызова func1.
    Это None, и поток ничего не делает.
    Исправь на
    t = threading.Thread (target = func1)
    Нужно запомнить разницу:
    func1 - ссылка на функцию
    func1() - результат вызова функции без параметров
    Ответ написан
    Комментировать
  • Как одной строчкой вызвать методы из всех экземпляров класса?

    Vindicar
    @Vindicar
    RTFM!
    Храни все экземпляры в списке, итерируй по списку.
    Ответ написан
    Комментировать
  • Можно ли сократить код с помощью numpy?

    Vindicar
    @Vindicar
    RTFM!
    Какие числа могут быть в парах? Если любые, то дело осложняется.
    Если же небольшие целые положительные, то можно посчитать так.
    Строишь двумерный массив, где первый индекс - первое число из пары, второй - второе.
    Заполняешь нулями, потом увеличиваешь элемент на единицу каждый раз, когда встречена такая пара.
    Если две пары имеют общее число, они будут лежать на одной строке или на одном столбце.
    Тогда если пара не имеет общих чисел с другими, то сумма значений на её строке и её столбце будет 1.
    Если две пары имеют общее число, то сумма значений на их общем строке/столбце будет 2. И так далее.
    Отсюда вывод: для каждой строки и каждого столбца посчитай сумму значений минус 1 (но ограничь снизу по нулю!). Просуммируй полученные числа, и получишь ответ.
    Ответ написан
    Комментировать
  • Не получается добавить иконку к программе на Python?

    Vindicar
    @Vindicar
    RTFM!
    Иконка должна быть в формате ico, а не jpg, и иметь строго определённый размер (типовые размеры 16х16, 32х32, 64х64, 128х128).
    Если нет ico файла, также допустимо выдрать иконку из exe или dll файла, что pyinstaller и пытается сделать. Безуспешно, так как вы дали ему jpg.
    Ответ написан
    2 комментария
  • Как убрть служебный импорт?

    Vindicar
    @Vindicar
    RTFM!
    Переименовать свой файл, чтобы имя не совпадало со встроенными модулями. Их список известен.
    Ответ написан
  • Python ошибка в классе! понять пожалуйста?

    Vindicar
    @Vindicar
    RTFM!
    self.battery_size = Battery()
    на
    self.battery = Battery()
    Ответ написан
    1 комментарий