====== 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.