如何为程序创建自定义启动画面?

如何为程序创建自定义启动画面?

我目前正在为工作中的用户构建一个客户端,使用 Ubuntu MATE 15.10 和 Plank 作为停靠栏。但是当我单击停靠栏中的 Firefox 图标时,什么都没有发生,直到超过 10 秒后它突然弹出,没有加载图标作为鼠标指针或类似的东西。

现在有没有办法制作像 LibreOffice 中那样的自定义启动画面?或者只是创建一个像“Firefox 正在启动...”这样的窗口,该窗口在应用程序打开后关闭?

谢谢!

答案1

创建启动窗口

您可以使用GTKgtk_window_set_decorated()创建不带任何装饰的启动画面。与 结合使用gtk_window_set_position(),您几乎可以创建自定义启动画面。

一个例子

(脚本1,启动窗口)

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

这会创建一个如下的启动画面:

在此处输入图片描述

当然,你可以设置任何背景颜色、字体和字体大小、图像等取决于您的喜好,但这是基本想法。

如果应用程序窗口出现,则使启动画面消失

一旦应用程序窗口出现启动画面,您就需要一个脚本来等待应用程序窗口,并且(确实)终止运行该窗口的进程。

(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 实际启动,它就会消失。


笔记

如上所述,上面的例子非常简单。当然,你可以让它更流畅,用各种可能的方式美化启动画面,甚至让它半透明:

在此处输入图片描述

(代码:)

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

或添加图片:

在此处输入图片描述

(代码:)

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

等等...

此外,您还可以制作应用程序和文本参数两种脚本等等,但这是基本思想。

Unity/任务列表中没有图标?

如果您不想让图标出现在 Unity(或任何其他任务管理器,如 Plank)中,您只需在该__init__部分中添加一行:

self.set_skip_taskbar_hint(True)

相关内容