La distribución donde utilizo esta pequeña aplicación es ArchLinux con XFCE4 aunque va a funcionar en cualquier distro que utilice systemd y en cualquie entorno de escritorio siempre y cuando se respeten la versiones de Python y Gtk con que fue escrita.
Las razónes para haberla escrito son por una parte mostrar que fácil es usar Gtk3 con Python y por otra que xfce4-session-logout realmente no me agrada.
Características:
1) Script utilizando Python 3.5 y Gtk 3.18.2-1.
Redundantemente lo llamé salir.py y le creé un lanzador en mi panel.
2) Comandos de systemd para apagar, reiniciar, etc. que no requieren privilegios de super usuario.
No le puse comandos para suspender e hibernar porque para ésto prefiero usar la consola o las funciones de la tapa de la notebook.
3) Íconos para los botones que fueron guardados en /home/usuario/.icons
4) Archivo css para darle estilo a la ventana, botones y etiquetas.
Lo llamé salir.css y se encuentra en /home/usuario
5) Estoy usando xscreensaver para bloquear la pantalla, si usan otro salva pantalla el comando en la función bloquear() va a cambiar.
Advertencia:
El script no debe ser lanzado con sudo, su o logueado como root porque los íconos y el archivo salir.css no serían encontrados al cambiar el path
de /home/usuario a /root.
Los comandos de systemd utilizados no requieren privilegios de super usuario y si lo hacen, dependiendo de la configuración
de sus equipos las opciones son:
a) Agregar el script a /etc/sudoers para que no pida contraseña.
b) Cambiar los permisos del usuario en polkit-1
Si alguien utiliza el script y tiene problemas con esto me avisa y con gusto lo voy a ayudar.
El script en capturas de geany para que lo vean bien y el código:
Capturas:
Código:
El archivo css en captura y el código:
Captura:
Código:
EDITADO:
Cuando escrbí el código original lo hice pensando en que cualquiera pudiera comprenderlo pero como hay un compañero que ha opinado en los comentarios que es redundante les dejo otra versión que tiene los mismos resultados pero que requiere un poco más de conocimientos sobre python.
Capturas:
Código:
Capturas de mi escritorio donde puede verse la ligera transparencia de la ventana y el color de uno de los botones en hover:
Veo que últimamente posts de este tipo no son comunes por lo tanto si hay algo que no resulte comprensible o que pueda ser mejorado como siempre se aceptan las correciones o sugerencias pertinentes. Pido disculpas por mi pobre desempeño en el diseño gráfico.
Gracias por su atención.
Las razónes para haberla escrito son por una parte mostrar que fácil es usar Gtk3 con Python y por otra que xfce4-session-logout realmente no me agrada.
Características:
1) Script utilizando Python 3.5 y Gtk 3.18.2-1.
Redundantemente lo llamé salir.py y le creé un lanzador en mi panel.
2) Comandos de systemd para apagar, reiniciar, etc. que no requieren privilegios de super usuario.
No le puse comandos para suspender e hibernar porque para ésto prefiero usar la consola o las funciones de la tapa de la notebook.
3) Íconos para los botones que fueron guardados en /home/usuario/.icons
4) Archivo css para darle estilo a la ventana, botones y etiquetas.
Lo llamé salir.css y se encuentra en /home/usuario
5) Estoy usando xscreensaver para bloquear la pantalla, si usan otro salva pantalla el comando en la función bloquear() va a cambiar.
Advertencia:
El script no debe ser lanzado con sudo, su o logueado como root porque los íconos y el archivo salir.css no serían encontrados al cambiar el path
de /home/usuario a /root.
Los comandos de systemd utilizados no requieren privilegios de super usuario y si lo hacen, dependiendo de la configuración
de sus equipos las opciones son:
a) Agregar el script a /etc/sudoers para que no pida contraseña.
b) Cambiar los permisos del usuario en polkit-1
Si alguien utiliza el script y tiene problemas con esto me avisa y con gusto lo voy a ayudar.
El script en capturas de geany para que lo vean bien y el código:
Capturas:
Código:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import gi,os,pwd
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
usuario = pwd.getpwuid(os.getuid()).pw_name
## La aplicación ha sido pensada para utilizar con systemd
## cuyos comandos de apagado y reinicio no requieren privilegios de
## super usuario. Si se ejecuta con sudo o su los íconos para los
## botones y el archivo css no van a ser encontrados, o sea, aunque no
## de error no van ver nada en sus pantallas.
iconos = '/home/' + usuario + '/.icons/'
pathcss= '/home/' + usuario + '/salir.css'
def reiniciar():
os.system("/bin/systemctl reboot")
def apagar():
os.system("/bin/systemctl poweroff")
def cerrar():
os.system("user=$(whoami) && loginctl terminate-user $user")
def bloquear():
os.system("/usr/bin/xscreensaver-command --lock")
class Salir:
def __init__(self):
# Ventana de la aplicación y sus características.
self.window = Gtk.Window()
self.window.set_name('MyWindow')
self.window.set_modal(True)
self.window.set_decorated(False)
self.window.set_position (Gtk.WindowPosition.CENTER)
self.window.set_default_geometry(700,90)
self.window.set_resizable(False)
# Íconos que se van utilizar en los botones.
image1=Gtk.Image()
image1.set_from_file(iconos + "cancel.png")
image2=Gtk.Image()
image2.set_from_file(iconos + "bloquear.png")
image3=Gtk.Image()
image3.set_from_file(iconos + "salir.png")
image4=Gtk.Image()
image4.set_from_file(iconos + "reiniciar.png")
image5=Gtk.Image()
image5.set_from_file(iconos + "apagar.png")
# Contenedores para los widgets.
self.vbox=Gtk.VBox()
self.hbox=Gtk.HBox(1)
self.hbox1=Gtk.HBox(1)
# Botones con sus características, función e imagen de cada uno.
self.b1=Gtk.Button()
self.b1.set_size_request(140,80)
self.b1.connect("clicked",Gtk.main_quit)
self.b1.add(image1)
self.b2=Gtk.Button()
self.b2.set_size_request(140,80)
self.b2.connect("clicked",lambda w: bloquear())
self.b2.add(image2)
self.b3=Gtk.Button()
self.b3.set_size_request(140,80)
self.b3.connect("clicked",lambda w: cerrar())
self.b3.add(image3)
self.b4=Gtk.Button()
self.b4.set_size_request(140,80)
self.b4.connect("clicked",lambda w: reiniciar())
self.b4.add(image4)
self.b5=Gtk.Button()
self.b5.set_size_request(140,80)
self.b5.connect("clicked",lambda w: apagar())
self.b5.add(image5)
# Empaquetado de los botones en el primer box horizontal
self.hbox.pack_start(self.b1,True,True,1)
self.hbox.pack_start(self.b2,True,True,1)
self.hbox.pack_start(self.b3,True,True,1)
self.hbox.pack_start(self.b4,True,True,1)
self.hbox.pack_start(self.b5,True,True,1)
# Etiquetas que nos van a mostrar la función de cada botón.
self.l1=Gtk.Label("Cancelar")
self.l1.set_size_request(140,10)
self.l2=Gtk.Label("Bloquear")
self.l2.set_size_request(140,10)
self.l3=Gtk.Label("Salir")
self.l3.set_size_request(140,10)
self.l4=Gtk.Label("Reiniciar")
self.l4.set_size_request(140,10)
self.l5=Gtk.Label("Apagar")
self.l5.set_size_request(140,10)
# Empaquetado de las labels en el segundo box horizontal.
self.hbox1.pack_start(self.l1,True,True,1)
self.hbox1.pack_start(self.l2,True,True,1)
self.hbox1.pack_start(self.l3,True,True,1)
self.hbox1.pack_start(self.l4,True,True,1)
self.hbox1.pack_start(self.l5,True,True,1)
# Empaquetado de los box horizontales en el box vertical.
self.window.add(self.vbox)
self.vbox.pack_start(self.hbox,True,True,1)
self.vbox.pack_start(self.hbox1,True,True,1)
# Los siguientes pasos son para dar estilo a los controles a
# partir del archivo css escrito para esta aplicación.
style_provider = Gtk.CssProvider()
css = open(pathcss , 'rb')
css_data = css.read()
css.close()
style_provider.load_from_data(css_data)
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
# Hacemos todo visible y le damos transparencia a la ventana.
self.window.show_all()
self.window.set_opacity(0.85)
def main(self):
Gtk.main()
if __name__ == "__main__":
salir = Salir()
salir.main()
El archivo css en captura y el código:
Captura:
Código:
#MyWindow {
background: #050;
}
#MyWindow GtkButton{
background: #666666;
}
#MyWindow GtkButton:hover{
background: #BBBBBB;
}
#MyWindow GtkLabel{
background: #222222;
color: #F00;
font: bold;
}
#MyWindow GtkHBox{
background: transparent;
}
#MyWindow GtkVBox{
background: transparent;
}
EDITADO:
Cuando escrbí el código original lo hice pensando en que cualquiera pudiera comprenderlo pero como hay un compañero que ha opinado en los comentarios que es redundante les dejo otra versión que tiene los mismos resultados pero que requiere un poco más de conocimientos sobre python.
Capturas:
Código:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import gi,os,pwd
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
usuario = pwd.getpwuid(os.getuid()).pw_name
iconos = '/home/' + usuario + '/.icons/'
pathcss= '/home/' + usuario + '/salir.css'
images=[]
def reiniciar():
os.system("/bin/systemctl reboot")
def apagar():
os.system("/bin/systemctl poweroff")
def cerrar():
os.system("user=$(whoami) && loginctl terminate-user $user")
def bloquear():
os.system("/usr/bin/xscreensaver-command --lock")
class Salir:
def __init__(self):
# Ventana de la aplicación y sus características.
self.window = Gtk.Window()
self.window.set_name('MyWindow')
self.window.set_modal(True)
self.window.set_decorated(False)
self.window.set_position (Gtk.WindowPosition.CENTER)
self.window.set_default_geometry(700,90)
self.window.set_resizable(False)
# Contenedores para los widgets y empaquetado de los mismos.
self.vbox=Gtk.VBox()
self.hbox=Gtk.HBox(1)
self.hbox1=Gtk.HBox(1)
self.window.add(self.vbox)
self.vbox.pack_start(self.hbox,True,True,1)
self.vbox.pack_start(self.hbox1,True,True,1)
def crear_images(self):
icons=['cancel.png','bloquear.png','salir.png',
'reiniciar.png','apagar.png']
i,b=1,0
while i <= 5:
nombre='image' + str(i)
nombre=Gtk.Image()
images.append(nombre)
nombre.set_from_file(iconos + icons[b])
i,b=i+1,b+1
def crear_buttons(self):
funciones=[Gtk.main_quit,lambda w: bloquear(),
lambda w: cerrar(),lambda w: reiniciar(),lambda w: apagar()]
i,b=1,0
while i <= 5:
nombre='self.b' + str(i)
nombre=Gtk.Button()
nombre.set_size_request(140,80)
nombre.connect('clicked',funciones[b])
nombre.add(images[b])
self.hbox.pack_start(nombre,True,True,1)
i,b=i+1,b+1
def crear_etiquetas(self):
textos=['Cancelar','Bloquear','Salir','Reiniciar','Apagar']
i,b=1,0
while i <=5:
nombre='self.l' + str(i)
nombre=Gtk.Label(textos[b])
nombre.set_size_request(140,10)
self.hbox1.pack_start(nombre,True,True,1)
i,b=i+1,b+1
crear_images(self)
crear_buttons(self)
crear_etiquetas(self)
# Los siguientes pasos son para dar estilo a los controles a
# partir del archivo css escrito para esta aplicación.
style_provider = Gtk.CssProvider()
css = open(pathcss , 'rb')
css_data = css.read()
css.close()
style_provider.load_from_data(css_data)
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
# Hacemos todo visible y le damos transparencia a la ventana.
self.window.show_all()
self.window.set_opacity(0.85)
def main(self):
Gtk.main()
if __name__ == "__main__":
salir = Salir()
salir.main()
Capturas de mi escritorio donde puede verse la ligera transparencia de la ventana y el color de uno de los botones en hover:
Veo que últimamente posts de este tipo no son comunes por lo tanto si hay algo que no resulte comprensible o que pueda ser mejorado como siempre se aceptan las correciones o sugerencias pertinentes. Pido disculpas por mi pobre desempeño en el diseño gráfico.
Gracias por su atención.