Como criar uma tela inicial personalizada para um programa?

4

Atualmente, estou construindo um cliente para nossos usuários no trabalho com o Ubuntu MATE 15.10 e o Plank como um dock. Mas quando eu clico, por exemplo, o ícone do Firefox no dock nada acontece até que de repente aparece depois de > 10 segundos, sem carregar o ícone como um ponteiro do mouse ou algo parecido.

Agora existe uma maneira de criar uma tela inicial personalizada como a do LibreOffice? Ou apenas crie uma janela como "O Firefox está sendo iniciado ...", que fecha quando o aplicativo é aberto?

Obrigado!

    
por der_eismann 26.11.2015 / 12:21

1 resposta

8

Crie uma janela inicial

Você pode usar GTK de gtk_window_set_decorated() para criar uma janela inicial sem (nenhuma) decoração. Combinado com gtk_window_set_position() , você pode criar uma tela inicial personalizada.

Um exemplo

(script1, a janela inicial) :

#!/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()

que cria uma tela inicial como:

Claro,vocêpodedefinirqualquercordefundo,fonteetamanhodafonte,imagens,etc.,dependendodoseugosto,masessaéaidéiabásica.

Façaatelainicialdesaparecerseajaneladoaplicativoaparecer

Paramataratelainicialassimqueajaneladoaplicativoaparecer,vocêprecisarádeumscriptparaaguardarajaneladoaplicativoe(defato)mataroprocessoqueexecutaajanela.

(script2,owrapper)

#!/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

Como usar

  1. O script (2) precisa de wmctrl :

    sudo apt-get install wmctrl
    
  2. Copie o script1 (a tela inicial) em um arquivo vazio, salve-o como splash_screen.py . Mude se você quiser o texto para a tela inicial (mas por que você faria :))

    label = Gtk.Label("Eat more bananas while you wait for Firefox")
    
  3. Copie o script2 em um arquivo vazio, salve-o como splash_wrapper.py Na seção head do script, altere o caminho na linha:

    path = "/path/to/splash_screen.py"
    

    no caminho real (entre aspas)

  4. Agora execute a configuração pelo comando:

    python3 /path/to/splash_wrapper.py
    

    e sua tela inicial aparecerá se você executar o wrapper, ele desaparecerá assim que o Firefox for iniciado.

Notas

Como mencionado, o exemplo acima é bastante simples. É claro que você pode torná-lo muito mais suave, manipular a tela inicial de todas as formas possíveis ou até mesmo torná-la semitransparente:

(código:)

#!/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 inclua uma imagem:

(código:)

#!/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()

e assim por diante ...

Além disso, você pode fazer o aplicativo e o texto argumentos de ambos os scripts, etc., mas essa é a idéia básica.

Nenhum ícone na unidade / lista de tarefas?

Se você não quiser que um ícone apareça no Unity (ou em qualquer outro gerenciador de tarefas, como o Plank), basta adicionar uma linha à seção __init__ :

self.set_skip_taskbar_hint(True)
    
por Jacob Vlijm 26.11.2015 / 14:11