1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/usr/bin/python
import gtk, gobject
DELAY = 5
DELTA = 1
#WIDTH = 500
#HEIGHT = 500
class DrawingArea:
def __init__(self):
#window = gtk.Window()
window = gtk.Window(gtk.WINDOW_POPUP)
window.set_modal(True)
screen = window.get_screen()
self.WIDTH = screen.get_width()
self.HEIGHT = screen.get_height()
#window.set_size_request(WIDTH, HEIGHT)
window.set_default_size(self.WIDTH, self.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, self.HEIGHT)
else:
self.drawingarea.window.draw_line(self.gc, 0, line_index, self.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 > self.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 > self.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()
|