#!/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()