我目前正在为工作中的用户构建一个客户端,使用 Ubuntu MATE 15.10 和 Plank 作为停靠栏。但是当我单击停靠栏中的 Firefox 图标时,什么都没有发生,直到超过 10 秒后它突然弹出,没有加载图标作为鼠标指针或类似的东西。
现在有没有办法制作像 LibreOffice 中那样的自定义启动画面?或者只是创建一个像“Firefox 正在启动...”这样的窗口,该窗口在应用程序打开后关闭?
谢谢!
答案1
创建启动窗口
您可以使用GTK
来gtk_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
如何使用
脚本(2)需要
wmctrl
:sudo apt-get install wmctrl
将 script1(启动画面)复制到一个空文件中,将其另存为
splash_screen.py
。如果您想要启动画面的文本,请更改(但你为什么要这样做 :) )label = Gtk.Label("Eat more bananas while you wait for Firefox")
将 script2 复制到一个空文件中,并将其另存为
splash_wrapper.py
在脚本的头部部分,更改以下行中的路径:path = "/path/to/splash_screen.py"
进入实际路径(引号之间)
现在通过以下命令运行安装程序:
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)