Я изучаю, как использовать gtk уведомления, и кажется, что любой выходной дисплей через пузырь уведомления имеет максимальный водосливный размер, вероятно, 10 строк или около этого. Так, если сообщение, которое я хочу показать, является больше, чем которые, оно подавлено. Там каким-либо путем является к принудительному отображению все сообщение ни с чем подавляемым?
Я использую notifyOSD, между прочим.
Я опубликовал это некоторое время назад на (сейчас) удаленном Q/A. Возможно, это полезно для вас.
Патч, приведённый ниже, позволит вам получать уведомления столько, сколько требуется на вашем рабочем столе:
В случае (очень) длинных уведомлений, вместо этого:
вы увидите следующее:
Длительность сообщения автоматически устанавливается в размере длины текста.
notify-osd
(notify-send
), ограничиваются примерно 120 символами. dbus-монитор
. Если сообщение превышает 120 символов, оно принимает сообщения и использует "свое" окно сообщений для отображения уведомления, как показано выше.
Настройка существует из двух разделов; de "listen-" скрипт, который перехватывает уведомления:
#!/bin/bash
currdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )".
dbus-монитор "interface='org.freedesktop.Notifications'". |\
grep --line-буферизованная "строка" |\
grep --line-buffered -e method -e ":" -e '"" -e urgency -e notify -v |\.
grep --line-буферизованная '.*(?=string)|(?<=string).*' -oPi |\.
grep --line-buffered -v '^\s*$' |\
... я '{}' $currdir/message.
Скопируйте скрипт в пустой файл и сохраните его как catch_notifs.sh
Скрипт, создающий замену - уведомления:
#!/usr/bin/env python3
подпроцесс импорта
импортные оs
импортный гигант
gi.require_version('Gtk', '3.0')
из импорта gi.repository GObject, Gtk, Gdk, Pango.
от импорта резьбы Нить
время импорта
импортные системы
text = sys.argv[1]
длина = len(текст)
время показа = длина/20
def get_screen():
scr = [s.split("x") для s в subprocess.check_output([[].
"xrandr"]).decode("utf-8").split() if "+0+0" in s][0].
return int(scr[0]) -450
класс Splash(Gtk.Window):
Def __init__(self):
Gtk.Window.__init__(self, title="splashtitle"))
maingrid = Gtk.Grid()
self.add(maingrid)
maingrid.set_border_width(20)
метка = Gtk.Label(текст)
label.set_line_wrap(True)
label.set_max_width_chars(45)
label.modify_font(Pango.FontDescription('Ubuntu 11'))
maingrid.attach(этикетка, 0, 0, 1, 1)
self.stop = Thread(target=self.close_window)
self.stop.start()
def close_window(self):
time.sleep(showtime)
Gtk.main_quit()
def splashwindow():
window = Splash()
window.set_decorated(False)
window.set_resizable(False)
window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,0,1)))
window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("белый"))
# window.set_opacity(0.8)
window.move(get_screen(), 80)
window.set_keep_above(True)
window.show_all()
window.set_default_size(200, 500)
GObject.threads_init()
Gtk.main()
если len(text) > 120:
подпроцесс.Popen(["pkill", "notify-osd"]).
splashwindow()
Скопируйте вышеуказанный сценарий в пустой файл, сохраните его как (точно!) сообщение
(без расширения) и сделайте исполняемым.
Test-. выполнить скрипт командой (из терминального окна):
/bin/bash /path/to/catch_notifs.sh
(продолжайте работать)
Вы можете протестировать установку, запустив (в другом терминале):
notify-send '".
Если все работает нормально, добавьте его в Приложения для запуска: Тире > Запуск приложений > Добавить. Добавить команду:
/bin/bash /path/to/catch_notifs.sh
И она должна работать :)
Как я отметил в комментариях, notify-osd
не очень подходит для обширных сообщений, и вместо этого следует предпочесть zenity
. Простой пример использования - диалог порождения zenity
через subprocess.call([КОМАНДА, ВАРИАНТЫ])
import subprocess
text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
command=['zenity', '--info', '--text="' +text + '"', '--width=250', '--height=300' ]
subprocess.call(command)
Очень простой пример. С помощью чего-то, что требует проверки статуса выхода, например, вопросы, вы можете захотеть использовать try - except - else
structure
import subprocess
text='Do you want to use Zenity?'
command=['zenity', '--question',
'--text="' +text + '"',
'--width=250', '--height=300' ]
try:
stdout = subprocess.check_call(command)
except subprocess.CalledProcessError:
pass # if return sttus is non-zero, do something here
else:
# if exit status was 0 , we do something here
print "Yes, I want to use Zenity too"
Если вы хотите что-то более продвинутое, вероятно, рассмотрите возможность изучения одного из графических инструментов, таких как PyQt или Gtk.