Как создать пользовательский экран-заставку для программы?

Я в настоящее время создаю клиент для наших пользователей на работе с ПОМОЩНИКОМ Ubuntu 15.10 и Доска как прикрепление. Но когда я нажимаю, например, значок Firefox в прикреплении, ничего не происходит, пока это внезапно не открывается после> 10 секунд, никакой значок загрузки как указатель мыши или что-то как этот.

Теперь существует ли способ сделать пользовательский экран-заставку как тот в LibreOffice? Или просто создайте окно как "Firefox, запускается...", который закрывается, после того как приложение открыто?

Спасибо!

4
задан 26 November 2015 в 19:23

1 ответ

Создайте окно всплеска

Можно использовать GTK gtk_window_set_decorated() создать окно всплеска без (любых) художественных оформлений. Объединенный с gtk_window_set_position(), можно в значительной степени создать пользовательский экран-заставку.

Пример

(script1, окно всплеска):

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

который создает экран-заставку как:

enter image description here

Конечно, можно выбрать любой цвет фона, шрифт и fontsize, изображения и т.д., в зависимости от вкуса, но это - основная идея.

Заставьте экран-заставку исчезнуть, если окно приложения появляется

Для уничтожения экрана-заставки однажды, окно приложения появляется, Вам будет нужен сценарий, чтобы ожидать окна приложения и (действительно) уничтожить процесс, который выполняет окно.

(script2, обертка)

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

Как использовать

  1. Потребности сценария (2) wmctrl:

    sudo apt-get install wmctrl
    
  2. Скопируйте script1 (экран-заставка) в пустой файл, сохраните его как splash_screen.py. Изменение, если Вы хотите текст для экрана-заставки (но почему был бы Вы :))

    label = Gtk.Label("Eat more bananas while you wait for Firefox")
    
  3. Скопируйте script2 в пустой файл, сохраните его как splash_wrapper.py В главном разделе сценария измените путь в строке:

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

    в фактический путь (между кавычками)

  4. Теперь выполните установку командой:

    python3 /path/to/splash_wrapper.py
    

    и Ваш экран-заставка появится при выполнении обертки он исчезнет, после того как Firefox на самом деле запускается.


Примечания

Как упомянуто выше пример довольно прост. Конечно, можно сделать это намного более гладким, сутенер экран-заставка всеми возможными способами, или даже сделать его полу - прозрачным:

enter image description here

(код:)

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

или включайте изображение:

enter image description here

(код:)

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

и так далее...

Кроме того, можно подать заявку и текстовые аргументы обоих сценариев и т.д., но это - основная идея.

Никакой значок в Единице / список задач?

Если Вы не хотите, чтобы значок появился в Единице (или любой другой диспетчер задач, как Доска), можно просто добавить строку к __init__ раздел:

self.set_skip_taskbar_hint(True)
8
ответ дан 1 December 2019 в 09:08

Другие вопросы по тегам:

Похожие вопросы: