Как добавить приложение в трей python
Я просто хочу, чтобы Telegram запускался, и я добавил его в автозагрузку приложений. Дело в том, что мне нужно, чтобы это было минимизировано. Любые команды?
Запуск приложения свернут
Минимизированный запуск приложения требует двух команд:
- запуск приложения
- свернуть свое окно
Следовательно, команда или скрипт должны быть "умными"; вторая команда должна дождаться фактического появления окна приложения.
Общее решение для запуска приложения сведено к минимуму
Сценарий ниже делает это и может использоваться в качестве общего решения для запуска приложения в минимизированном виде. Просто запустите его в синтаксисе:
Сценарий
Как пользоваться
Скрипт нуждается в обоих wmctrl а также xdotool :
-
Скопируйте скрипт в пустой файл, сохраните его как startup_minimizd.py
Протестируйте скрипт с помощью (например) gedit команда:
объяснение
- Сценарий запускает приложение, выполняя команду, которую вы дали в качестве первого аргумента.
- Затем скрипт проверяет список окон (с помощью wmctrl ) для окон, названный в честь вашего второго аргумента.
- Если окно появляется, оно немедленно сворачивается с помощью xdotool Чтобы предотвратить бесконечный цикл, если окно может не появиться по какой-либо причине, сценарий устанавливает ограничение времени 30 секунд для отображения окна.
Заметка
Не нужно упоминать, что вы можете использовать скрипт для нескольких приложений одновременно, так как вы запускаете его с аргументами вне скрипта.
РЕДАКТИРОВАТЬ
узнав окно по пиду
Если заголовок окна является неопределенным или переменным, или существует риск столкновения имен в имени окна, используя pid это более надежный метод для использования.
Сценарий ниже основан на использовании pid приложения, как в выводе обоих wmctrl -lp а также ps -ef ,
Настройка почти такая же, но заголовок окна в этой версии не нужен, поэтому команда для его запуска:
Так же, как и первый скрипт wmctrl а также xdotool
Сценарий
Обратите внимание на второй сценарий
Хотя в общем случае вторая версия должна быть более надежной, в случаях, когда приложение запускается сценарием-оболочкой, pid команды будет отличаться от приложения, которое окончательно вызывается.
В таких случаях я рекомендую использовать первый скрипт.
EDIT2 конкретная версия скрипта для Steam
Как указано в комментарии, ниже версия, специально сделанная для запуска STEAM, свернута.
Почему конкретная версия для Steam?
Оказывается Steam ведет себя совершенно иначе, чем "нормальное" приложение:
Это исключительное поведение Steam запрашивает специальную версию скрипта, которая добавлена ниже. Скрипт запускается Steam и в течение 12 секунд отслеживает все новые окна соответствующих WM_CLASS , проверяя, минимизированы ли они. Если нет, сценарий гарантирует, что они будут.
Как и оригинальный скрипт, этот нужен wmctrl а также xdotool быть установленным.
Сценарий
Использовать его
-
Просто скопируйте его в пустой файл, сохраните как runsteam_minimized.py
Запустите его командой:
Хорошо иметь сценарии, предоставленные user72216 и Sergey, в качестве общих решений проблемы, но иногда приложение, которое вы хотите минимизировать при запуске, уже имеет переключатель, который будет делать то, что вы хотите.
Вот несколько примеров с соответствующими строками команд запуска программы:
- Telegram (начиная с версии 0.7.10) имеет -startintray опция: <path-to-Telegram>/Telegram -startintray
- Steam имеет -silent опция: /usr/bin/steam %U -silent
- Коробка передач имеет --minimized опция: /usr/bin/transmission-gtk --minimized
В Unity эти приложения начинают сворачиваться в виде значков в верхней строке меню, а не значков на панели запуска, хотя значок обычного запуска все равно будет отображаться после запуска приложения. Другие приложения могут вести себя по-другому.
Если программа закрывается в трей, можно на самом деле захотеть закрыть окно программы при запуске, а не сворачивать его. Одним из примеров такой программы является Viber. В этом случае можно использовать следующий скрипт start_closed.sh :
Использование: <path-to-script> <program-to-start>
Я взял сценарии Джейкоба и немного изменил их, чтобы сделать более универсальным.
- Программа устанавливает идентификатор группы (GID) для процесса. Таким образом, все дочерние процессы и их окна могут быть легко найдены
- Параметр xdotool --sync используется вместо цикла while
- Скрипт позволяет передавать аргументы программе
Значение WAIT_TIME должно быть достаточно большим, чтобы программа могла форкнуть свои дочерние процессы. На моем компьютере достаточно больших программ, таких как steam. Увеличьте его, если необходимо.
прибавление
xdotool вариант windowunmap может работать в стиле фанк с некоторыми приложениями и программами в трее (например, в linux mint's tray), поэтому вот альтернативная версия скрипта для этих исключений.
Я просто занимался серфингом и столкнулся с этим вопросом, так что мне было просто интересно, какая у вас операционная система? Что касается меня, я использую UBUNTU BUDGIE 18.04 LTS, поэтому в этой операционной системе это очень просто.
Просто зайдите в меню
Из меню перейдите в настройки рабочего стола Budgie.
От настройки рабочего стола перейдите к автозапуску
Это даст вам 2 варианта, от "+" добавить
1. Добавить приложение
2. Добавить команду
При выборе " Добавить приложение" будут перечислены все приложения, выберите любое приложение, которое вы хотите, и оно запустится при запуске компьютера, а также будет свернуто.
Мне нужно было, чтобы программы были закрыты в трей, а не свернуты, и я перепробовал все скрипты, которые выложены здесь, те, которые работали, работали только для одних программ, а не для других. Итак, я написал код, который работает намного лучше (вы почти не видите появления окна, только значок в трее, он выглядит нативно) и работает для всех программ, которые я пробовал. Он основан на Джейкобе. С этим сценарием вам может потребоваться добавить аргумент в зависимости от программы (см. Ниже), но он всегда работал для меня со многими программами, он также должен работать с Steam.
Использование:
- sudo apt-get install wmctrl xdotool
- Сохранить скрипт как startup_closed.py дать ему разрешение на выполнение, а затем выполнить python3 ./startup_closed.py -c <command to open program>
- Если значок на панели задач не отображается или окно не отображается, необходимо добавить один из следующих аргументов: -splash или же -hide , методом проб и ошибок. Например: python3 ./startup_closed.py -hide -c teamviewer или же python3 ./startup_closed.py -splash -c slack
- Есть больше аргументов, но вы, вероятно, не нуждаетесь в них. Также есть полная информация о том, когда и зачем нужны аргументы в справке: ./startup_closed.py --help
Авторсценария:
Я пришел с довольно элегантным решением, которое опирается исключительно на xdotool и это весьма полезно для приложений, которые не имеют аргумента "минимизировать начало", таких как Telegram.
Единственным недостатком является то, что решение должно быть вручную создано для каждого приложения, но при условии, что это не проблема (например: если вы хотите автоматически запустить определенное приложение, не позволяя ему загрязнять экран после входа в систему), это намного проще и понятнее.,
Актуальные примеры
Решение
На первый взгляд, вы можете подумать, что лучше использовать PID или класс процесса для сопоставления, однако это на самом деле контрпродуктивно, поскольку вы часто получаете несколько результатов для одного и того же PID. Примерами являются окно 0x0, которое на самом деле ожидает уведомления, значок системного окна или любое другое "скрытое" окно.
Решением является создание команды xdotool, которая всегда возвращает только одно уникальное окно. В обоих моих примерах это было сделано с помощью --name Однако вы можете комбинировать несколько селекторов с --all (например: сопоставить заданное имя класса + имя класса + регулярное выражение имени). Обычно хороший --name регулярное выражение делает свое дело.
После создания вашего search просто создайте экземпляр xdotool (отсоединенный от оболочки) с помощью --sync параметр и ваши условия, а затем windowclose , Запустите ваше приложение потом:
Проверять, выписываться xdotool search --help для всех возможных комбинаций вы можете настроить таргетинг на нужное окно. Иногда это становится сложным, и вам приходится комбинировать несколько условий, но, как только вы закончите, он редко будет терпеть неудачу (если, конечно, обновление не изменит приложение и не нарушит вашу реализацию, конечно).
Эта статья посвящена теме, на вопросы по которой я часто натыкаюсь. С помощью wxPython реализовать возможность сворачивания вашего приложения в трей достаточно просто. Мы начнём с того, что разберёмся с кодом, создающим TaskBarIcon, а затем перейдём к созданию простого приложения, которое можно будет свернуть в системный трей.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Создаём простую иконку панели задач
Создать иконку панели задач с помощью wxPython очень просто, особенно, если у вас уже есть готовый файл иконки. Давайте взглянем на один простой способ:
self . Bind ( wx . EVT_TASKBAR_LEFT_DOWN , self . OnTaskBarLeftClick ) Уничтожает иконку панели задач и рамку в самой иконке панели задач Создаёт меню, появляющееся при нажатии правой кнопки мышиКак вы видите, всё что нам нужно это указать путь к файлу иконки в wx.Icon, а затем сообщить о том, какой тип файла мы ему передали. Затем мы просто вызываем метод **SetIcon() в wx.TaskBarIcon, чтобы установить иконку. Если у вас нет файла иконки, то вы можете воспользоваться альтернативным методом, чтобы создать его из файла изображения другого типа:
В данном случае мы проделываем несколько операций, чтобы превратить PNG-изображение в формат, который смогут использовать методы wxPython. Вы заметите, что мы биндим EVT_TASKBAR_LEFT_DOWN, так что когда пользователь нажмёт на иконку, то приложение развернётся.
Примечание: Как я уже упоминал в прошлой статье, нам нужно будет обновить этот код, если вы собираете использовать его в wxPython Phoenix, так как класс TaskBarIcon был перемещён в wx.adv. Если вы используете wxPython Phoenix, то код должен выглядеть вот так:
self . Bind ( wx . adv . EVT_TASKBAR_LEFT_DOWN , self . OnTaskBarLeftClick ) Уничтожает иконку панели задач и рамку в самой иконке панели задач Создаёт меню, которое появляется при нажатии правой кнопки мыши.Теперь у вас есть примеры обеих вариантов кода. Давайте же теперь перейдём к самому приложению, которое будет сворачиваться!
Делаем так, чтобы приложение сворачивалось в трей
Теперь мы готовы к тому, чтобы создать приложение, которое будет сворачиваться в трей. Давайте напишем немного кода:
wx . Frame . __init__ ( self , None , title = "Minimize to Tray" ) Во время сворачивания, делаем так, чтобы приложение оставило иконку в трееЗдесь мы биндим два события. Первое для EVT_CLOSE и второе для EVT_ICONIZE. Второе запускается, когда пользователь сворачивает приложение, чтобы поместить иконку в трей: проще говоря, оно просто прячет рамку. Первое же запускается, когда вы закрываете приложение, и вот на этот момент стоит обратить внимание.
Почему? Так, вам нужно отследить событие, отвечающее за закрытие, если пользователь пытается закрыть приложение, используя иконку в трее. И вам нужно быть уверенным, что вы удалили иконку И уничтожили её, или же ваше приложение не закроется, а просто будет висеть среди фоновых процессов.
Итоги
Теперь вы знаете как свернуть ваше приложение до иконки в системном трее. Я использовал данную возможность в простой программе для проверки электронной почты. У данного навыка есть масса сфер применения, например, проверка состояния выполнения задачи в приложении, свёрнутом в трей.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
И программа работает. Но есть вопрос, Можно ли обойтись без подключения библиотеки PIL. Т.к. при упаковывании программы в pyinstaller, программа раздувается на лишние 12 Мб. Т.е. если не реализовывать функцию сворачивания, программа весит 12 Мб. Как только подключаем PIL размер увеличивается до 25 Мб.
Я думал, что можно заменить Image.open другими средствами, но не мог найти.
Что я делал:
1. Я перевел иконку в строку base64, и пробовал переписать функцию так:
И она тоже работает, но все равно требует PIL
2. Пробовал с помощью плагина pickle перевести Image.open('test.ico') в строку байт.
Получал строку типа b'ccopy_reg\n_reconstructor\np0\n(cPIL.IcoImagePlugin\nIcoIm ageFile\np1\nc__builtin__\nobject\n . '
далее я подставлял строку прямо в объект Icon
И программа работала. И не требовалось подключать PIL. Но только из среды разработки. Как только упаковывалась pyinstaller, прекращала запускаться. Похоже PIL сам подключался при вызове из интерпретатора. Кстати при упаковывании она весила те же 12 Мб.
Подскажите как еще можно обойти подключение PIL? Ведь иконка это поток байтов. Как его еще можно подставить при вызове Icon?
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
Создание иконки программно + установка в трей
Привет всем! Мне необходимо на иконке нарисовать 2 цифры (00-99) и установить иконку в нотифи Как.
Как правильно свернуть в трей при нажатии иконки minimize?
Именно как правильно? Потому что, если делать это в событии OnWindowStateChange следующим образом .
Поместить иконку программы в трей на MacOS (не Dock, а именно трей - сверху справа)
Доброго времени суток. Хотелось бы узнать как написать на Objective C следующее: в трее должна.
Не работает с создание своей иконки программы с GraphABC
Хочу создать иконку для программы, в которой подключен GraphABC. Делаю все как обычно - беру .rc и.
Решение
Про поток ничего сказать не могу. У pystray очень скудная документация.
Читал примеры по pystray, но во всех примерах используется pil для создания иконки.
Почему нельзя использовать средства tkinter, например PhotoImage, я понять не могу.
И еще, pil и pyistaller как я понял не понимают друг друга, поэтому возникает ошибка.
При компиляции через Nuitka приложение раздувается до 90 МБ, что для меня еще более недопустимо.
pystray.Icon() - что требует во втором параметре? Если не по ощущениям, а по документации?
Добавлено через 3 минуты
А, ну я уже сам вижу:
Ещё есть вариант сэмулировать PIL.Image, но это для настоящих извращенцев.
При запуске программы сразу помещать в трей
Я написал программу она у меня сворачиваеться в трей, а подскажите как сделать так что бы когда.
Сворачивание программы в трей при нажатии на button
Интересует, как реализовать в wpf сворачивание программы в трей при нажатии на какую-либо button.
Как сделать чтоб при запуске программы она сразу в трей сворачивалась?
использую компонент CoolTrayIcon ставлю в событие FormCreate фун-ю CoolTrayIcon1.HideMainForm; но.
Подвисает удаленный рабочий стол при свертывании/развертывании
Удаленный рабочий стол подвисает при развертывании, секунд так на 8. Причем на других компах при.
Считается, что Python не лучший выбор для десктопных приложений. Однако, когда в 2016 году я собирался переходить от разработки сайтов к программному обеспечению, Google подсказал мне, что на Python можно создавать сложные современные приложения. Например blender3d, который написан на Python.
Но люди, не по своей вине используют уродливые примеры графического интерфейса, которые выглядят слишком старыми, и не понравятся молодёжи. Я надеюсь изменить это мнение в своем туториале. Давайте начнём.
Мы будем использовать PyQt (произносится «Пай-Кьют»). Это фреймворк Qt, портированный с C++. Qt известен тем, что необходим C++ разработчикам. С помощью этого фреймворка сделаны blender3d, Tableau, Telegram, Anaconda Navigator, Ipython, Jupyter Notebook, VirtualBox, VLC и другие. Мы будем использовать его вместо удручающего Tkinter.
Требования
- Вы должны знать основы Python
- Вы должны знать, как устанавливать пакеты и библиотеки с помощью pip.
- У вас должен быть установлен Python.
Установка
Вам нужно установить только PyQt. Откройте терминал и введите команду:
Мы будем использовать PyQt версии 5.15. Дождитесь окончания установки, это займёт пару минут.
Hello, World!
Создайте папку с проектом, мы назовём его helloApp. Откройте файл main.py, лучше сделать это vscode, и введите следующий код:
Этот код вызывает QGuiApplication и QQmlApplicationEngine которые используют Qml вместо QtWidget в качестве UI слоя в Qt приложении. Затем, мы присоединяем UI функцию выхода к главной функции выхода приложения. Теперь они оба закроются одновременно, когда пользователь нажмёт выход. Затем, загружаем qml файл для Qml UI. Вызов app.exec(), запускает приложение, он находится внутри sys.exit, потому что возвращает код выхода, который передается в sys.exit.
Добавьте этот код в main.qml:
Этот код создает окно, делает его видимым, с указанными размерами и заголовком. Объект Text отображается в середине окна.
PricewaterhouseCoopers , Удалённо , По итогам собеседования
Теперь давайте запустим приложение:
Вы увидите такое окно:
Обновление UI
Давайте немного обновим UI, добавим фоновое изображение и время:
Внутри типа ApplicationWindow находится содержимое окна, тип Rectangle заполняет пространство окна. Внутри него находится тип Image и другой прозрачный Rectangle который отобразится поверх изображения.
Если сейчас запустить приложение, то текст появится в левом верхнем углу. Но нам нужен левый нижний угол, поэтому используем отступы:
После запуска вы увидите следующее:
Показываем текущее время
Модуль gmtime позволяет использовать структуру со временем, а strftime даёт возможность преобразовать её в строку. Импортируем их:
Теперь мы можем получить строку с текущим временем:
Строка "%H:%M:%S" означает, что мы получим время в 24 часовом формате, с часами минутами и секундами (подробнее о strtime).
Давайте создадим property в qml файле, для хранения времени. Мы назовём его currTime.
Теперь заменим текст нашей переменной:
Теперь, передадим переменную curr_time из pyhton в qml:
Это один из способов передачи информации из Python в UI.
Запустите приложение и вы увидите текущее время.
Обновление времени
Для того чтобы обновлять время, нам нужно использовать потоки. Для этого я предлагаю использовать сигналы.
Чтобы использовать сигналы нам нужен подкласс QObject. Назовём его Backend.
У нас уже имеется свойства для строки со временем curr_time, теперь создадим свойство backend типа QtObject в файле main.qml.
Передадим данные из Python в qml:
В qml файле один объект QtObject может получать несколько функций (называемых сигналами) из Python.
Создадим тип Connections и укажем backend в его target. Теперь внутри этого типа может быть столько функций, сколько нам необходимо получить в backend.
Таким образом мы свяжем qml и сигналы из Python.
Мы используем потоки, для того чтобы обеспечить своевременное обновление UI. Создадим две функции, одну для управления потоками, а вторую для выполнения действий. Хорошая практика использовать в названии одной из функций _.
Создадим pyqtsignal и назовём его updated, затем вызовем его из функции updater.
Теперь нам осталось вызвать функцию updater. В нашем небольшом приложении, использовать отдельную функцию для вызова сигнала не обязательно. Но это рекомендуется делать в больших программах. Изменим задержку на одну десятую секунды.
Функция bootUp должна быть вызвана сразу же после загрузки UI:
Всё готово
Теперь можно запустить программу. Время будет обновляться корректно. Для того, чтобы убрать рамку, вы можете добавить в qml файл следующую строку:
Так должен выглядеть файл main.py:
Вот содержимое файла main.qml:
Сборка приложения
Для сборки десктопного приложения на Python нам понадобится pyinstaller.
Чтобы в сборку добавились все необходимые ресурсы, создадим файл spec:
Настройки файла spec
Параметр datas можно использовать для того, чтобы включить файл в приложение. Это список кортежей, каждый из которых обязательно должен иметь target path(откуда брать файлы) и destination path(где будет находится приложение). destination path должен быть относительным. Чтобы расположить все ресурсы в одной папке с exe-файлами используйте пустую строку.
Измените параметр datas, на путь к вашей папке с UI:
Параметр console установим в false, потому что у нас не консольное приложение.
Параметр name внутри вызова Exe, это имя исполняемого файла. name внутри вызова Collect, это имя папки в которой появится готовое приложение. Имена создаются на основании файла для которого мы создали spec — main.py.
Теперь можно запустить сборку:
В папке dist появится папка main. Для запуска программы достаточно запустить файл main.exe.
Так будет выглядеть содержимое папки с десктопным приложением на Python:
О том, как использовать Qt Designer для создания UI приложений на Python читайте в нашей статье.
Читайте также: