Всем доброго времени суток. Давайте поговорим сегодня о простой, но далеко не самой очевидной вещи, которая не лежит не виду, а когда с ней сталкиваешься, приходиться некоторое время гуглить информацию. О всплывающих сообщениях. Ведь порою в скриптах нужно отображать информацию не только в консоли. А если приложение имеет еще и пользовательский интерфейс, то сообщения, конечно же, лучше выводить без ее использования.
Что потребуется?
Тут все зависит от операционной системы и способа, которым вы выберете выводить сообщение. Если операционная система Linux, то здесь может не потребоваться ничего, так как будет использоваться функция операционной системы. А можно установить специальную библиотеку notify2. Установка происходит через терминал с помощью команды pip:
pip install notify2
А дальше импортируем в скрипт.
import notify2
Всплывающие сообщения в Linux
Давайте посмотрим, какие сообщения можно вывести с помощью данной библиотеки, и с какими небольшими «подводными камнями» я столкнулся при ее использовании.
Python:
icon_path = "/usr/share/icons/gnome/24x24/emotes/face-laugh.png"
notify2.init(text)
mess = notify2.Notification(text, icon=icon_path)
mess.set_urgency(notify2.URGENCY_NORMAL)
mess.show()
Первая переменная здесь – это просто путь до иконки, который будет выводиться в сообщении. Дальше инициализируем соединение d-bus. Это механизм, с помощью которого процессы взаимодействуют друг с другом и который используют программы в Linux. А потому, нужно подключиться через d-bus к процессу, который управляет системным интерфейсом и передать ему такие параметры, как значок, заголовок и текст сообщения.
Далее создаем объект уведомлений, в который передаем сообщение и его иконку. И, если в этом есть необходимость, можно установить уровень срочности сообщения, у которого их целых три: URGENCY_LOW, URGENCY_CRITICAL, URGENCY_NORMAL. Ну и с помощью метода show() показываем сообщение.
Вот в принципе и все. Казалось бы, какие тут могут быть «камни»? Но, я попытался запустить данный код в Kali. И о чудо, я получил ошибку, которая гласила, что d-bus не установлен в системе. Оказывается, бывает и такое. Тогда я сделал обработку ошибки и вывел сообщение уже более простым способом:
Python:
command = f'''notify-send {text}'''
system(command)
где command – это собственно команда и сообщение. А system эту команду исполняет. В итоге, получилась небольшая функция, которую я назвал linux_notify(text), на входе принимающая текст сообщения:
Python:
def linux_notify(text):
try:
import notify2
icon_path = "/usr/share/icons/gnome/24x24/emotes/face-laugh.png"
notify2.init(text)
mess = notify2.Notification(text, icon=icon_path)
mess.set_urgency(notify2.URGENCY_NORMAL)
mess.show()
except ModuleNotFoundError:
command = f'''notify-send {text}'''
system(command)
Всплывающие сообщение в Windows
Ну и после этого я подумал, а не поискать ли мне простые способы отображения всплывающих сообщений и в Windows. Подумал, поискал и вот, что нашел. Для начала — win10toast. Устанавливаем в терминале. Тут все стандартно:
pip install win10toast
Затем импортируем в скрипт:
from win10toast import ToastNotifier
и уже можно с ней работать.
Python:
ToastNotifier().show_toast("Демо сообщение", text, icon_path=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-"
r"deviceexperience_31bf3856ad364e35_10.0.19041.746"
r"_none_251e769058968366\sync.ico",
duration=3, threaded=True)
Итак. Первый параметр, это заголовок сообщения. Второй, само сообщение. Третий – путь к иконке. Я нашел в недрах винды что-то более-менее подходящее. Не факт, что есть на других машинах, но в теории должно быть, так то. Параметр duration отвечает за количество секунд, которые будет отображаться сообщение. Ну и threaded. Забавный параметр, который обязательно включить, если вы сделали пользовательский интерфейс в PyQt. Иначе, после вывода сообщения окно программы у вас будет просто закрываться. Насколько я понял, это потоковый параметр, который ждет завершения работы уведомления. Это был первый способ.
Второй способ немного проще. Устанавливаем библиотеку plyer:
pip install plyer
и импортируем ее в скрипт:
from plyer import notification
А затем пишем простой код:
Python:
notification.notify(message=text, app_icon=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-deviceexperience_"
r"31bf3856ad364e35_10.0.19041.746_none_251e769058968366\sync.ico")
И все. Сообщение готово. Первый параметр тут текст сообщения. Второй – путь к иконке. И все работает. Причем в любых приложениях на винде. Хоть консольных, хоть с пользовательским интерфейсом.
Такие вот способы, которые более-менее позволяют вывести сообщение в Linux и Windows. Без сомнения, есть и другие, более сложные способы. Но, чтобы не лезть в дебри, а просто вывести сообщение, этих способов будет достаточно. И я оформил все в небольшой код. Который, в общем-то, не обязателен, но так все же приятнее и легче он читается.
Python:
# pip install notify2
# pip install win10toast
# pip install plyer
from platform import system as psystem
import time
from os import system
def linux_notify(text):
try:
import notify2
icon_path = "/usr/share/icons/gnome/24x24/emotes/face-laugh.png"
notify2.init(text)
mess = notify2.Notification(text, icon=icon_path)
mess.set_urgency(notify2.URGENCY_NORMAL)
mess.show()
except ModuleNotFoundError:
command = f'''notify-send {text}'''
system(command)
def windows_notify(text):
from plyer import notification
from win10toast import ToastNotifier
ToastNotifier().show_toast("Демо сообщение", text, icon_path=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-"
r"deviceexperience_31bf3856ad364e35_10.0.19041.746"
r"_none_251e769058968366\sync.ico",
duration=3, threaded=True)
time.sleep(4)
notification.notify(message=text, app_icon=r"C:\Windows\WinSxS\amd64_microsoft-windows-dxp-deviceexperience_"
r"31bf3856ad364e35_10.0.19041.746_none_251e769058968366\sync.ico")
if __name__ == "__main__":
message = input('[+] Введите текст сообщение: ')
if psystem() == "Linux":
linux_notify(message)
elif psystem() == "Windows":
windows_notify(message)
А на этом все. Какой из библиотек пользоваться, решать без сомнения вам.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна
- 1. Введение
- 2. Mac OS
- 3. Linux
- 4. Windows
- 5. Делаем скрипт кросс-платформенным
- 6. Вывод
Введение
Мы часто используем
print
что-бы проследить за состоянием скрипта, или когда занимаемся отладкой. Вместо того, что-бы постоянно смотреть в окно терминала и ждать какой-то вывод, мы можем исползовать всплывающие уведомления как способ для просмотра вывода и параллельно с этим заниматься чем-то еще.
Сделать это совсем не сложно — мы будем использовать встроенные комманды нашей операционной системы для вывода уведомлений, просто запуская их через Python. Несколько строчек кода, и никаких сторонних модулей.
Mac OS
Следующая команда запускает AppleScript (встроенный скриптовый язык компании Apple) для уведомлений.
osascript -e ‘display notification «Your message goes here» with title «Title»‘
Если вы запустите эту комманду то увидите следующий результат:
Подробнее о самом скрипте:
Итак, если вы используете Mac OS, тогда вы можете выполнить следующий Python код:
import os title = "Готово" message = "Файл скачан" command = f''' osascript -e 'display notification "{message}" with title "{title}"' ''' os.system(command)Запустив этот скрипт, вы увидите схожий результат как и выше.
Linux
Linux предлагает еще более простой вариант:
notify-send «Your message» «Title»
Аналогично тому, как мы выводили уведомление на Mac OS через os.system, так же можно поступить в Linux системе.
Windows
В Windows нет такой команды которая запускала бы уведомления как в Linux и Mac OS, но это все равно можно сделать с помощью библиотеки
win10toast
, сначала её нужно установить:
pip install win10toast
и теперь пример ее использования:import win10toast toaster = win10toast.ToastNotifier() toaster.show_toast("Заголовок", "Описание уведомления")Метод
show_toast
принимает и другие аргументы, но подробнее о них вы можете напрямую почитать — просто вызвав
help
передав ей объект функции о которой нужно узнать подробнее.Делаем скрипт кросс-платформенным
Что-бы узнать какая система стоит на вашем компьютере используется команда
system()
из встроенной библиотеки
platform
. Для Mac OS эта команда возвращает строку «Darwin», для Linux «Linux», для Windows — «Windows», теперь, зная все это, можем поместить весь код в функцию
push
. Вот что получится:import platform, os def push(title, message): plt = platform.system() if plt == "Darwin": command = ''' osascript -e 'display notification "{message}" with title "{title}"' ''' elif plt == "Linux": command = f''' notify-send "{title}" "{message}" ''' elif plt == "Windows": win10toast.ToastNotifier().show_toast(title, message) return else: return os.system(command)Вывод
В статье было показано как вывести всплывающие уведомления на Python’е, определенно это был не единственный способ. Существует достаточное количество библиотек которые выполняют подобные цели.
Распознавание голоса и речи на C#
UnmanagedCoder 05.05.2025
Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .
Реализация своих итераторов в C++
NullReferenced 05.05.2025
Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .
Разработка собственного фреймворка для тестирования в C#
UnmanagedCoder 04.05.2025
C# довольно богат готовыми решениями – NUnit, xUnit, MSTest уже давно стали своеобразными динозаврами индустрии. Однако, как и любой динозавр, они не всегда могут протиснуться в узкие коридоры. . .
Распределенная трассировка в Java с помощью OpenTelemetry
Javaican 04.05.2025
Микросервисная архитектура стала краеугольным камнем современной разработки, но вместе с ней пришла и головная боль, знакомая многим — отслеживание прохождения запросов через лабиринт взаимосвязанных. . .
Шаблоны обнаружения сервисов в Kubernetes
Mr. Docker 04.05.2025
Современные Kubernetes-инфраструктуры сталкиваются с серьёзными вызовами. Развертывание в нескольких регионах и облаках одновременно, необходимость обеспечения низкой задержки для глобально. . .
Создаем SPA на C# и Blazor
stackOverflow 04.05.2025
Мир веб-разработки за последние десять лет претерпел коллосальные изменения. Переход от традиционных многостраничных сайтов к одностраничным приложениям (Single Page Applications, SPA) — это. . .
Реализация шаблонов проектирования GoF на C++
NullReferenced 04.05.2025
«Банда четырёх» (Gang of Four или GoF) — Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — в 1994 году сформировали канон шаблонов, который выдержал проверку временем. И хотя C++ претерпел. . .
C# и сети: Сокеты, gRPC и SignalR
UnmanagedCoder 04.05.2025
Сетевые технологии не стоят на месте, а вместе с ними эволюционируют и инструменты разработки. В . NET появилось множество решений — от низкоуровневых сокетов, позволяющих управлять каждым байтом. . .
Создание микросервисов с Domain-Driven Design
ArchitectMsa 04.05.2025
Архитектура микросервисов за последние годы превратилась в мощный архитектурный подход, который позволяет разрабатывать гибкие, масштабируемые и устойчивые системы. А если добавить сюда ещё и. . .
Многопоточность в C++: Современные техники C++26
bytestream 04.05.2025
C++ долго жил по принципу «один поток — одна задача» — как старательный солдатик, выполняющий команды одну за другой. В то время, когда процессоры уже обзавелись несколькими ядрами, этот подход стал. . .
Driver name
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY
Actual version
8.15.10.1930
Date
2009-09-23
Manufacturer
Intel
Section
GPU Intel
Subsection
GPU INTEL MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY
Operating Systems
Windows 7 x86
DevID
3
Free download
Actual version
https://download-drivers-1.space/drvpr/_1N3sY8BXyt2wZWmWgfBqg/common/Intel_Corporation_Mobile_Intel_R__945_Express_Chipset_Family_Express900_8.15.10.1930.zip
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY drivers list for Windows 7 x86
Devices |
Systems |
ID |
Inf |
Link |
---|---|---|---|---|
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27A2 |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27A2 |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27A2 |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27A6 |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27A6 |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27A6 |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27AE |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27AE |
igdlh.inf | Download |
MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY 8.15.10.1930
|
Windows 7 x86 |
PCI\VEN_8086&DEV_27AE |
igdlh.inf | Download |
DEVID list for MOBILE INTEL(R) 945 EXPRESS CHIPSET FAMILY
PCI\VEN_8086&DEV_27A2
PCI\VEN_8086&DEV_27A6
PCI\VEN_8086&DEV_27AE