Appunti di Programmazione

Creative Commons License

Shrelo: un menu per uscire da OpenBox

Shrelo in funzione

Ho installato e configurato OpenBox su Debian minimale nel mio Mac Book Pro 13" [8.1] del 2011, e non apprezzando molto il menù di uscita di default, ho pensato di scriverne uno personale . Il nome deriva dalla combinazione delle prime due lettere di ciascuno dei comandi principali in lingua inglese dello script: SH-utdown, RE-boot e LO-gout.

Lo script è realizzato in Python 3 e Tkinter 3.8. All'avvio presenta una finestra in cui sono disposti orizzontalmente i pulsanti per la gestione della chiusura di OpenBox come illustrato nell'immagine seguente:

Shrelo in funzione

Lo script è contenuto in una cartella nominata 'Shrelo', all'interno della quale si trova il programma vero e proprio, 'Shrelo.py' e una directory di nome 'Immagini' in cui sono memorizzati i disegni che compongono i pulsanti dell'applicazione. Vi si trova pure una cartella nominata 'Icone' che raccoglie i temi a disposizione per cambiare l'aspetto di 'Shrelo'. A tale riguardo, per modificare l'estetica dei pulsanti è sufficiente copiare il contenuto di una delle cartelle in 'Icone' e sovrascrivere i disegni che sono presenti nella cartella 'Immagini'. A titolo generale, per modificare il tema di 'Shrelo' è sufficiente utilizzare qualunque disegno di pulsanti purché i nomi siano gli stessi dei tasti originali e in formato '.PNG'.

Ecco i temi:

Tema 2D Black

2D Black

Tema 2D Color

2D Color

Tema 3D Color

3D Color

Tema 3D Sfumato

3D Sfumato

Tema 3D Tondo

3D Tondo

Per funzionare correttamente è necessario cambiare i permessi per l'utente nel file di configurazione 'sudoers' usando l'utility seguente:

$ sudo visudo
[sudo] password di gandalfrank:

Qualora un messaggio vi comunichi che il file non è stato trovato scrivete questa istruzione:

$ sudo /usr/sbin/visudo
[sudo] password di gandalfrank:

Appare l'editor 'Nano' con il file '/etc/sudoers.tmp' pronto per essere modificato. Bisogna aggiungere alla fine del file la seguente linea:

gandalfrank ALL=(ALL) NOPASSWD:ALL

il cui scopo è quello di comunicare al sistema che l'utente 'gandalfrank' può utilizzare l'istruzione 'sudo' senza inserire la password. Ovviamente al posto del mio nickname utente dovete inserire il vostro.

Sudoers aggiornato

Per avviare il programma digitare la seguente istruzione nel terminale o come comando in un lanciatore:

python3 ~/Shrelo/Shrelo.py

Di seguito il codice sorgente dello script e il link per il download.

# 09/07/2023 Fiaschi Francesco
# shrelo è un nome dervato dalle prime due lettere
# dei tre comandi: Sh-utdown, Re-boot e Lo-gout
# versione OOP

import tkinter as tk
import os
import subprocess

class Application(tk.Frame):

    
    def __init__(self, master=None):
        super().__init__(master)
        self.master=master
        self.master.resizable(width=False, height=False)
        self.master.overrideredirect(True)
        self.pack()
        self.create_widgets()

    def Shutdown(self):
        subprocess.run(["systemctl", "poweroff"])

    def Restart(self):
        subprocess.run(["systemctl", "reboot"])

    def Suspend(self):
        subprocess.run(["systemctl", "suspend"])

    def Hibernate(self):
        subprocess.run(["systemctl", "hibernate"])

    def Logout(self):
        subprocess.run(["openbox", "--exit"])

    def Cancel(self):
        self.master.destroy()
        
    def create_widgets(self):
        self.btn_Shutdown=tk.Button(root, text="", image=img_shutdown, command=self.Shutdown)
        self.btn_Shutdown.pack(side=tk.LEFT) 

        self.btn_Restart=tk.Button(root, text="", image=img_restart, command=self.Restart)
        self.btn_Restart.pack(side=tk.LEFT)

        self.btn_Suspend=tk.Button(root, text="", image=img_suspend, command=self.Suspend)
        self.btn_Suspend.pack(side=tk.LEFT)

        self.btn_hibernate=tk.Button(root, text="", image=img_hibernate, command=self.Hibernate)
        self.btn_hibernate.pack(side=tk.LEFT)

        self.btn_logout=tk.Button(root, text="", image=img_logout, command=self.Logout)
        self.btn_logout.pack(side=tk.LEFT)

        self.btn_Cancel=tk.Button(root, text="", image=img_cancel, command=self.Cancel )
        self.btn_Cancel.pack(side=tk.LEFT)

root=tk.Tk()
img_shutdown = tk.PhotoImage(file = "~/Shrelo/Immagini/shutdown.png")
img_restart = tk.PhotoImage(file = "~/Shrelo/Immagini/restart.png")
img_suspend = tk.PhotoImage(file = "~/Shrelo/Immagini/suspend.png")
img_hibernate = tk.PhotoImage(file = "~/Shrelo/Immagini/hibernate.png")
img_logout = tk.PhotoImage(file = "~/Shrelo/Immagini/logout.png")
img_cancel = tk.PhotoImage(file = "~/Shrelo/Immagini/cancel.png")

app=Application(master=root)
root.update()

# dimensioni schermo
l=root.winfo_screenwidth()
h=root.winfo_screenheight()

# dimensioni finestra
lf=root.winfo_width()
hf=root.winfo_height()

# coordinate punto di disegno finestra
x=int((l-lf)/2)
y=int((h-hf)/2)
root.geometry('{}x{}+{}+{}'.format(lf, hf, x, y))

app.mainloop()

Download Shrelo ( 513 KB )