Задать вопрос
  • Микрофон на компе включён постоянно, как это пресечь?

    @sergio_salieri
    Обратились за помощью, проблема была банальна и сидела тут.
    Симптомы были как в сабже. В списке приложений использующих микрофон были svchost / rundll32

    5f249b370b594471681199.jpeg
    Ответ написан
    1 комментарий
  • Почему все говорят что писать ботов это сложно?

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

    Нужно сделать несколько под-команд у команды. Напишу цепочку if-elif-else, делов то. Ой, а теперь простыня кода на пять экранов, в которой фиг чего найдёшь. Потому что нет привычки структурировать код.

    Нужно, чтобы несколько команд/событий формировали цепочку (сценарий). Например, пользователь отправил тре сообщения, первое с именем, второе с возрастом, третье с адресом. Ой, а как это сделать вообще? Не зная понятия "конечный автомат" (finite state machine, FSM), очень трудно догадаться, как тут поступить.

    Нужно, чтобы ботом могли пользоваться несколько человек. Ой, их данные перепутались! Потому что бот использует глобальные переменные.

    Нужно, чтобы бот выполнил длительную задачу, и написал сообщение, когда она выполнится. Не вопрос, напишу функцию, вызову её, а сразу после отправлю сообщение. Ой, а бот не отвечает! Потому что рабочий цикл asyncio занят этой длительной операцией и не может отреагировать на поступающие данные. Нужно иметь хорошее представление о том, как работает асинхронная программа.

    Нужно добавить боту графический интерфейс - админку. Ой, а работает или интерфейс, или сам бот! Потому что нужно представлять, как устроено большинство GUI-фреймворков, и как устроена асинхронное приложение. А заодно понимать многопоточность, вопросы синхронизации действий между двумя потоками, и особенности работы с asyncio в многопоточных приложениях. Потому что одним потоком тут обойтись будет очень непросто.

    Нужно хранить данные в БД. Ой, а почему у меня проблемы при записи в БД имени пользователя? А потому что погромист собирает SQL-запрос через форматирование строк. Надо было почитать доки, чтобы наткнуться на prepared statements, они же parameterized queries.

    Нужно хранить данные в БД. Вот только данные имеют связи многие-ко-многим. Я знаю! Я буду просто добавлять или удалять столбцы в таблицу! Потому что не освоены даже азы проектирования БД. Тут уже nuff said. И да, я такое видел на этом сайте.

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

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты неверно понимаешь логику своей программы.
    Если у тебя не найдётся 1.png, вылетит исключение, и даже не будут попытки искать дальнейшие картинки - управление перейдёт в except, а затем на новую итерацию while True, где снова будет попытка искать 1.png.

    Есть и ещё ряд замечаний.
    1. На кой баклажан ты загружаешь 1.png-5.png на каждой итерации цикла? Только зря программу замедляешь. Если ты не хочешь обновлять эти файлы без перезапуска программы, то загрузи их один раз на старте.
    2. То же самое со скриншотом. Ты делаешь новый скриншот перед каждым следующим файлом - это точно хорошая идея? Вроде как надо поискать изображения на скриншоте, и только потом делать следующий.
    3. Почему ты используешь И locateOnScreen(), И matchTemplate()? Выбери ту функцию, которая лучше работает, и используй только её.
    4. Ты нифига не отслеживаешь, а что за исключение-то вылетает? Может, у тебя программа в принципе кривая, и дело не в том, что изображение не найдено. Для locateOnScreen() лови конкретно pyautogui.ImageNotFoundException. matchTemplate() исключений не кидает, так что проверяй, что locations не пуст, а имеет хотя бы один элемент. А остальные эксепшены не лови, или хотя бы выводи инфу о них в журнал работы программы.
    Ответ написан
    8 комментариев
  • Что я делаю не так Python?

    frumkin
    @frumkin
    Садовод на удаленке
    Если вы делали установку из командной строки, повторите команду еще раз и добавьте в нее AssociateFiles=1.
    Ответ написан
    Комментировать
  • Что я делаю не так Python?

    Vindicar
    @Vindicar
    RTFM!
    При установке питона обрати внимание на галочку py launcher.
    Ответ написан
    Комментировать
  • Что я делаю не так Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    знатоки, которые подскажут, что я забыл

    Вы забыли изучить особенности работы вашей операционной системы с типами файлов.
    Вам нужно прописать ассоциацию *.py файлов с python.
    Однако в любом случае это странный способ запускать питоновские скрипты. Обычно это делают в консоли через venv.
    Но так как вы хотите тоже можно, конечно. Для очень специфических нужд...
    Гуглите, короче, как прописывать ассоциации файлов в вашей системе.
    Я в винде ничего не делал уже лет 10, не помню где там оно.
    Ответ написан
    Комментировать
  • Как вычислить количество записей?

    Vindicar
    @Vindicar
    RTFM!
    Прочитать все записи, разбить строку по разделителю, скормить всё в collections.Counter.
    С pandas не работал, вот пример для списков:
    from collections import Counter
    from itertools import chain
    data = [
      (1, 'old;white'),
      (2, 'old;green'),
      (3, 'old;brown'),
      (4, 'new;green'),
    ]
    # генерирует последовательность ['old', 'white'], ['old', 'green'], ...
    split_generator = (item[1].split(';') for item in data) 
    # генерирует последовательность 'old', 'white', 'old', 'green', ...
    property_generator = chain.from_iterable(split_generator)
    # исправляет регистр и удаляет пробелы - можно убрать, если не надо
    property_fixed_generator = (item.strip().lower() for item in property_generator)
    # поглощает данные из генераторов и считает вхождения
    count = Counter(property_fixed_generator)
    print(count)  # Counter({'old': 3, 'green': 2, 'white': 1, 'brown': 1, 'new': 1})
    Ответ написан
    Комментировать
  • Как определить размер и координаты любого окна python?

    Vindicar
    @Vindicar
    RTFM!
    Ответ для винды - с линуксовыми оконными менеджерами я дела не имел.
    Можно посмотреть на видимый заголовок окна или на т.н. строку класса окна. Возможно, pyautogui или pywinauto могут найти окна по заголовку.
    Более сложные и надёжные решения требуют работы с WinAPI: в принципе можно найти окна, принадлежащие процессу с заданным экзешником, уточнить через заголовок/класс окна, а дальше получить их позицию.
    Проблема в том, что до WinAPI надо достукиваться через модуль ctypes, а значит, нужно уметь не только Питон, но и хотя бы основы C или C++. Я могу описать этот вариант подробнее, если захочешь связываться с этой канителью.
    Ответ написан
    Комментировать
  • Как выводить цифры числа слева направо?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно делать накопление числа в строку а потом в конце перевернуть ее

    >>> "".join(reversed("улыбок тебе дед макар"))
    Ответ написан
    1 комментарий
  • Как сделать очередь из нескольких таймеров, каждый из которых должен исполнять свой собственный файл на Python?

    @madsaint7
    import threading
    import time
    
    def task1():
        print("Выполнение задачи 1")
        # Вместо print() можно вызвать свой скрипт:
        # subprocess.run(["python", "script1.py"])
    
    def task2():
        print("Выполнение задачи 2")
        # subprocess.run(["python", "script2.py"])
    
    def task3():
        print("Выполнение задачи 3")
        # subprocess.run(["python", "script3.py"])
    
    def timer_task(interval, task_func):
        while True:
            task_func()
            time.sleep(interval)
    
    # Создание и запуск потоков для каждой задачи
    thread1 = threading.Thread(target=timer_task, args=(10, task1))  # Задача 1 каждые 10 секунд
    thread2 = threading.Thread(target=timer_task, args=(20, task2))  # Задача 2 каждые 20 секунд
    thread3 = threading.Thread(target=timer_task, args=(30, task3))  # Задача 3 каждые 30 секунд
    
    # Запуск потоков
    thread1.start()
    thread2.start()
    thread3.start()
    
    # Ожидание завершения потоков (если нужно)
    thread1.join()
    thread2.join()
    thread3.join()
    Ответ написан
    Комментировать
  • Как вывести полученные данные из таблицы sql?

    Vindicar
    @Vindicar
    RTFM!
    Правильно будет:
    import sqlite3 
    
    with sqlite3.connect(r'D:\Programming\Python\base.db') as db:
        cursor = db.cursor()
        request = """ SELECT name FROM marks WHERE mark = 4 """  # выбираем один столбец
        cursor.execute(request)  # выполняем запрос на курсоре - зря, что ли, мы его создали?
        # теперь у нас курсор содержит строки выдачи - ответ на запрос
        for row in cursor:  # row - это кортеж, где элементы идут в том же порядке, что и столбцы
            name = row[0]  # у нас один элемент - столбец name. Добываем его.
            print(name)  # а дальше делаем с этим элементом что захотим
    Ответ написан
    Комментировать
  • Как сделать очередь из нескольких таймеров, каждый из которых должен исполнять свой собственный файл на Python?

    Vindicar
    @Vindicar
    RTFM!
    Под виндой есть штатный Планировщик заданий, который умеет примерно то же что и крон, но настраивается через GUI.

    Если ОЧЕНЬ надо - делаешь свой планировщик на базе пакета schedule, только не забудь запустить скрипты в дочернем процессе, например, через subprocess. Но я бы не изобретал велосипед.
    Ответ написан
    1 комментарий
  • Как сделать очередь из нескольких таймеров, каждый из которых должен исполнять свой собственный файл на Python?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    самый простой вариант воспользоваться кроном (cron)
    Штатный механизм запуска задач в юниксе.

    почитай о формате планирования. сейчас у Вас простой вариант запускать каждый час / каждые три часа
    */1 */3 в поле часов
    Пропиши вместо этого запускать со сдвигом и возможно тебе они не нужны круглосуточно
    9-23/1
    И в поле минут поставь разные значения например 13 и 27
    https://firstvds.ru/technology/cron-zapusk-program...
    Ответ написан
    Комментировать