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

    Vindicar
    @Vindicar
    RTFM!
    Можно обойтись без промежуточного cmd.exe если использовать модуль subprocess, и передать при создании дочернего процесса флаг subprocess.CREATE_NEW_CONSOLE (доступен только на винде).
    Но тебе всё равно придётся вынести часть кода в дочерний процесс, так как один процесс может иметь только одно окно консоли.

    Лучше подумай, не стоит ли использовать GUI. Если очень хочется консольку, то можно создать подобие GUI в ней, используя стандартный модуль curses. Проблема в том, что curses - либа под unix, так что надо искать порт под винду.
    Например, этот пакет добавляет поддержку винды в стандартный модуль curses, делая программу более переносимой.
    Ответ написан
    Комментировать
  • Как создать зависящие от времени функции не останаливая работу программы на 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 их принимает, интерпретирует как сообщения и преобразует страницу нужным образом.
    Ответ написан
    2 комментария
  • Как сделать, чтоб код после исполнения автоматически перезапускался заново бесконечно?

    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 и работает поиск. Потому что это единственное поле, где заголовок совпадает с именем поля в таблице БД.
    Ответ написан
    Комментировать