Всем доброго времени суток. Давайте поговорим сегодня о простой, но далеко не самой очевидной вещи, которая не лежит не виду, а когда с ней сталкиваешься, приходиться некоторое время гуглить информацию. О всплывающих сообщениях. Ведь порою в скриптах нужно отображать информацию не только в консоли. А если приложение имеет еще и пользовательский интерфейс, то сообщения, конечно же, лучше выводить без ее использования.
Что потребуется?
Тут все зависит от операционной системы и способа, которым вы выберете выводить сообщение. Если операционная система Linux, то здесь может не потребоваться ничего, так как будет использоваться функция операционной системы. А можно установить специальную библиотеку notify2. Установка происходит через терминал с помощью команды pip:
А дальше импортируем в скрипт.
Всплывающие сообщения в Linux
Давайте посмотрим, какие сообщения можно вывести с помощью данной библиотеки, и с какими небольшими «подводными камнями» я столкнулся при ее использовании.
Первая переменная здесь – это просто путь до иконки, который будет выводиться в сообщении. Дальше инициализируем соединение d-bus. Это механизм, с помощью которого процессы взаимодействуют друг с другом и который используют программы в Linux. А потому, нужно подключиться через d-bus к процессу, который управляет системным интерфейсом и передать ему такие параметры, как значок, заголовок и текст сообщения.
Далее создаем объект уведомлений, в который передаем сообщение и его иконку. И, если в этом есть необходимость, можно установить уровень срочности сообщения, у которого их целых три: URGENCY_LOW, URGENCY_CRITICAL, URGENCY_NORMAL. Ну и с помощью метода show() показываем сообщение.
Вот в принципе и все. Казалось бы, какие тут могут быть «камни»? Но, я попытался запустить данный код в Kali. И о чудо, я получил ошибку, которая гласила, что d-bus не установлен в системе. Оказывается, бывает и такое. Тогда я сделал обработку ошибки и вывел сообщение уже более простым способом:
где command – это собственно команда и сообщение. А system эту команду исполняет. В итоге, получилась небольшая функция, которую я назвал linux_notify(text), на входе принимающая текст сообщения:
Всплывающие сообщение в Windows
Ну и после этого я подумал, а не поискать ли мне простые способы отображения всплывающих сообщений и в Windows. Подумал, поискал и вот, что нашел. Для начала - win10toast. Устанавливаем в терминале. Тут все стандартно:
Затем импортируем в скрипт:
и уже можно с ней работать.
Итак. Первый параметр, это заголовок сообщения. Второй, само сообщение. Третий – путь к иконке. Я нашел в недрах винды что-то более-менее подходящее. Не факт, что есть на других машинах, но в теории должно быть, так то. Параметр duration отвечает за количество секунд, которые будет отображаться сообщение. Ну и threaded. Забавный параметр, который обязательно включить, если вы сделали пользовательский интерфейс в PyQt. Иначе, после вывода сообщения окно программы у вас будет просто закрываться. Насколько я понял, это потоковый параметр, который ждет завершения работы уведомления. Это был первый способ.
Второй способ немного проще. Устанавливаем библиотеку plyer:
и импортируем ее в скрипт:
А затем пишем простой код:
И все. Сообщение готово. Первый параметр тут текст сообщения. Второй – путь к иконке. И все работает. Причем в любых приложениях на винде. Хоть консольных, хоть с пользовательским интерфейсом.
Такие вот способы, которые более-менее позволяют вывести сообщение в Linux и Windows. Без сомнения, есть и другие, более сложные способы. Но, чтобы не лезть в дебри, а просто вывести сообщение, этих способов будет достаточно. И я оформил все в небольшой код. Который, в общем-то, не обязателен, но так все же приятнее и легче он читается.
А на этом все. Какой из библиотек пользоваться, решать без сомнения вам.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна
Что потребуется?
Тут все зависит от операционной системы и способа, которым вы выберете выводить сообщение. Если операционная система 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)
А на этом все. Какой из библиотек пользоваться, решать без сомнения вам.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна