web-dev-qa-db-ja.com

プログラムのカスタムスプラッシュスクリーンを作成する方法

現在、Ubuntu MATE 15.10およびPlankをドックとして使用しているユーザー向けのクライアントを構築しています。しかし、例えばドック内のFirefoxアイコンをクリックしても、10秒を超えると突然ポップアップするまで何も起こりません。マウスポインターとしての読み込みアイコンなどはありません。

LibreOfficeのようなカスタムスプラッシュスクリーンを作成する方法はありますか?または、「Firefoxを起動しています...」のようなウィンドウを作成します。このウィンドウは、アプリケーションを開くと閉じますか?

ありがとう!

4
der_eismann

スプラッシュウィンドウを作成する

GTKgtk_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

もちろん、好みに応じてany背景色、フォントとフォントサイズ、画像などを設定できますが、これは基本的な考え方です。

アプリケーションのウィンドウが表示されたら、スプラッシュ画面を非表示にします

アプリケーションのウィンドウが表示されたら、スプラッシュスクリーンをkillするには、アプリケーションウィンドウを待機するスクリプトが必要になります。ウィンドウを実行します。

(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として保存します。スクリプトのheadセクションで、次の行のパスを変更します。

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

等々...

さらに、両方のスクリプトなどのアプリケーションとテキスト引数を作成できますが、これは基本的な考え方です。

Unity /タスクリストにアイコンがありませんか?

Unity(またはPlankのような他のタスクマネージャー)にアイコンを表示したくない場合は、__init__セクションに行を追加するだけです。

self.set_skip_taskbar_hint(True)
8
Jacob Vlijm