• Как в консоли выбрать файл не вводя его имя?

    Vindicar
    @Vindicar
    RTFM!
    Используй Midnight Commander, у него есть командная строка и горячие клавиши для сброса в эту командную строку текущего выбранного файла в левой/правой панели.
    Ответ написан
    Комментировать
  • Ошибка: sqlite3.OperationalError: no such column: telegram_id: Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    CREATE TABLE IF NOT EXISTS не сработает, если таблица уже существует - но и только. Если она имеет неправильную структуру, данный вызов её не пересоздаст, а оставит как есть. Проверь структуру таблицы, либо через обращение к таблице схемы (хранит структуру всех таблиц к БД), либо подцепившись клиентом к твоей БД.
    Ответ написан
    Комментировать
  • Почему не изменяется значение переменной в python?

    Vindicar
    @Vindicar
    RTFM!
    class Enemy:
        ...
        def mobReturn(self): 
            self.x_mob = self.rect.x
    
    class Bullet(pygame.sprite.Sprite):
        def update(self):
            if x_mob>=100:

    В первом случае ты изменяешь атрибут экземпляра класса Enemy.
    Во втором случае ты читаешь локальную переменную метода update() класса Bullet.
    Это совершенно разные области видимости, они друг о друге ничего не знают.

    Если ты пытаешься решить задачу обнаружения коллизий (т.е. пересечений двух объектов), тебе как-то придётся их "познакомить".
    Или сделай метод у противника, в который передаёшь пулю, и спрашиваешь "вот это в тебя попало?".
    Или сделай метод у пули, в который передаёшь противника, и спрашиваешь "ты вот в это попала?"
    Или вообще сделай отдельную функцию, куда передаёшь врага и пулю, если не хочешь нагружать их этой обязанностью.

    Во всех случаях проверку коллизии нужно будет делать каждый кадр. Так что в главном цикле игры надо будет перебирать активных врагов и активные пули, и проверять их. В простейшем случае - всех со всеми.
    Ответ написан
  • Вылет Python при возврате c_char_p из dll ctypes. Что не так?

    Vindicar
    @Vindicar
    RTFM!
    У тебя возвращаемая переменная размещена на стеке. Возможно, string умирает по выходу из функции, и уносит с собой выделенную строку, так что указатель к моменту возврата из функции уже ни на что не указывает.

    Если обратиться к функции из под C++, она сработает?
    # include <fstream>
    # include <string>
    using namespace std;
    
    const char* readfile(char* filename) {
      ifstream file;
      string lines, line;
      
      file.open(filename);
      if (file.is_open()) {
        while (file >> line) {
          lines += line;
        }
        file.close();
        return lines.c_str();
      } else {
        char* trashVar = "Bad open";
        return trashVar;
      }
    }
    
    int main()
    {
        cout << readfile("filename.txt");
        return 0;
    }
    Ответ написан
    4 комментария
  • У меня в программе ошибка не считает последную функцию не тот ответ как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Впридачу ко всему остальному выше:
    return clas 
    return name

    Отработает только первый return.
    Ответ написан
    Комментировать
  • Кнопка включения и выключения Python?

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

    1. Для работы оконного интерфейса поток приложения (обычно главный поток, в котором исполняется тело программы) должен выполнять цикл обработки сообщений. В твоём случае этот цикл спрятан в методе window.mainloop(). Но как следствие, нельзя выполнять длительные действия в обработчиках событий интерфейса! Т.е. по нажатию на кнопку нельзя просто взять и заняться чем-то на полчасика - окно программы на это время перестанет отвечать.
    Так что тебе придётся вытащить твою секретную операцию в отдельный поток выполнения, например, через модуль threading. Про это надо читать. Но тут ждёт вторая подстава - оконные приложения не любят обращения к элементам из нескольких потоков. Наладить общение между интерфейсом и потоком - отдельная задача.

    2. Прервать поток - задача тоже непростая. Есть средства принудительной остановки, но они легко могут покорёжить остальную программу. Так что тебе придётся переделать свой секретный скрипт так, чтобы ему можно было сказать "стоп". А для этого надо будет как минимум завернуть операцию в класс.

    Могу показать упрощённый пример, как это делается. Но его нужно будет подгонять под свою задачу, и да, твой код придётся переписать почти с нуля.
    Пример
    import threading
    import tkinter
    from tkinter import ttk
    import time
    
    # Этот класс описывает длительную операцию, выполняемую в потоке.
    class LongRunningOperation(threading.Thread):
        # если твоя операция требует аргументы, они передаются через конструктор
        def __init__(self, my_argument):
            super().__init__(daemon=True)  # если главный поток завершился, мы тоже должны
            self._my_argument = my_argument  # и сохраняются в self
            self._stop_flag = threading.Event()  # а это - признак "Пора останавливаться"
            self._progress = 0  # эта переменная отслеживает прогресс
            # этот объект гарантирует, что наш и внешний потоки не будут трогать self._progress одновременно
            self._progress_lock = threading.Lock()  
        
        # От threading.Thread() мы унаследуем два важных метода
        #     start() вызывается снаружи потока и запускает наш поток
        #     wait() вызывается снаружи потока и ждёт, пока наш поток не остановится
        
        # Этот метод вызывается снаружи потока и сигнализирует об остановке
        # Но остановиться поток должен будет сам
        def stop(self):
            self._stop_flag.set()  # threading.Event безопасен для использования несколькими потоками.
        
        # Этот метод вызывается снаружи потока и позволяет узнать прогресс длительной операции
        def get_progress(self):
            with self._progress_lock:  # любые обращения к self._progress заворачиваются в такой блок
                # вообще, для чисел Lock не требуется. Но если ты хочешь сообщать что-то большее, это надо делать.
                return self._progress
        
        # Тело этого метода будет выполняться в отдельном потоке.
        # Именно этот метод реализует длительную операцию.
        def run(self):
            # я не знаю, что творится у тебя в коде. 
            # Тебе придётся адаптировать свой код под этот шаблон.
            self._progress = 0
            self._stop_flag.clear()
            print('Operation started')
            while not self._stop_flag.is_set():  # пока нам не сказали остановиться
                # Тут ты выполняешь порцию своей длительной работы. Например, одну итерацию цикла.
                print('Operation with my_argument =', self._my_argument)
                time.sleep(0.1)  # это просто для примера - ждём 0.1 секунды. 
                # Выше ты выполняешь порцию своей длительной работы. Например, одну итерацию цикла.
                with self._progress_lock:
                    self._progress += 1  # наращиваем прогресс
                    if self._progress == 100:
                        # в данном случае прерываем цикл, если прогресс дошел до 100 - дело сделано
                        # если у тебя цикл "пока снаружи не остановят", то условие и break можно убрать
                        break  
            print('Operation stopped')
    
    
    class MainWindow(tkinter.Tk):  # окно приложения
        def __init__(self):
            super().__init__()
            self._operation = None  # а вот тут будет храниться экземпляр класса LongRunningOperation
    
            self.title('Pet Clicker III')
            self.geometry('600x600')
            
            self._progress = tkinter.IntVar()  # переменная для прогресса в окне
            # прогрессбар подхватит эту переменную, так как мы её указали в параметрах
            self._progressbar = ttk.Progressbar(self, maximum=100, variable=self._progress, mode='determinate')
            self._progressbar.pack(side='top', expand=True, fill='x')
            
            self._button = tkinter.Button(self, text='Start', command=self._start_stop)  # кнопка пуск/стоп
            self._button.pack(side='top', expand=True, fill='x')
            
            self.after(500, self._check_progress)  # через 500 мс надо вызвать _check_progress()
            
        def _check_progress(self):  # показывает прогерсс операции в окне, если есть что показывать
            if self._operation is not None:  # операция сейчас выполняется?
                progress = self._operation.get_progress()
                self._progress.set(progress)  # задаём новое значение прогресса
                if not self._operation.is_alive():  # поток уже остановился?
                    self._progress.set(0)  # сбрасываем прогресс
                    self._button.config(text='Start')  # переименовываем кнопку
                    self._operation = None  # забываем про объект операции
            self.after(500, self._check_progress)  # ещё через 500 мс вызовем функцию снова
        
        def _start_stop(self):  # запускает или останавливает операцию
            if self._operation is None:  # операции нет - запускаем её
                self._operation = LongRunningOperation(42)  # передаём аргументы в операцию. В нашем случае my_argument = 42.
                self._progress.set(0)  # сбрасываем прогресс
                self._button.config(text='Stop')  # переименовываем кнопку
                self._operation.start()  # запускаем второй поток, который будет выполнять операцию
            else:  # операция уже запущена - останавливаем её
                self._operation.stop()  # даём сигнал "остановись"
                self._operation.join()  # ждём, пока она действительно не остановится
                self._progress.set(0)  # сбрасываем прогресс
                self._button.config(text='Start')  # переименовываем кнопку
                self._operation = None  # забываем про объект операции
    
    wnd = MainWindow()
    wnd.mainloop()
    Ответ написан
  • JSON io.UnsupportedOperation: not readable почему выводиться данная ошибка JSON?

    Vindicar
    @Vindicar
    RTFM!
    with open('values.json') as json_file:
    Для чего открываешь файл? Чтение? Запись? Надо указывать.
    Ответ написан
  • Как можно оптимизировать код для склейки видео по запросу пользователя?

    Vindicar
    @Vindicar
    RTFM!
    a = VideoFileClip("./Video/a.mp4")
    b = VideoFileClip("./Video/b.mp4")

    1. Если ты ловишь себя на создании переменных такого вида, тебе нужна коллекция. Открой для себя словари (dict).

    2. Что мешает подставить введённую строку в имя файла?
    Ответ написан
    1 комментарий
  • Возможно ли добавить функцию в бота aiogram, которая будет удалять/изменять текст сообщения?

    Vindicar
    @Vindicar
    RTFM!
    Нужно хранить в БД ID всех сообщений бота консультантам, которые описывают данную заявку. При обработке заявки пройтись по списку ID для данной заявки и удалить сообщение (ну или отредактировать).
    Простейшая таблица вида "ID сообщения - ID заявки" тут справится.
    Ответ написан
    2 комментария
  • Aiogram как отправлять заранее заготовленное сообщение каждый день?

    Vindicar
    @Vindicar
    RTFM!
    1. Записать в переменной ID получателя.
    2. Разобраться, как отправить сообщение по заранее известному ID.
    3. Разобраться, как пользоваться aioschedule.
    Ответ написан
    Комментировать
  • Как сделать так, что бы обновлялось всё время?

    Vindicar
    @Vindicar
    RTFM!
    Я написал такой код:

    Не верю. (с)

    Если бы ты сам его написал, ты бы знал, что у тебя там сначала вечный цикл while True, который прерывается только если нажата клавиша (cv2.waitKey()) с кодом 27, т.е. Esc. Но этот цикл только читает кадр и показывает его в окне. А всё распознавание идёт уже после этого цикла. И там же вывод одного кадра и ожидание любой клавиши.

    Если нужно, чтобы операция выполнялась для каждого кадра - она должна быть внутри цикла по кадрам. Логично?
    Ответ написан
  • Как выполнить нужный из директорий скрипт в зависомости от переданного аргумента?

    Vindicar
    @Vindicar
    RTFM!
    А) Запускай скрипт как суб-процесс через os.system() / subprocess / вариации на тему. Годится, если скрипт-сервис должен быть изолирован от основного скрипта.
    Б) импортируй модуль через importlib. Каждый модуль должен иметь точку входа, скажем, класс или функцию с заданным именем, которую основная программа активирует. Более тесное взаимодействие, со всеми плюсами и минусами.
    Ответ написан
    Комментировать
  • Почему создавая виртуальное окружения, не работает pip?

    Vindicar
    @Vindicar
    RTFM!
    Укажи в команде полный путь до pip в виртуальном окружении.
    Ответ написан
  • Как пофиксить ошибку при запуске собранной программы на pyinstalle?

    Vindicar
    @Vindicar
    RTFM!
    Это известная пробелма с пиинсталлером - на него реагируют эвристики антивирусов, потому что pyinstaller рпи работе распаковывает скрипт и интерпретатор питона. Поставь более старую версию пакета pyinstaller и используй её для упаковки - они обычно уже внесены в базы как "не вирус".
    Ответ написан
    Комментировать
  • Как настроить универсальный хендлер в аиограм?

    Vindicar
    @Vindicar
    RTFM!
    Вместо text в callback_query_handler() укажи функцию, которая принимает CallbackQuery и возвращает True, если надо обработать данный запрос, и False, если нужно поискать другой обработчик. Для ускорения можешь все коды запросов в БД пометить отдельным префиксом (например, пусть они начинаются с "db_"), чтобы сразу отсечь посторонние коды.
    Просто погугли callback_query_handler, увидишь что-то типа lambda callback_query: True - это означает "принимать любые коды запроса". Но ведь можно True возвращать не всегда.
    Ответ написан
    Комментировать
  • Хочу прописать арифметические действия телеграм боту. Как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Читай на тему finite state machine. Не знаю конкретно насчёт telebot, а другие библиотеки содержат эту фичу.
    Но в целом идея несложная - ты должен для каждого пользователя помнить, на каком шаге он находится (ожидание первого числа, ожидание оператора, ожидание второго числа) и что он вводил раньше. Получив сообщение, смотришь по ID пользователя его шаг, и обрабатываешь текст сообщения соответственно. Можно это и вручную реализовать.

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

    Vindicar
    @Vindicar
    RTFM!
    Ну немногие фреймворки такое позволяют. Можно подёргать WinAPI, например, SetWindowRgn() (позволяет задать видимую и "осязаемую" область окна). Тогда можно сделать окно на твоём предпочитаемом фреймворке, узнать дескриптор окна, и вызвать эту функцию через ctypes для задания непрозрачных областей.

    Насчёт Qt не скажу, может, оно и умеет такое "из коробки".
    Ответ написан
    Комментировать
  • Как бот дискорд может создать ветку с сообщением или получить айди только созданной ветки?

    Vindicar
    @Vindicar
    RTFM!
    await message.create_thread(name=nick, message=msg)
    TypeError: create_thread() got an unexpected keyword argument 'message'

    А перевести текст ошибки не пробовал? create_thread() не принимает аргумент message. Значит, надо открыть документацию, найти этот метод и посмотреть, какие параметры он принимает.

    Parameters
    name (str) – The name of the thread.
    auto_archive_duration (int) – The duration in minutes before a thread is automatically archived for inactivity. If not provided, the channel’s default auto archive duration is used.
    slowmode_delay (Optional[int]) – Specifies the slowmode rate limit for user in this channel, in seconds. The maximum value possible is 21600. By default no slowmode rate limit if this is None.
    reason (Optional[str]) – The reason for creating a new thread. Shows up on the audit log.

    Никакого параметра message тут нет. Более того, выше прямо сказано: "Creates a public thread from this message." Тут что-нибудь написано про отправку сообщения в создаваемый тред? Нет.

    Зато ниже сказано: "Returns: The created thread. Return type: Thread" Т.е. метод возвращает объект треда, с которым можно взаимодействовать. Смотрим по ссылке, что это за объект, видим в методах send().

    Вот и вся загадка. RTFM!
    Ответ написан
    Комментировать
  • Как можно изменить код, чтобы он работал быстрее?

    Vindicar
    @Vindicar
    RTFM!
    result = numpy.zeros(mask.shape + (3,), dtype=numpy.uint8)
    result[mask > 0] = (255, 255, 255)

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

    Vindicar
    @Vindicar
    RTFM!
    1. Научиться отправлять сообщение в чат с заранее известным ID вместо использования message.answer().
    2. Хранить ID (или список ID), которым надо разослать сообщение.
    3. Научиться пользоваться пакетом aioschedule. В частности, как планировать вызов корутины и что нужно сделать для обеспечения работы пакета.
    4. Понять, как пользоваться asyncio.create_task(), чтобы запускать рабочий цикл aioschedule параллельно с работой бота. В частности, как выполнить код непосредственно при старте бота, а не как реакцию на сообщение.
    5. Свести эти знания вместе.

    При старте бота запускаем рабочий цикл aioschedule и планируем выполнение корутины опроса. Корутина опроса проходит по списку ID и каждому отправляет сообщение, одновременно задавая нужное состояние на машине состояний FSM. Дальше работа идёт как обычно - приняли сообщение пользователя, обработали состоянием, перешли к следующему состоянию.
    Ответ написан
    Комментировать