J'apprends à utiliser les notifications gtk, et il semble que tout affichage en sortie via la bulle de notification ait une taille maximale de débordement, probablement 10 lignes environ. Donc, si le message que je veux montrer est plus que cela, il est supprimé. Existe-t-il un moyen d’obliger l’affichage du message entier sans que rien ne soit supprimé?
J'utilise notifyOSD, au fait.
Je l'ai posté il y a quelque temps sur un Q/A supprimé (maintenant). Peut-être que cela vous est utile.
Le "patch" ci-dessous vous permettra d’avoir des notifications aussi longtemps que nécessaire sur votre bureau:
En cas de (très) longues notifications, au lieu de ceci:
vous verrez ceci:
La durée du message est automatiquement définie sur la longueur du texte.
Les notifications envoyées par notify-osd
(notify-send
) sont limitées à env. 120 caractères.
La solution "écoute" les messages envoyés à l'aide de dbus-monitor
. Si un message dépasse 120 caractères, il reprend les messages et utilise "sa propre" fenêtre de message pour afficher la notification, comme indiqué ci-dessus.
La configuration existe en deux sections; de "listen-" script, qui intercepte les notifications:
#!/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 {}
Copiez le script dans un fichier vide et enregistrez-le sous le nom catch_notifs.sh
Le script qui crée les notifications de remplacement:
#!/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()
Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous (exactement!) message
(sans extension) et rendez-le exécutable . .
Tester le script à l'aide de la commande (à partir d'une fenêtre de terminal):
/bin/bash /path/to/catch_notifs.sh
(continuez-le)
Vous pouvez tester la configuration en exécutant (dans un autre terminal):
notify-send '<long_text>'
Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:
/bin/bash /path/to/catch_notifs.sh
Et ça devrait marcher :)
Comme je l'ai noté dans les commentaires, notify-osd
ne convient pas très bien aux messages volumineux et vous devriez plutôt préférer zenity
.
Un exemple simple d'utilisation serait le frai zenity
dialogue via 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)
Exemple très simple. Avec quelque chose qui nécessite de vérifier l'état de sortie, comme des questions, vous voudrez peut-être utiliser la structure 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"
Si vous voulez quelque chose de plus avancé, envisagez probablement l’apprentissage de l’un des outils graphiques tels que PyQt ou Gtk.