Переполнение сообщения в пузырь уведомления

7

Я изучаю, как использовать уведомления gtk, и кажется, что любой вывод вывода через пузырь уведомления имеет максимальный размер переполнения, вероятно, 10 строк или около того. Итак, если сообщение, которое я хочу показать, более того, оно подавляется. Есть ли способ заставить отображать все сообщение без каких-либо ограничений?

Я использую notifyOSD, кстати.

    
задан Razor 21.07.2016 в 03:05
источник

2 ответа

9

Я опубликовал это некоторое время назад (теперь) удаленный Q / A. Может быть, это вам полезно.

Патч, позволяющий (очень) длинные сообщения

«Патч» ниже позволит вам получать уведомления до тех пор, пока он занимает рабочий стол:

В случае (очень) длинных уведомлений вместо этого:

выувидитеследующее:

Продолжительностьпродолжительностисообщенияавтоматическиустанавливаетсянадлинутекста.

Чтоонделает

Уведомления,отправляемыеnotify-osd(notify-send),ограниченыок.120символов.
Решение«прослушивает»отправленныесообщения,используяdbus-monitor.Еслисообщениепревышает120символов,онопринимаетсообщенияииспользует«свое»окносообщенийдляотображенияуведомления,какпоказановыше.

Скрипты

  1. Настройкасуществуетиздвухразделов;de"listen-", который перехватывает уведомления:

    #!/bin/bash
    
    currdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    
    dbus-monitor "interface='org.freedesktop.Notifications'" |\
     grep --line-buffered "string" |\
     grep --line-buffered -e method -e ":" -e '""' -e urgency -e notify -v |\
     grep --line-buffered '.*(?=string)|(?<=string).*' -oPi |\
     grep --line-buffered -v '^\s*$' |\
     xargs -I '{}' $currdir/message {}
    

    Скопируйте сценарий в пустой файл и сохраните его как catch_notifs.sh

  2. Сценарий, создающий заменяющие уведомления:

    #!/usr/bin/env python3
    import subprocess
    import os
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import GObject, Gtk, Gdk, Pango
    from threading import Thread
    import time
    import sys
    
    text = sys.argv[1]
    length = len(text)
    showtime = length/20
    
    def get_screen():
        scr = [s.split("x") for s in subprocess.check_output([
            "xrandr"]).decode("utf-8").split() if "+0+0" in s][0]
        return int(scr[0]) -450
    
    class Splash(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="splashtitle")
            maingrid = Gtk.Grid()
            self.add(maingrid)
            maingrid.set_border_width(20)
            label = Gtk.Label(text)
            label.set_line_wrap(True)
            label.set_max_width_chars(45)
            label.modify_font(Pango.FontDescription('Ubuntu 11'))
            maingrid.attach(label, 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,1))
        window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("white"))
        # 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()
    
    if len(text) > 120:
        subprocess.Popen(["pkill", "notify-osd"])
        splashwindow()
    

    Скопируйте сценарий выше в пустой файл, сохраните его как (точно!) message (без расширения) и сделайте его выполнимым .

  3. Храните оба сценария в одном и том же каталоге .
  4. Запустите сценарий командой (из окна терминала):

    /bin/bash /path/to/catch_notifs.sh
    

    (продолжайте работать)

    Вы можете протестировать установку, выполнив (в другом терминале):

    notify-send '<long_text>'
    
  5. Если все работает нормально, добавьте его в приложения для запуска: Dash > Приложения для запуска > Добавлять. Добавьте команду:

    /bin/bash /path/to/catch_notifs.sh
    

И он должен работать:)

    
ответ дан Jacob Vlijm 21.07.2016 в 06:06
источник
4

Как я уже отмечал в комментариях, notify-osd не очень подходит для расширенных сообщений, и вместо этого следует предпочесть zenity .

Простым примером использования будет создание диалога zenity через subprocess.call([COMMAND,OPTIONS])

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.     

ответ дан Sergiy Kolodyazhnyy 21.07.2016 в 03:51
источник

Ознакомьтесь с другими вопросами по меткам