Задать вопрос
  • Как создать зависящие от времени функции не останаливая работу программы на pygame?

    Vindicar
    @Vindicar
    RTFM!
    У тебя должна быть фиксированная частота обновления логики игры.
    Тогда ты сможешь любые задержки выражать в числе кадров, которое должно пройти, прежде чем можно выполнить следующее действие. Соответственно у каждого действия есть счётчик кадров, если он не 0 - действие на кулдауне и выполнять его нельзя. Каждый кадр уменьшаешь ненулевые счётчики на 1.

    Чуть более тонкий подход - хранить время, оставшееся до истечения кулдауна. На каждом кадре измерять, сколько времени прошло с прошлого кадра, и вычитать этот интервал. Точность всё равно будет порядка одного кадра, но хотя бы при тормозах кулдауны не будут замедляться.

    Заодно почитай, что такое автомат состояний. Пригодится.
    Ответ написан
    Комментировать
  • Как предотвратить двойные нажатия?

    Vindicar
    @Vindicar
    RTFM!
    Вопрос на засыпку: если объект-кнопка обработал событие, остальные объекты его тоже получат?
    Если да, то именно такое поведение и будет наблюдаться. Надо как-то пометить, что событие уже было обработано элементом интерфейса. Либо изъять событие из очереди, либо как-то дать знать новому экрану, что события обрабатывать не надо.

    Альтернативно, вызывай коллбэк только если элемент зафиксировал и нажатие и отпускание кнопки без выхода курсора за пределы элемента. Тогда "остаточного" события будет недостаточно для активации кнопки.
    Ответ написан
    Комментировать
  • Полезность моделей памяти которые отличный от linear?

    Vindicar
    @Vindicar
    RTFM!
    Ты придумал защищённый режим x86. Селектор+смещение, да, да.
    На практике ОС создавали два селектора размером со всё адресное пространство, а для реального управления использовали только страничный механизм, потому что размер таблицы селекторов был ограничен, да и просто муторная это штука. В итоге в длинном режиме (x64) остался только страничный механизм.
    Ответ написан
    Комментировать
  • Python, что правильнее использовать, запуск бота на прямую или крон?

    Vindicar
    @Vindicar
    RTFM!
    Ну если на то пошло, то systemd умеет делать задачи-таймеры по типу крона. Хотя крон, пожалуй, на большем числе систем из коробки есть.

    Я бы сказал так. Если у тебя интервалы запуска более-менее статичные - используй systemd или cron.
    А вот если у тебя время следующего запуска нужно вычислять согласно некоторой нетривиальной логике - тут уже лучше самому сделать планировщик.
    Ответ написан
  • Finite State Machine Python, как вызвать функцию с переменной state?

    Vindicar
    @Vindicar
    RTFM!
    У тебя проблема молотка.
    С 99% вероятностью тебе не нужно вызывать такие функции, они являются обработчиками событий и вызываются самим фреймворком aiogram. Если тебе нужно повторно использовать код в таком обработчике, вынеси его в отдельную функцию, которая не работает ни с состоянием, ни с событием.

    Допустим, у тебя есть код:
    @state_router.message(MyState.stateA)
    async def process_stateA(message: Message, state: FSMContext) -> None:
        data = await state.get_data()
        result = message.text + str(data['some_key'])  # это типа логика обработки
        await message.reply(result)

    Его надо будет отрефакторить так:

    def do_stuff(msgtext: str, some_value) -> str:
        return msgtext + str(some_value)
    
    @state_router.message(MyState.stateA)
    async def process_stateA(message: Message, state: FSMContext) -> None:
        data = await state.get_data()
        result = do_stuff(message.text, data['some_key'])
        await message.reply(result)

    И тогда ты сможешь при необходимости вызвать снова do_stuff(), не трогая process_stateA().
    Ответ написан
    1 комментарий
  • Как хранить данные для кастомного блока code?

    Vindicar
    @Vindicar
    RTFM!
    БД тут абсолютно ни причём. Она хранит текст в том виде, в каком ты его туда поместил, вплоть до байта.
    Это браузеры по умолчанию сокращает отступы в ходе рендеринга HTML. Но есть теги вроде <pre>, которые отступы сохраняют. Также можно использовать CSS-свойство white-space со значениями pre или pre-wrap.

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

    Vindicar
    @Vindicar
    RTFM!
    1) Как мне использовать питон код в javascript коде сайта

    Никак, большинство бразуеров поддерживает только JavaScript. Клиентский код придётся писать на нём.
    Зато ты можешь использовать любой язык на стороне сервера - если твоя программа поддерживает нужные протоколы (HTTP + websockets), браузеру будет всё равно, на чём она написана.
    2) Как я могу вносить изменения на работающую html страницу, аналогично работе javascript кода, написанного выше

    Использовать для этой цели JavaScript. JS подключается к вебсокету, Питон отдаёт данные через этот вебсокет, JS их принимает, интерпретирует как сообщения и преобразует страницу нужным образом.
    Ответ написан
    1 комментарий
  • Как сделать, чтоб код после исполнения автоматически перезапускался заново бесконечно?

    Vindicar
    @Vindicar
    RTFM!
    while True: вокруг участка, который нужно перезапускать заново.
    Можешь для надёжности завернуть участок в try: except Exception:.
    А вообще я подозреваю, что такую спамилку запросами забанят через час.
    Ответ написан
  • Как реализовать выход из программы или закрытие cmd консоли при вводе 'stop'?

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

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужна функция WinAPI SetWindowPos().
    Чтобы достучаться до винапи, используй стандартный модуль ctypes.
    Ответ написан
    Комментировать
  • Как можно распарсить текст на python?

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

    Vindicar
    @Vindicar
    RTFM!
    Учим стандартную библиотекц питона.
    Там это есть.
    import datetime
    day_of_week = datetime.datetime.now.weekday()
    Ответ написан
    3 комментария
  • При каких обстоятельствах запущен данный процесс python-программы?

    Vindicar
    @Vindicar
    RTFM!
    Я бы попробовал использовать аудит-хук.
    Многие функции питона генерят события аудита, на которые можно подписаться.
    Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
    Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
    import sys
    import traceback
    # хук который ловит событие импорта модуля
    def hook(event, args):
        if event != 'import':
            return
        name, filename = args[0], args[1]
        callstack = traceback.extract_stack(limit=None)
        print(event, name, filename)
        for item in traceback.format_list(callstack):
            print('    ', item.strip())
    
    sys.addaudithook(hook)
    
    import json
    
    print('Done')


    Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

    Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
    Ответ написан
    1 комментарий
  • Почему в результате изменения второго списка меняется также и первый, если перед этим я приравнял второй список к первому?

    Vindicar
    @Vindicar
    RTFM!
    Читаем про изменяемые и неизменяемые объекты в питоне.
    Если коротко, когда ты делаешь a = b, ты не копируешь объект. Ты просто создаёшь новую ссылку на него.
    Достаточно проверить так:
    print(languages is new_list) # True
    Если объект изменяемый, то изменения будут видны по любой ссылке, что логично:
    a = [1, 2, 3]
    b = a  # b ссылается на тот же список
    b.append(4)  # список изменили

    Если объект неизменяемый, то это не так заметно, потому что ссылка заменяется на ссылку на новый объект:
    a = 5
    b = a  # b ссылается на 5
    a += 1  # a = a + 1 т.е. a = 6 - a теперь ссылается на новый объект 6, b - по прежнему на 5.


    Если нужна независимая копия списка, словаря или иного изменяемого объекта - делай её явно.
    Ответ написан
    1 комментарий
  • Как замокать путь для os.curdir в тесте?

    Vindicar
    @Vindicar
    RTFM!
    Просто сменить текущий рабочий каталог самому?
    Ответ написан
    Комментировать
  • Как использовать функцию написанную на Python в C#?

    Vindicar
    @Vindicar
    RTFM!
    1. Если нужно именно вызывать функции, то что-то типа Python.NET. А вообще на кой тебе, код же суперпримитивный, его в разы проще переписать на C# чем разбираться с внедрением питона в .NET среду.
    2. FileSystemWatcher
    Ответ написан
    6 комментариев
  • Можно ли связать treeView с таблицей бд SQL?

    Vindicar
    @Vindicar
    RTFM!
    1. Можно. Способы есть разные, навскидку не перечислю.
    2. Оптимизация по какому показателю? Если элементов не очень много (в пределах нескольких сотен) - можно действовать в лоб, то бишь перебрать записи в таблице БД и динамически создать узел в TreeView на каждую запись. В противном случае может потребоваться решение поизящнее, например, заставлять пользователя сначала выбрать категорию, и только потом строить дерево.
    Ответ написан
  • Как правильно вывести структуру из dll на c++ в Python?

    Vindicar
    @Vindicar
    RTFM!
    Разумеется, тебе и реализацию функции надо будет поправить, её заголовок должен совпадать с тем, который ты описал в заголовочном файле. Это же азы!
    Более того, у тебя и тело функции изменится. Теперь вместо
    __declspec(dllexport) outdata SpiralsCoord(float x1, float x2, float x3, float x4, float x5, int x6) {
    outdata data;
    data.out_x1 = xy1;
    data.out_x2 = xy2;
    data.out_x3 = xy3;
    return data;
    }

    будет код вроде
    __declspec(dllexport) void SpiralsCoord(float x1, float x2, float x3, float x4, float x5, int x6, outdata* data) {
    //используем оператор ->, так как data теперь указатель на структуру, а не сама структура
    data->out_x1 = xy1; 
    data->out_x2 = xy2;
    data->out_x3 = xy3;
    }

    Ну а в Питоне тогда для передачи последнего параметера нужно будет сделать кое-что.
    1. Описать структуру outdata как класс-потомок ctypes.Structure.
    2. Создать экземпляр этой структуры.
    3. Описать прототип функции SpiralsCoord (или под каким именем она экспортируется?), указав типы параметров и возвращаемого значения.
    4. Использовать ctypes.byref() при передаче экземпляра структуры последним параметром.
    Ответ написан
    Комментировать
  • В чем ошибка кода?

    Vindicar
    @Vindicar
    RTFM!
    Ошибка в том, что ты пытаешься делать две вещи сразу.
    У тебя описан словарь фильтров:
    self.filters = {  # тут у тебя человекочитаемые заголовки
                "ID": tk.StringVar(),
                "Город": tk.StringVar(),
                "Температура": tk.StringVar(),
                "Погода": tk.StringVar(),
                "Скорость ветра": tk.StringVar(),
    }

    Но дальше ты делаешь
    # тут ты переносишь пару заголовок-значение в словарь строка:строка
    filter_values = {criteria: var.get() for criteria, var in self.filters.items()}
    ...
    for criteria, value in filter_values.items():
        if value:  # а тут ты внезапно решаешь что у тебя ключ - имя поля, а не заголовок
            conditions.append(f"{criteria} LIKE ?")


    Собственно, почему только с ID и работает поиск. Потому что это единственное поле, где заголовок совпадает с именем поля в таблице БД.
    Ответ написан
    Комментировать
  • При добавлении пользователя в таблицу в поле ID ставиться none, хотя я сделал проверку, пользователю присваивается ID. Что не так?

    Vindicar
    @Vindicar
    RTFM!
    Ты эту БД давно используешь? Просто новички часто споыткаются о простой факт. Запросы вида CREATE TABLE IF NOT EXISTS создадут отсутствующую таблицу, но не изменят таблицу, если она уже существует. Даже если структура таблицы отличается от заданной. Скажем, если ты добавил автоинкремент в запрос CREATE позднее, то в реальной таблице его не будет.
    В таком случае проще всего снести файл базы, чтобы она пересоздалась, и снова наполнить его данными.

    Также можешь попробовать узнать реальную структуру твоей таблицы так:
    SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = 'customers'
    Ответ написан
    Комментировать