Raspberry Pi ZERO アプリケーションランチャ

前回作成したウィンドウマネージャの切り換えは若干使い勝手が悪いのでもう少しシンプルにアプリケーションランチャとしても応用ができるよう変更してみました。

style

参考にしたサイトのサンプルはtkinter.ttkモジュールを使用しています。
ボタンだけの確認ですが少し試してみました。
~/bin/style.pyを作成して実行

from tkinter import *
from tkinter import ttk
style = ttk.Style()
all_theme = style.theme_names()
print(all_theme)

$ python3 style.py
('clam', 'alt', 'default', 'classic')

ディフォルトでは4つのテーマが使えるようです。下記のプログラム10行目附近に設定を入れています。

左上から
default
alt
clam
classic(下)
影が付いたりボタンの間隔が違っています。ほかの要素が入ればもう少しはっきりわかると思います。

プログラム

ウインドウマネージャの切り換えはボタンのクリックでxstartupをコピー即reboot動作に入るようにしました。
shutdownボタンでパワーオフ、exitボタンはなにもしないで終了します。
shutdownボタン、exitボタンの画像は100×48で適当に作成しました。
サンプルプログラムは画像でボタンの大きさが決まります。

~/bin/wm.py

#!/usr/bin/python3

from tkinter import *
from tkinter import ttk
import os

root = Tk()
root.title('WM Select')
# style
style = ttk.Style()
style.theme_use('default') #('clam', 'alt', 'default', 'classic')

# Frame as Widget Container
frame1 = ttk.Frame(
    root,
    padding=5)
frame1.grid()

# Button 1
def dwm():
    os.system("cp ~/.vnc/xstartup.dwm ~/.vnc/xstartup")
    os.system("sudo reboot")
icon1 = PhotoImage(file='~/.icons/dwm.png')
button1 = ttk.Button(
    frame1,
    image=icon1,
    command=dwm)
button1.grid(row=1,column=1)

# Button 2
def openbox():
    os.system("cp ~/.vnc/xstartup.openbox ~/.vnc/xstartup")
    os.system("sudo reboot")
icon2 = PhotoImage(file='~/.icons/openbox.png')
button2 = ttk.Button(
    frame1,
    image=icon2,
    command=openbox)
button2.grid(row=1,column=2)

# Button 3
def shutdown():
    os.system("sudo poweroff")
icon3 = PhotoImage(file='~/.icons/power100x48.png')
button3 = ttk.Button(
    frame1,
    image=icon3,
    command=shutdown)
button3.grid(row=2,column=1)

# Button 4
def cancel():
    root.quit()
icon4 = PhotoImage(file='~/.icons/exit100x48.png')
button4 = ttk.Button(
    frame1,
    image=icon4,
    command=cancel)
button4.grid(row=2,column=2)

root.mainloop()

ランチャ

ランチャのアイコンは/usr/share/icons/以下から32×32サイズを適当に拾ってきました。
横に並べるか縦に並べるかはrow=1にするかcolumn=1にするかで決まります。
実行はos.system(“pcmanfm &”) (&を入れないとランチャに制御が戻らない)

# Button 2
def pcmanfm():
    os.system("pcmanfm &")
icon2 = PhotoImage(file='~/.icons/pcmanfm.png')
button2 = ttk.Button(
    frame1,
    image=icon2,
    command=pcmanfm)
button2.grid(row=1,column=2)


ちょっとした用途にはいろいろ応用が効くと思います。