Module interface_main
[hide private]
[frames] | no frames]

Source Code for Module interface_main

  1  # -*- coding: utf-8 -*- 
  2   
  3   
  4  import gtk 
  5  import gobject 
  6  import threading 
  7  import time 
  8  from opencv.highgui import cvCreateFileCapture, cvQueryFrame, cvSaveImage 
  9  from opencv.cv import cvCloneImage, CV_GRAY2RGB 
 10   
 11  import create_sgf 
 12  from function import convert_opencv2gtk, convert_opencv_gray2gtk, load_image_no_webcam 
 13  from interface_configuration import Interface_configuration 
 14  from interface_about import Interface_about 
 15  from camera import Camera 
 16  from video import Video 
 17  from cte import WITH_VIDEO, WITH_WEBCAM, THRESHOLD 
 18  from intersection import Intersection 
 19  from difference import difference 
 20  from luminosity import search_circle 
 21   
 22  gtk.gdk.threads_init() 
 23   
24 -class Interface_main():
25 """Clase utilizada para las interfaz princpipal. """
26 - def __init__(self):
27 28 # variables 29 self.values = [] 30 self.capture = None 31 self.file_sgf = None 32 self.photos = [] 33 self.count = 0 34 self.configuration_open = False 35 36 # cargamos el archivo creado con glade 37 self.gladefile = "gui/main.glade" 38 self.glade = gtk.Builder() 39 self.glade.add_from_file(self.gladefile) 40 41 #cargamos las variables 42 self.window = self.glade.get_object("window_main") 43 self.image_left = self.glade.get_object("main_image_left") 44 self.image_right = self.glade.get_object("main_image_right") 45 self.button_search = self.glade.get_object("button_search_intersection") 46 self.button_ok = self.glade.get_object("button_intersection_ok") 47 self.button_foto = self.glade.get_object("button_foto") 48 self.button_end = self.glade.get_object("button_end") 49 self.menu_file_new = self.glade.get_object("menu_file_new") 50 self.progressbar = self.glade.get_object("progressbar") 51 52 # conectamos las señales 53 self.glade.connect_signals(self) 54 55 # modificamos las variables para mostrar o no los botones 56 self.window.set_icon_from_file("images/icono.png") 57 self.window.set_title("Tablerogo") 58 self.button_foto.set_sensitive(False) 59 self.button_ok.set_sensitive(False) 60 self.button_search.set_sensitive(False) 61 self.button_end.set_sensitive(False) 62 63 # mostramos la ventana 64 self.window.show() 65 66 # abrimos nueva configuracion al iniciar 67 self.menu_file_new_activate(self.menu_file_new)
68 69 70 # callback
71 - def menu_file_new_activate(self, widget):
72 """Callback que es llamado cuando se pulsa el botón de Nuevo en la 73 barra de menú de la interfaz y que nos abre una nueva interfaz 74 de configuración. """ 75 76 # creamos un objeto camera 77 self.camera = Camera() 78 # Comprobamos que está abierta una ventana, si no abrimos una nueva 79 if not self.configuration_open: 80 self.i_configuration = Interface_configuration(self.camera) 81 self.configuration_open = True 82 # creamos bucle para comprobar cuando creamos una nueva configuracion 83 self.checking = gobject.timeout_add(500, self.check_configuration) 84 else: # si esta abierta le pasamos el foco # TODO 85 self.i_configuration.window.activate_default()
86
87 - def menu_help_about_activate(self, widget):
88 """Callback que es llamado cuando se pulsa el botón de Acerca de en la 89 barra de menú de la interfaz y que nos abre una nueva ventana. """ 90 Interface_about()
91
92 - def menu_language_1_activate(self, widget):
93 """Callback que es llamado cuando se pulsa el botón del idioma 1 en la 94 barra de menú de la interfaz y que nos cambia al idioma seleccionado. 95 """ 96 print "cambiado a lenguaje_1"
97
98 - def menu_language_2_activate(self, widget):
99 """Callback que es llamado cuando se pulsa el botón del idioma 2 en la 100 barra de menú de la interfaz y que nos cambia al idioma seleccionado. 101 """ 102 print "cambiado a lenguaje_2"
103
104 - def menu_file_exit_activate(self, widget):
105 """Callback que es llamado cuando pulsamos la opción de salir de la 106 barra menú. """ 107 gtk.main_quit() 108 exit()
109 110
111 - def button_end_clicked(self, widget):
112 """Callback que es llamado cuando pulsamos el botón terminar""" 113 self.end_file_sgf()
114
115 - def button_search_intersection_clicked(self, widget):
116 """Callback que es llamado para buscar las intersecciones del tablero 117 cuando pulsamos el boton Buscar Intersecciones. """ 118 119 gobject.source_remove(self.refresh) 120 self.quit = False 121 self.new_thread(self.thread_progressbar) 122 self.new_thread(self.thread_search_intersection) 123 self.progressbar.show()
124
125 - def button_intersection_ok_clicked(self, widget):
126 """Callback que es llamado cuando pulsamos el boton Intersecciones OK, 127 lo que hace es activar el foton de foto y el de terminar para que 128 empecemos a buscar piedras. """ 129 self.button_foto.set_sensitive(True) 130 self.button_search.set_sensitive(False) 131 self.button_ok.set_sensitive(False) 132 self.button_end.set_sensitive(True) 133 self.image_right.hide() 134 widget.hide() 135 self.window.reshow_with_initial_size()
136
137 - def button_foto_clicked(self, widget):
138 """Callback que es llamado cuando pulsamos el boton Foto, el cual nos 139 busca los cambios producidos en el tablero. """ 140 141 save = cvCloneImage(self.frame) 142 self.photos.append(save) 143 ima_diff = difference(self.photos[self.count], self.photos[self.count-1]) 144 145 try: cvSaveImage("images/%s.png" %self.count, ima_diff) 146 except: print "Error al guardar la diferencia " # para chequeo 147 148 stones = search_circle(ima_diff, self.intersection.tablero, \ 149 self.intersection.size) 150 values = self.intersection.search_intersection(stones) 151 print "Valores: ", values 152 # Insertar valor de la piedra puesta en un label a mano derecha 153 # Insertar el color de la piedra puesta en una imagen a la derecha 154 self.file_sgf.add_text(values[0], values[1]) # guardamos jugada en sgf 155 if values[2]: # terminar 156 self.end_file_sgf() 157 self.count += 1
158 159
160 - def gtk_main_quit(self, widget):
161 """Funcion que es llamada cuando queremos cerramos la ventana. """ 162 gtk.main_quit() 163 exit()
164 165 166 # metodos
167 - def load_image_left(self, image):
168 """Nos carga una imagen en la parte izquierda de la pantalla. 169 @param image: imagen a cargar. 170 @type image: L{IplImage}""" 171 pix_buf = convert_opencv2gtk(image) 172 self.image_left.set_from_pixbuf(pix_buf)
173
174 - def load_image_right(self, image):
175 """Nos carga una imagen en la parte derecha de la pantalla. 176 @param image: imagen a cargar. 177 @type image: L{IplImage}""" 178 pix_buf = convert_opencv_gray2gtk(image) 179 self.image_right.set_from_pixbuf(pix_buf)
180
181 - def check_configuration(self):
182 """Comprueba si la ventana de configuración está abierta. 183 @return: True si la configuración se ha creado correctamente, 184 False en caso contrario. 185 @rtype: C{bool}""" 186 if not self.i_configuration.open_window_configuration: 187 self.configuration_open = False 188 if self.i_configuration.configuration_ok: 189 self.configuration_applicate() 190 return False 191 return True
192
193 - def end_file_sgf(self):
194 """Función que cierra el archivo sgf y desactiva los botones hasta 195 nueva configuración. """ 196 self.file_sgf.end_file() 197 self.button_foto.set_sensitive(False) 198 self.button_search.set_sensitive(False) 199 self.button_ok.set_sensitive(False) 200 self.button_end.set_sensitive(False) 201 self.image_left.hide() 202 203 # terminamos con el refresh 204 gobject.source_remove(self.refresh) 205 206 self.configuration_initial()
207 # que muestre que tu archivo se ha creado correctamente 208 209
210 - def configuration_initial(self):
211 """Funcion que vuelve a la configuración inicial. """ 212 self.window.reshow_with_initial_size() 213 self.values = [] 214 self.capture = None 215 self.file_sgf = None 216 self.photos = [] 217 self.count = 0 218 self.configuration_open = False
219 220
221 - def configuration_applicate(self):
222 """Función que aplica la configuración creada en la interfaz 223 configuracion.""" 224 # obtenemos los valores que queremos guardar de configuracion 225 self.values = self.i_configuration.values 226 if WITH_VIDEO == len(self.values): 227 # creamos un objeto video 228 self.video = Video() 229 self.video.open_video(self.values[1]) 230 frame = self.video.get_frame() 231 self.sel = WITH_VIDEO 232 elif WITH_WEBCAM == len(self.values): 233 frame = self.camera.get_frame() 234 self.sel = WITH_WEBCAM 235 236 self.load_image_left(frame) 237 # crear archivo sgf 238 self.file_sgf = create_sgf.Create_sgf(self.values[0]) 239 self.refresh = gobject.timeout_add(50, self.update) 240 self.button_search.set_sensitive(True) 241 self.image_left.show()
242 243
244 - def update(self):
245 """Función que actualiza el video, cámara o imagen. 246 @return: Devuelve True siempre. 247 @rtype: C{bool} 248 """ 249 if WITH_VIDEO == self.sel: 250 self.frame = self.video.get_frame() 251 elif WITH_WEBCAM == self.sel: 252 self.frame = self.camera.get_frame() 253 self.load_image_left(self.frame) 254 return True
255 256
257 - def new_thread(self, method):
258 """Funcion que crea un nuevo hilo. """ 259 t = threading.Thread(target=method, args=()) 260 t.start()
261 262
263 - def thread_progressbar(self):
264 """ Función hilo que muestra la barra de progreso. """ 265 while not self.quit: 266 time.sleep(0.01) 267 gtk.gdk.threads_enter() 268 self.progressbar.pulse() 269 gtk.gdk.threads_leave()
270 271 273 """ Función hilo que busca las intersecciones del tablero. """ 274 275 self.button_search.set_sensitive(False) 276 save = cvCloneImage(self.frame) 277 self.photos.append(save) 278 self.intersection = Intersection(self.photos[self.count]) 279 # buscamos las intersecciones 280 if self.intersection.detect_intersections(THRESHOLD) != -1: 281 # Pintamos las intersecciones encontradas en la imagen de la derecha 282 ima = self.intersection.media() 283 self.load_image_right(ima) 284 self.image_right.show() 285 self.button_ok.show() 286 # Activamos button_ok 287 self.button_ok.set_sensitive(True) 288 289 self.button_search.set_sensitive(True) 290 self.count += 1 291 292 self.quit = True # para parar la barra de progreso 293 self.progressbar.hide() 294 self.refresh = gobject.timeout_add(50, self.update)# Bucle video
295