Je suis en train de construire un client pour nos utilisateurs au travail avec Ubuntu MATE 15.10 et Plank en tant que station d'accueil. Mais lorsque je clique par exemple sur l'icône Firefox dans le dock, rien ne se passe tant qu'elle n'apparaît soudainement après> 10 secondes. Aucune icône de chargement en tant que pointeur de la souris ou quelque chose du genre.
Existe-t-il maintenant un moyen de créer un écran de démarrage personnalisé comme celui de LibreOffice? Ou simplement créer une fenêtre du type "Firefox est en train de démarrer ..." qui se ferme une fois l’application ouverte?
Merci!
Vous pouvez utiliser gtk_window_set_decorated()
de GTK
pour créer une fenêtre de démarrage sans (aucune) décoration. En combinaison avec gtk_window_set_position()
, vous pouvez créer un écran de démarrage personnalisé.
Un exemple
(script1, la fenêtre de démarrage) :
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, Pango
class Splash(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="splashtitle")
maingrid = Gtk.Grid()
self.add(maingrid)
maingrid.set_border_width(80)
# set text for the spash window
label = Gtk.Label("Eat bananas while you are waiting for Firefox")
label.modify_font(Pango.FontDescription('Ubuntu 22'))
maingrid.attach(label, 0, 0, 1, 1)
def splashwindow():
window = Splash()
window.set_decorated(False)
window.set_resizable(False)
window.set_position(Gtk.WindowPosition.CENTER)
window.show_all()
Gtk.main()
splashwindow()
ce qui crée un écran de démarrage comme:
Bien sûr, vous pouvez définir n'importe quelle couleur d’arrière-plan, police et taille de police, images, etc., en fonction de vos goûts, mais c’est là l’idée de base.
Pour tuer l'écran de démarrage une fois la fenêtre de l'application affichée, vous aurez besoin d'un script pour attendre la fenêtre de l'application et (effectivement) tuer le processus qui exécute la fenêtre.
(script2, le wrapper)
#!/usr/bin/env python3
import subprocess
import time
# set the application below
application = "firefox"
# set the path to the splash script below
path = "/path/to/splash_screen.py"
subprocess.Popen([application])
subprocess.Popen(["python3", path])
while True:
time.sleep(0.5)
try:
pid = subprocess.check_output(["pidof", application]).decode("utf-8").strip()
w_list = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8")
if pid in w_list:
splashpid = [l.split()[2] for l in w_list.splitlines()\
if "splashtitle" in l][0]
subprocess.Popen(["kill", splashpid])
break
except subprocess.CalledProcessError:
pass
Le script (2) a besoin de wmctrl
:
Sudo apt-get install wmctrl
Copiez le script1 (écran de démarrage) dans un fichier vide, enregistrez-le sous le nom splash_screen.py
. Changer si vous voulez le texte pour l'écran de démarrage (mais pourquoi voudriez-vous :))
label = Gtk.Label("Eat more bananas while you wait for Firefox")
Copiez le script2 dans un fichier vide, enregistrez-le sous le nom splash_wrapper.py
. Dans la section head du script, modifiez le chemin d'accès dans la ligne:
path = "/path/to/splash_screen.py"
dans le chemin actuel (entre guillemets)
Maintenant, lancez la configuration avec la commande:
python3 /path/to/splash_wrapper.py
et votre écran de démarrage apparaîtra si vous exécutez le wrapper, il disparaîtra au démarrage de Firefox.
Comme mentionné, l'exemple ci-dessus est assez simple. Bien sûr, vous pouvez le rendre beaucoup plus lisse, pimp l'écran de démarrage de toutes les manières possibles, ou même le rendre semi-transparent:
(code:)
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, Pango
class Splash(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="splashtitle")
maingrid = Gtk.Grid()
self.add(maingrid)
maingrid.set_border_width(80)
# set text for the spash window
label = Gtk.Label("Eat bananas while you are waiting for Firefox")
label.modify_font(Pango.FontDescription('Ubuntu 22'))
maingrid.attach(label, 0, 0, 1, 1)
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("grey"))
window.set_opacity(0.8)
window.set_position(Gtk.WindowPosition.CENTER)
window.show_all()
Gtk.main()
splashwindow()
ou inclure une image:
(code:)
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, Pango
class Splash(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="splashtitle")
maingrid = Gtk.Grid()
self.add(maingrid)
image = Gtk.Image()
# set the path to the image below
image.set_from_file("/path/to/image.png")
maingrid.attach(image, 1, 0, 1, 1)
maingrid.set_border_width(40)
# set text for the spash window
label = Gtk.Label("Eat bananas while you are waiting for Firefox")
label.modify_font(Pango.FontDescription('Ubuntu 15'))
maingrid.attach(label, 0, 0, 1, 1)
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("grey"))
window.set_opacity(0.8)
window.set_position(Gtk.WindowPosition.CENTER)
window.show_all()
Gtk.main()
splashwindow()
etc...
De plus, vous pouvez créer l’application et le texte des arguments des deux scripts, etc., mais c’est là l’idée de base.
Si vous ne souhaitez pas qu'une icône apparaisse dans Unity (ou tout autre gestionnaire de tâches, comme Plank), vous pouvez simplement ajouter une ligne à la section __init__
:
self.set_skip_taskbar_hint(True)