====== Byzanx ======
Byzanx es una interface gráfica para [[http://blogs.gnome.org/otte/byzanz| byzanz-record]].
Con Byzanx, podrá grabar su pantalla a un fichero de imagen .gif o un video .ogv.
Para el diseño de la interface se utilizó wxGlade y como lenguaje, Python.
===== ¿Por qué Byzanx? =====
Aunque ya existe una [[http://git.gnome.org/browse/byzanz/|interface GTK para byzanz-record]]:
$ aptitude show byzanz
Esta funciona bien en entornos GTK al estilo Gnome, pero en otros entornos gráficos no es utilizable.
Por eso decidí crear esta pequeña aplicación que me permitiera grabar la pantalla sin tener que abrir una consola y que se oculta, al estilo applet, en la bandeja del sistema para no interferir con lo que grabamos.
===== Funcionalidad =====
* Seleccionar el tiempo de grabación.
* Seleccionar el tiempo de espera antes de comenzar a grabar.
* Seleccionar el tamaño y posición del área a grabar.
* Seleccionar la posibilidad de mostrar el cursor del mouse o no en el fichero grabado.
* Cerrar al terminar de grabar o no.
===== Requisitos =====
* Python >= 2.5
# aptitude install python
* wxpthon 2.8
# aptitude install python-wxgtk2.8
* Byzanz
# aptitude install byzanz
===== Modo de empleo =====
* Ejecutar el programa.
* Seleccionar y setear opciones.
* Click en Aceptar.
===== Cómo obtenerlo =====
* [[http://fpp.alwaysdata.net/| Descargarlo desde fpp.alwaysdata.net]].
* Descargar el código fuente (debe colocar un fichero icono.png en el mismo directorio):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Fri Jan 8 23:17:51 2010
import wx
# begin wxGlade: extracode
import subprocess
# end wxGlade
class MyTaskBarIcon(wx.TaskBarIcon):
def __init__(self, frame):
wx.TaskBarIcon.__init__(self)
self.frame = frame
self.SetIcon(wx.Icon('icono.png', wx.BITMAP_TYPE_PNG), 'Grabar Pantalla')
self.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=1)
self.Bind(wx.EVT_MENU, self.OnTaskBarDeactivate, id=2)
self.Bind(wx.EVT_MENU, frame.on_boton_ok, id=3)
self.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=4)
def CreatePopupMenu(self):
menu = wx.Menu()
menu.Append(1, 'Mostrar opciones')
menu.Append(2, 'Ocultar')
menu.Append(3, 'Comenzar a grabar')
menu.Append(4, 'Cerrar')
return menu
def OnTaskBarClose(self, event):
self.frame.Close()
def OnTaskBarActivate(self, event):
if not self.frame.IsShown():
self.frame.Show()
def OnTaskBarDeactivate(self, event):
if self.frame.IsShown():
self.frame.Hide()
class Principal(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: Principal.__init__
self.tskic = MyTaskBarIcon(self)
wx.Frame.__init__(self, *args, **kwds)
self.Bind(wx.EVT_CLOSE, self.OnClose)
kwds["style"] = wx.FRAME_NO_TASKBAR
self.label_fichero = wx.StaticText(self, -1, "Fichero:")
self.text_ctrl_fichero = wx.TextCtrl(self, -1, "")
self.label_tiempo = wx.StaticText(self, -1, u"Tiempo de grabación:")
self.spin_ctrl_tiempo = wx.SpinCtrl(self, -1, "1", min=0, max=100)
self.label_espera = wx.StaticText(self, -1, "Esperar:")
self.spin_ctrl_esperar = wx.SpinCtrl(self, -1, "1", min=0, max=100)
self.label_area = wx.StaticText(self, -1, "Area a grabar:")
self.checkbox_area = wx.CheckBox(self, -1, "Pantalla completa")
self.label_posx = wx.StaticText(self, -1, u"Posición X:")
self.spin_ctrl_posx = wx.SpinCtrl(self, -1, "0", min=0, max=3000)
self.label_posy = wx.StaticText(self, -1, u"Posición Y:\n")
self.spin_ctrl_posy = wx.SpinCtrl(self, -1, "0", min=0, max=3000)
self.label_ancho = wx.StaticText(self, -1, "Ancho:")
self.spin_ctrl_ancho = wx.SpinCtrl(self, -1, "100", min=0, max=3000)
self.label_alto = wx.StaticText(self, -1, "Altura:")
self.spin_ctrl_alto = wx.SpinCtrl(self, -1, "100", min=0, max=3000)
self.checkbox_cursor = wx.CheckBox(self, -1, "Mostrar cursor")
#self.checkbox_loop = wx.CheckBox(self, -1, "Loop")
self.checkbox_cerrar = wx.CheckBox(self, -1, "Cerrar al terminar")
self.button_grabar = wx.Button(self, wx.ID_OK, "")
self.button_salir = wx.Button(self, wx.ID_EXIT, "")
self.__set_properties()
self.__do_layout()
self.Bind(wx.EVT_BUTTON, self.on_boton_ok, self.button_grabar)
self.Bind(wx.EVT_BUTTON, self.on_boton_salir, self.button_salir)
# end wxGlade
def __set_properties(self):
# begin wxGlade: Principal.__set_properties
self.SetTitle("Grabador de pantalla byzanx")
self.SetSize((366, 350))
self.SetBackgroundColour(wx.Colour(255, 255, 255))
_icon = wx.EmptyIcon()
_icon.CopyFromBitmap(wx.Bitmap("icono.png", wx.BITMAP_TYPE_ANY))
self.SetIcon(_icon)
self.text_ctrl_fichero.SetMinSize((200, 27))
self.text_ctrl_fichero.SetToolTipString("Nombre de fichero .gif para Imagen, .ogv para Video")
self.spin_ctrl_tiempo.SetToolTipString("Tiempo")
self.spin_ctrl_esperar.SetToolTipString("Tiempo a esperar antes de empezar a grabar")
self.checkbox_area.SetToolTipString("Grabar toda la pantalla")
self.spin_ctrl_posx.SetToolTipString(u"Posición X")
self.spin_ctrl_posy.SetToolTipString(u"Posición Y")
self.spin_ctrl_ancho.SetToolTipString(u"Ancho del área")
self.spin_ctrl_alto.SetToolTipString(u"Altura del área")
self.checkbox_cursor.SetToolTipString("Mostrar cursor")
#self.checkbox_loop.SetToolTipString("Reproducir en lazo")
self.checkbox_cerrar.SetToolTipString("Cerrar al terminar de grabar")
self.button_grabar.SetToolTipString(u"Iniciar grabación")
self.button_salir.SetToolTipString("Salir")
# end wxGlade
def __do_layout(self):
# begin wxGlade: Principal.__do_layout
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1 = wx.FlexGridSizer(2, 4, 2, 2)
sizer_2.Add(self.label_fichero, 0, 0, 0)
sizer_2.Add(self.text_ctrl_fichero, 0, 0, 0)
sizer_2.Add(self.label_tiempo, 0, 0, 0)
sizer_2.Add(self.spin_ctrl_tiempo, 0, 0, 0)
sizer_2.Add(self.label_espera, 0, 0, 0)
sizer_2.Add(self.spin_ctrl_esperar, 0, 0, 0)
sizer_2.Add(self.label_area, 0, 0, 0)
sizer_2.Add(self.checkbox_area, 0, 0, 0)
grid_sizer_1.Add(self.label_posx, 0, 0, 0)
grid_sizer_1.Add(self.spin_ctrl_posx, 0, 0, 0)
grid_sizer_1.Add(self.label_posy, 0, 0, 0)
grid_sizer_1.Add(self.spin_ctrl_posy, 0, 0, 0)
grid_sizer_1.Add(self.label_ancho, 0, 0, 0)
grid_sizer_1.Add(self.spin_ctrl_ancho, 0, 0, 0)
grid_sizer_1.Add(self.label_alto, 0, 0, 0)
grid_sizer_1.Add(self.spin_ctrl_alto, 0, 0, 0)
sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0)
sizer_2.Add(self.checkbox_cursor, 0, 0, 0)
#sizer_2.Add(self.checkbox_loop, 0, 0, 0)
sizer_2.Add(self.checkbox_cerrar, 0, 0, 0)
sizer_2.Add(self.button_grabar, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_2.Add(self.button_salir, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
self.Layout()
# end wxGlade
def on_boton_ok(self, event): # wxGlade: Principal.
if self.checkbox_area.IsChecked():
area = ' --display= '
else:
area = ' --x=' + str(self.spin_ctrl_posx.GetValue()) + ' --y=' + str(self.spin_ctrl_posy.GetValue()) + ' --width=' + str(self.spin_ctrl_ancho.GetValue()) + ' --height=' + str(self.spin_ctrl_alto.GetValue())
if self.checkbox_cursor.IsChecked():
cursor = ' -c '
else:
cursor = ''
#if self.checkbox_loop.IsChecked():
# loop = ' -l '
#else:
# loop = ''
tiempo = ' -d ' + str(self.spin_ctrl_tiempo.GetValue())
if self.text_ctrl_fichero.GetValue():
fichero = ' ' + self.text_ctrl_fichero.GetValue()
else:
fichero = ' pantalla.gif'
delay = ' --delay=' + str(self.spin_ctrl_esperar.GetValue())
#comando = 'byzanz-record' + delay + tiempo + loop + cursor + area + fichero
comando = 'byzanz-record -v' + delay + tiempo + cursor + area + fichero
print 'Ejecutando: ' + comando
result = subprocess.Popen(comando, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
if result:
print result[0]
if self.checkbox_cerrar.IsChecked():
self.Close()
def on_boton_salir(self, event): # wxGlade: Principal.
self.Close()
def OnClose(self, event):
self.tskic.Destroy()
self.Destroy()
# end of class Principal
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_principal = Principal(None, -1, "")
app.SetTopWindow(frame_principal)
frame_principal.Show()
app.MainLoop()
===== Cómo colaborar =====
Como actualmente no contamos con un servicio de forge, los interesados en colaborar pueden:
* Suscribirse a esta wiki y publicar aquí mejoras o cambios.
* Ponerse en contacto con el autor fpp @@ infomed.sld.cu. La dirección de correo contiene dos @ con espacios antes y después para evitar spam, debe corregirla si desea contactar al autor.