From b41e2f86f8c1b7ab9645a975af3d9adfc2a53d3c Mon Sep 17 00:00:00 2001 From: Carlos Carvallo Date: Wed, 03 Apr 2013 17:54:34 +0000 Subject: primera version del barrido sin pixbuf --- diff --git a/V2-1barrido.py b/V2-1barrido.py new file mode 100755 index 0000000..f4b6731 --- /dev/null +++ b/V2-1barrido.py @@ -0,0 +1,118 @@ +#!/usr/bin/python +import gtk, gobject + +DELAY = 5 +DELTA = 1 +WIDTH = 453 +HEIGHT = 453 + +class DrawingArea: + def __init__(self): + + window = gtk.Window() + window.set_default_size(WIDTH, HEIGHT) + + self.DELTA_X = DELTA + self.DELTA_Y = DELTA + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea vertical + self._x = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea vertical + self._selected_x = -1 + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea horizontal + self._y = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea horizontal + self._selected_y = -1 + + self.drawingarea = gtk.DrawingArea() + + window.connect("destroy", lambda w: gtk.main_quit()) + self.drawingarea.connect("expose-event", self.area_expose_cb) + window.connect('key-press-event', self.__key_press_cb, self.drawingarea) + + window.add(self.drawingarea) + window.show_all() + + gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawingarea) + + def area_expose_cb(self, area, event): + self.style = self.drawingarea.get_style() + self.gc = self.style.fg_gc[gtk.STATE_NORMAL] + + def draw_line(self, drawing_area, orientation, line_index): + + if orientation == "VERTICAL": + + self.drawingarea.window.draw_line(self.gc, line_index, 0, self._x, HEIGHT) + + else: + self.drawingarea.window.draw_line(self.gc, 0, line_index, WIDTH, self._y) + + self.drawingarea.queue_draw() + + def __move_vertical_line(self, drawingarea): + + # Mover el indice x para que aparente movimiento + self._x += self.DELTA_X; + if self._x > WIDTH: + self.DELTA_X *= -1 + elif self._x < 0: + self.DELTA_X *= -1 + + # Dibujar una linea vertical en la x correspondiente + self.draw_line(drawingarea, "VERTICAL", self._x) + + # Si aun no se selecciono un indice para x, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_x < 0: + return True + else: + return False + + def __move_horizontal_line(self, drawingarea): + + # Mover el indice x para que aparente movimiento + self.draw_line(drawingarea, "VERTICAL", self._selected_x) + + # Mover el indice y para que aparente movimiento + self._y += self.DELTA_Y; + if self._y > HEIGHT: + self.DELTA_Y *= -1 + elif self._y < 0: + self.DELTA_Y *= -1 + + # Dibujar una linea horizontal en la y correspondiente + self.draw_line(drawingarea, "HORIZONTAL", self._y) + + # Si aun no se selecciono un indice para y, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_y < 0: + return True + else: + return False + + def __key_press_cb(self, window, event, drawingarea): + + # Al presionar cualquier tecla, determinar la accion a tomar, de + # acuerdo al estado de las lineas. + + if self._selected_x == -1: + self._selected_x = self._x + gobject.timeout_add(DELAY, self.__move_horizontal_line, self.drawingarea) + elif self._selected_y == -1: + self._selected_y = self._y + gobject.timeout_add(DELAY, self.__draw_arc) + else: + self.restart_game(drawing_area) + +DrawingArea() +gtk.main() diff --git a/V2barrido.py b/V2barrido.py new file mode 100644 index 0000000..8caac90 --- /dev/null +++ b/V2barrido.py @@ -0,0 +1,181 @@ +#!/usr/bin/python +import gtk, gobject + +DELAY = 5 +DELTA = 1 +WIDTH = 453 +HEIGHT = 453 + +class MyApp(): + + def __init__(self): + + window = gtk.Window() + window.set_default_size(500, 500) + + self.DELTA_X = DELTA + self.DELTA_Y = DELTA + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea vertical + self._x = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea vertical + self._selected_x = -1 + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea horizontal + self._y = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea horizontal + self._selected_y = -1 + + self.drawing_area = gtk.DrawingArea() + self.drawing_area.set_size_request(WIDTH, HEIGHT) + + self.drawing_area.connect('configure_event', self.__configure_cb) + self.drawing_area.connect('expose-event', self.__expose_cb) + window.connect('key-press-event', self.__key_press_cb, self.drawing_area) + + window.connect("destroy", lambda w: gtk.main_quit()) + + # box principal + main_box = gtk.HBox() + main_box.add(self.drawing_area) + + window.add(main_box) + + window.show_all() + + gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawing_area) + + def __configure_cb(self, drawing_area, data=None): + x, y, width, height = drawing_area.get_allocation() + + canvas = drawing_area.window + self.pixmap = gtk.gdk.Pixmap(canvas, width, height) + return True + + def __expose_cb(self, drawing_area, data=None): + + self.style = self.drawing_area.get_style() + self.context = self.style.fg_gc[gtk.STATE_NORMAL] + + x, y, width, height = data.area + + #self.context = drawing_area.get_style().fg_gc[gtk.STATE_NORMAL] + + canvas = drawing_area.window + canvas.draw_drawable(self.context, self.pixmap, x, y, x, y, width, height) + return False + + '''def draw_background(self, drawing_area): + #Utilizado para dibujar objetos en el pixmap + cr = self.pixmap.cairo_create() + + # Dibujar inicialmente un fondo negro + cr.set_source_rgb(0, 0, 0) + rectangle = gtk.gdk.Rectangle(0, 0, WIDTH, HEIGHT) + rectangle = cr.rectangle(rectangle) + drawing_area.queue_draw() + cr.fill()''' + + def draw_line(self, drawing_area, orientation, line_index): + #Utilizado para dibujar objetos en el pixmap + cr = self.pixmap.cairo_create() + + # Dibujar una linea que ocupe toda la pantalla y sea de + # color blanco para contrastarlo con la diana + cr.set_source_rgb(255, 255, 255) + + if orientation == "VERTICAL": + rectangle = gtk.gdk.Rectangle(line_index, 0, 1, HEIGHT) + else: + rectangle = gtk.gdk.Rectangle(0, line_index, WIDTH, 1) + + rectangle = cr.rectangle(rectangle) + drawing_area.queue_draw() + cr.fill() + + def __move_vertical_line(self, drawing_area): + #Dibujar el fondo sobre el cual movemos las lineas, si aun no hemos + #presionado un boton para dejar la linea vertical en una coordenada dada + #if self._selected_x < 0: + #self.draw_background(drawing_area) + + # Mover el indice x para que aparente movimiento + self._x += self.DELTA_X; + if self._x > WIDTH: + self.DELTA_X *= -1 + elif self._x < 0: + self.DELTA_X *= -1 + + # Dibujar una linea vertical en la x correspondiente + self.draw_line(drawing_area, "VERTICAL", self._x) + + # Si aun no se selecciono un indice para x, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_x < 0: + return True + else: + return False + + def __move_horizontal_line(self, drawing_area): + #Dibujar el fondo sobre el cual movemos las lineas + #self.draw_background(drawing_area) + + # Como la linea vertical ya se detuvo para poder mover la linea + # horizontal, dibujar la linea vertical en la x seleccionada + self.draw_line(drawing_area, "VERTICAL", self._selected_x) + + # Mover el indice y para que aparente movimiento + self._y += self.DELTA_Y; + if self._y > HEIGHT: + self.DELTA_Y *= -1 + elif self._y < 0: + self.DELTA_Y *= -1 + + # Dibujar una linea horizontal en la y correspondiente + self.draw_line(drawing_area, "HORIZONTAL", self._y) + + # Si aun no se selecciono un indice para y, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_y < 0: + return True + else: + return False + + def __key_press_cb(self, window, event, drawing_area): + # Al presionar cualquier tecla, determinar la accion a tomar, de + # acuerdo al estado de las lineas. + if self._selected_x == -1: + self._selected_x = self._x + gobject.timeout_add(DELAY, self.__move_horizontal_line, self.drawing_area) + elif self._selected_y == -1: + self._selected_y = self._y + gobject.timeout_add(DELAY, self.__draw_arc) + else: + self.restart_game(drawing_area) + + + + + def restart_game(self, drawing_area): + self._x = self._y = 0 + self._selected_x = self._selected_y = -1 + gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawing_area) + + + + + def __draw_arc(self): + self.drawing_area.window.draw_arc(self.context, False, self._x, self._y, 70, 70, 0, 360*64) + +if __name__ == "__main__": + my_app = MyApp() + gtk.main() + diff --git a/barrido.py b/barrido.py new file mode 100755 index 0000000..aad132a --- /dev/null +++ b/barrido.py @@ -0,0 +1,177 @@ +#!/usr/bin/python +import gtk, gobject + +DELAY = 5 +DELTA = 1 +WIDTH = 453 +HEIGHT = 453 + +class MyApp(): + + def __init__(self): + + window = gtk.Window() + window.set_default_size(WIDTH, HEIGHT) + + self.DELTA_X = DELTA + self.DELTA_Y = DELTA + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea vertical + self._x = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea vertical + self._selected_x = -1 + + # Variable global que ira indicando el "indice" de pixel donde dibujar + # la linea horizontal + self._y = 0 + + # Variable global que contendra el "indice" de pixel donde el usuario + # presiono alguna tecla para detenerlo. El valor inicial -1 indica que + # todavia no se ha presionado una tecla para la linea horizontal + self._selected_y = -1 + + self.drawing_area = gtk.DrawingArea() + self.drawing_area.set_size_request(WIDTH, HEIGHT) + + self.drawing_area.connect('configure_event', self.__configure_cb) + self.drawing_area.connect('expose-event', self.__expose_cb) + window.connect('key-press-event', self.__key_press_cb, self.drawing_area) + + window.connect("destroy", lambda w: gtk.main_quit()) + + # box principal + main_box = gtk.HBox() + main_box.add(self.drawing_area) + + window.add(main_box) + + window.show_all() + + gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawing_area) + + def __configure_cb(self, drawing_area, data=None): + x, y, width, height = drawing_area.get_allocation() + + canvas = drawing_area.window + self.pixmap = gtk.gdk.Pixmap(canvas, width, height) + return True + + def __expose_cb(self, drawing_area, data=None): + x, y, width, height = data.area + + self.context = drawing_area.get_style().fg_gc[gtk.STATE_NORMAL] + + canvas = drawing_area.window + canvas.draw_drawable(self.context, self.pixmap, x, y, x, y, width, height) + return False + + def draw_background(self, drawing_area): + #Utilizado para dibujar objetos en el pixmap + cr = self.pixmap.cairo_create() + + # Dibujar inicialmente un fondo negro + cr.set_source_rgb(0, 0, 0) + rectangle = gtk.gdk.Rectangle(0, 0, WIDTH, HEIGHT) + rectangle = cr.rectangle(rectangle) + drawing_area.queue_draw() + cr.fill() + + def draw_line(self, drawing_area, orientation, line_index): + #Utilizado para dibujar objetos en el pixmap + cr = self.pixmap.cairo_create() + + # Dibujar una linea que ocupe toda la pantalla y sea de + # color blanco para contrastarlo con la diana + cr.set_source_rgb(255, 255, 255) + + if orientation == "VERTICAL": + rectangle = gtk.gdk.Rectangle(line_index, 0, 1, HEIGHT) + else: + rectangle = gtk.gdk.Rectangle(0, line_index, WIDTH, 1) + + rectangle = cr.rectangle(rectangle) + drawing_area.queue_draw() + cr.fill() + + def __move_vertical_line(self, drawing_area): + #Dibujar el fondo sobre el cual movemos las lineas, si aun no hemos + #presionado un boton para dejar la linea vertical en una coordenada dada + if self._selected_x < 0: + self.draw_background(drawing_area) + + # Mover el indice x para que aparente movimiento + self._x += self.DELTA_X; + if self._x > WIDTH: + self.DELTA_X *= -1 + elif self._x < 0: + self.DELTA_X *= -1 + + # Dibujar una linea vertical en la x correspondiente + self.draw_line(drawing_area, "VERTICAL", self._x) + + # Si aun no se selecciono un indice para x, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_x < 0: + return True + else: + return False + + def __move_horizontal_line(self, drawing_area): + #Dibujar el fondo sobre el cual movemos las lineas + self.draw_background(drawing_area) + + # Como la linea vertical ya se detuvo para poder mover la linea + # horizontal, dibujar la linea vertical en la x seleccionada + self.draw_line(drawing_area, "VERTICAL", self._selected_x) + + # Mover el indice y para que aparente movimiento + self._y += self.DELTA_Y; + if self._y > HEIGHT: + self.DELTA_Y *= -1 + elif self._y < 0: + self.DELTA_Y *= -1 + + # Dibujar una linea horizontal en la y correspondiente + self.draw_line(drawing_area, "HORIZONTAL", self._y) + + # Si aun no se selecciono un indice para y, seguir permitiendo invocar + # al timer. Caso contrario, retornar False para evitar mas invocaciones + if self._selected_y < 0: + return True + else: + return False + + def __key_press_cb(self, window, event, drawing_area): + # Al presionar cualquier tecla, determinar la accion a tomar, de + # acuerdo al estado de las lineas. + if self._selected_x == -1: + self._selected_x = self._x + gobject.timeout_add(DELAY, self.__move_horizontal_line, self.drawing_area) + elif self._selected_y == -1: + self._selected_y = self._y + gobject.timeout_add(DELAY, self.__draw_arc) + else: + self.restart_game(drawing_area) + + + + + def restart_game(self, drawing_area): + self._x = self._y = 0 + self._selected_x = self._selected_y = -1 + gobject.timeout_add(DELAY, self.__move_vertical_line, self.drawing_area) + + + + + def __draw_arc(self): + self.drawing_area.window.draw_arc(self.context, False, self._x, self._y, 70, 70, 0, 360*64) + +if __name__ == "__main__": + my_app = MyApp() + gtk.main() + -- cgit v0.9.1