web-dev-qa-db-fra.com

Comment créer un écran de démarrage personnalisé pour un programme?

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!

4
der_eismann

Créer une fenêtre de démarrage

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:

enter image description here

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.

Faire disparaître l'écran de démarrage si la fenêtre de l'application apparaît

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

Comment utiliser

  1. Le script (2) a besoin de wmctrl:

    Sudo apt-get install wmctrl
    
  2. 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")
    
  3. 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)

  4. 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.


Remarques

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:

enter image description here

(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:

enter image description here

(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.

Aucune icône dans Unity/tasklist?

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)
8
Jacob Vlijm