通知气泡中的消息溢出

我正在学习如何使用gtk通知,似乎通过通知气泡显示的任何输出都有一个最大的溢出大小,大概10行左右。 因此,如果我要显示的消息不止于此,则会被抑制。 有没有办法强制显示整个邮件而没有任何被压制的东西?

顺便说一句,我正在使用notifyOSD。

我刚刚在(现在)删除的Q / A上发布了这个。 也许它对你有用。


允许(非常)长消息的补丁

下面的“修补程序”将允许您在桌面上显示通知:

如果是(非常)长的通知,而不是:

在此处输入图像描述

你会看到这个:

在此处输入图像描述

消息的持续时间自动设置为文本的长度。

它能做什么

通知由notify-osdnotify-sendnotify-send ,仅限于appr。 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 '' 
  5. 如果一切正常,请将其添加到启动应用程序:Dash>启动应用程序>添加。 添加命令:

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

它应该工作:)

正如我在评论中指出的那样, 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结构

 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这样的图形工具包。