diff options
author | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-06-12 17:51:24 (GMT) |
---|---|---|
committer | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-06-12 17:51:24 (GMT) |
commit | a01689b073dbb13f407567f8c7930fee4a2407d2 (patch) | |
tree | 31e6620ab2b2b2d8d3189db9685059a8e9e3a0f4 | |
parent | bd3c8d59c344734bd3ed3778a931546c98cce859 (diff) |
Gtk3: pollster flow
-rwxr-xr-x | CeibalEncuesta/gtk3/CeibalEncuesta/CeibalEncuesta.py | 23 | ||||
-rwxr-xr-x | CeibalEncuesta/gtk3/CeibalEncuesta/Widgets.py | 1221 |
2 files changed, 620 insertions, 624 deletions
diff --git a/CeibalEncuesta/gtk3/CeibalEncuesta/CeibalEncuesta.py b/CeibalEncuesta/gtk3/CeibalEncuesta/CeibalEncuesta.py index fe779b0..a86e0a8 100755 --- a/CeibalEncuesta/gtk3/CeibalEncuesta/CeibalEncuesta.py +++ b/CeibalEncuesta/gtk3/CeibalEncuesta/CeibalEncuesta.py @@ -161,8 +161,6 @@ class CeibalEncuesta(Gtk.Window): Eventos de Teclas. """ - if self.panel.encuesta_tipo == "normal": return - ### Cuando se presiona escape if event.keyval == 65307: from Widgets import Password_Dialog @@ -183,6 +181,8 @@ class CeibalEncuesta(Gtk.Window): if password == "123": self.panel.show_lista() + self.menu_bar.show_all() + self.infowidget.show_all() def do_draw(self, context): """ @@ -191,7 +191,6 @@ class CeibalEncuesta(Gtk.Window): """ if self.panel.get_visible(): - self.infowidget.show() return False from gi.repository import GdkPixbuf @@ -310,6 +309,8 @@ class CeibalEncuesta(Gtk.Window): self.out_dict[encuestado] = {} self.panel.update({}) + self.menu_bar.hide() + self.infowidget.hide() self.infowidget.set_encuestado(encuestado) def __get_menu(self): @@ -317,8 +318,8 @@ class CeibalEncuesta(Gtk.Window): Crea y devuelve el menú de la aplicación. """ - menu_bar = Gtk.MenuBar() - menu_bar.show() + self.menu_bar = Gtk.MenuBar() + self.menu_bar.show() file_menu = Gtk.Menu() @@ -352,12 +353,12 @@ class CeibalEncuesta(Gtk.Window): file_item.show() file_item.set_submenu(file_menu) - menu_bar.append(file_item) + self.menu_bar.append(file_item) self.guardar.set_sensitive(False) self.exportar.set_sensitive(False) - return menu_bar + return self.menu_bar def __exportar_encuesta(self, widget = None, senial = None): """ @@ -451,11 +452,11 @@ class CeibalEncuesta(Gtk.Window): hash = int(time.time() * 1000) path = os.path.join(WORKPATH, "%s_%s.poll_result" % (poll_id, hash)) - import simplejson + import json archivo = open(path, "w") archivo.write( - simplejson.dumps( + json.dumps( out_dict, indent=4, separators=(", ", ":"), @@ -690,9 +691,9 @@ class CeibalEncuesta(Gtk.Window): "pollster_id": pollster_id, "pollster_username": pollster_username} - import simplejson + import json archivo = open(self.path, "w") - archivo.write(simplejson.dumps(salida)) + archivo.write(json.dumps(salida)) archivo.close() if os.path.exists(TEMPPATH): diff --git a/CeibalEncuesta/gtk3/CeibalEncuesta/Widgets.py b/CeibalEncuesta/gtk3/CeibalEncuesta/Widgets.py index e1487b9..96bd190 100755 --- a/CeibalEncuesta/gtk3/CeibalEncuesta/Widgets.py +++ b/CeibalEncuesta/gtk3/CeibalEncuesta/Widgets.py @@ -34,7 +34,7 @@ HOME = os.environ["HOME"] WORKPATH = os.path.join(HOME, "CeibalEncuesta") class Panel(Gtk.Paned): - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, @@ -46,301 +46,301 @@ class Panel(Gtk.Paned): GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT))} - + def __init__(self): - + Gtk.Paned.__init__(self, orientation = Gtk.Orientation.HORIZONTAL) - + self.encuestados = None # mantiene csv para guardarlo como tal self.lista = None # Lista() Lista de encuestados self.encuesta = None # Dict Encuesta self.encuesta_tipo = None # Tipo de encuesta (general o normal) - + # Izquierda box = Gtk.VBox() - + self.scroll_list = Gtk.ScrolledWindow() - + self.scroll_list.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) # self.scroll_list.add_with_viewport(self.lista) - + box.pack_start(self.scroll_list, True, True, 0) - + self.pack1(box, resize = False, shrink = True) - + # Derecha base_box = Gtk.VBox() - + self.box_encuesta = Gtk.VBox() scroll = Gtk.ScrolledWindow() - + scroll.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - + scroll.add_with_viewport(self.box_encuesta) - + self.toolbar_encuesta = ToolbarEncuesta() - + base_box.pack_start(scroll, True, True, 0) base_box.pack_start(self.toolbar_encuesta, False, False, 0) - + self.pack2(base_box, resize = True, shrink = True) - + self.show_all() - + self.scroll_list.hide() self.box_encuesta.hide() - + self.toolbar_encuesta.connect("accion", self.__accion_encuesta) - + def __check_sensibility_butons(self): """ Habilita y deshabilita los botones para recorrer los grupos de preguntas. """ - + index_visible = 0 - + grupos = self.box_encuesta.get_children() - + for child in grupos: if child.get_visible(): index_visible = grupos.index(child) break - + if index_visible == 0: self.toolbar_encuesta.anterior.set_sensitive(False) - + else: self.toolbar_encuesta.anterior.set_sensitive(True) - + if index_visible == grupos.index(grupos[-1]): self.toolbar_encuesta.siguiente.set_sensitive(False) - + else: self.toolbar_encuesta.siguiente.set_sensitive(True) - + def __accion_encuesta(self, widget, accion): """ Pasa la vista de un grupo de preguntas a otro según valor de accion. """ - + index_visible = 0 - + grupos = self.box_encuesta.get_children() - + for child in grupos: if child.get_visible(): index_visible = grupos.index(child) break - + if accion == "Pag. Anterior": if index_visible > 0: map(self.__hide_groups, grupos) map(self.__show_groups, [grupos[index_visible - 1]]) - + elif accion == "Pag. Siguiente": if index_visible < len(grupos)-1: map(self.__hide_groups, grupos) map(self.__show_groups, [grupos[index_visible + 1]]) - + self.__check_sensibility_butons() - + def load_encuestados(self, encuestados): """ Carga una lista a encuestar. """ - + if not encuestados: return - + self.show() self.scroll_list.show_all() - + if self.lista: self.lista.destroy() - + self.encuestados = encuestados - + if not "NOMBRE" in self.encuestados[0]: ### Encuesta de tipo General. self.encuesta_tipo = "general" - + id = "ID" in self.encuestados[0] - + if not id: self.encuestados[0].append("ID") - + for encuestado in self.encuestados[1:]: encuestado.append(str(0)) - + self.lista = GeneralWidget(self.encuestados) self.lista.connect("new_encuestado", self.__new_encuestado) - + else: ### Encuesta de tipo normal self.encuesta_tipo = "normal" self.lista = Lista(self.encuestados) - + self.lista.connect("new-selection", self.__new_selection) self.scroll_list.add_with_viewport(self.lista) - + self.scroll_list.set_size_request(200,-1) - + self.__check_sensitive() - + def load_encuesta(self, encuesta): """ Carga una nueva Encuesta eliminando la anterior. Encuesta es un diccionario. """ - + if not encuesta: return - + self.show() self.box_encuesta.show_all() - + self.encuesta = encuesta.copy() - + # Limpiar la interfaz. for child in self.box_encuesta.get_children(): child.destroy() - + # un grupo es un frame grupos = self.encuesta.keys() grupos.sort() - + for indice in grupos: # indice es el indice del grupo, Encuesta[indice] es el contenido # cada grupo es un diccionario con dos keys (name y fields) # name es el nombre del grupo == text del frame. fields son las preguntas - + grupo = Grupo(indice, self.encuesta[indice]) self.box_encuesta.pack_start(grupo, False, True, 5) - + grupo.connect("new", self.__change) grupo.connect("text_and_change", self.__emit_text_and_change) - + self.__check_sensitive() - + grupos = self.box_encuesta.get_children() map(self.__hide_groups, grupos) map(self.__show_groups, [grupos[0]]) - + self.__check_sensibility_butons() - + def __emit_text_and_change(self, widget_grupo, pregunta, id_opcion, text, activan): """ Cuando el usuario ingresa algún valor en una entrada de texto, se manda guardar los datos y chequear las dependencias. """ - + encuestado = self.__get_encuestado() - + dict_pregunta = dict(pregunta.pregunta.copy()) - + if activan: dict_pregunta["default"] = list(activan) # list(pregunta.widget_obtions.default) if text: dict_pregunta["options"][id_opcion]["newtext"] = text - + self.emit("text_and_change", encuestado, widget_grupo, pregunta, dict_pregunta) - + self.__set_chequeo_dependencias(widget_grupo, pregunta) - + def __change(self, widget_grupo, pregunta, activan): """ Cuando se contesta una pregunta, se manda guardar los datos y chequear las dependencias. """ - + encuestado = self.__get_encuestado() - + grupo_name = widget_grupo.grupo["name"] dict_pregunta = pregunta.pregunta.copy() if activan: dict_pregunta["default"] = list(activan) # list(pregunta.widget_obtions.default) - + indice_grupo = widget_grupo.indice indice_pregunta = pregunta.indice - + ### Guarda la respuesta en archivo de salida self.emit("new", encuestado, indice_grupo, grupo_name, indice_pregunta, dict_pregunta) - + self.__set_chequeo_dependencias(widget_grupo, pregunta) - + def __set_chequeo_dependencias(self, widget_grupo, pregunta): """ Chequear dependencias para todas las preguntas posteriores a la que ha enviado la señal de cambio en ella. """ - + ### Obtener todas las opciones activas opciones_activas = [] - + grupos = self.box_encuesta.get_children() # grupos de preguntas - + for grupo in grupos: preguntas = grupo.box_preguntas.get_children() - + for preg in preguntas: opciones_activas = opciones_activas + preg.widget_obtions.get_active_options() - + almacenar = False # flag preguntas_a_checkear = [] # preguntas posteriores a la modificada - + ### Obtener preguntas posteriores a la que ha lanzado "new". for grupo in grupos[grupos.index(widget_grupo):]: - + for preg in grupo.box_preguntas.get_children(): - + if almacenar: preguntas_a_checkear.append(preg) - + if preg == pregunta: # preguntas posteriores a la que ha lanzado "new" almacenar = True - + self.__chequear_dependencias(opciones_activas, preguntas_a_checkear) - + def __chequear_dependencias(self, opciones_activas, preguntas_a_checkear): """ Chequeo de dependencias propiamente dicho. """ - + preguntas_para_activar = [] preguntas_para_desactivar = [] for pregunta in preguntas_a_checkear: - + dependencia = pregunta.pregunta.get("dependence", False) ### Solo si tienen dependencias if dependencia: - + valor, forma = G.convert(dependencia, opciones_activas) - + ### Si las dependencias de esta pregunta se cumplen if G.evaluar(valor, forma): preguntas_para_activar.append(pregunta) - + ### Si las dependencias no se cumplen else: preguntas_para_desactivar.append(pregunta) - + else: preguntas_para_activar.append(pregunta) - + map(self.__activar, preguntas_para_activar) map(self.__desactivar, preguntas_para_desactivar) - + """ A continuación: Resetear la 1º pregunta desactivada, lo cual ejecutará recurrencia sobre todo el sistema de dependencias. Esto es necesario para evitar que quede contestada una pregunta inactiva. - + Analisis del caso: Se contesta una opción en una 1ª pregunta que activa a una 2ª pregunta. Se contesta la 2ª pregunta. @@ -349,103 +349,103 @@ class Panel(Gtk.Paned): """ if preguntas_para_desactivar: GObject.idle_add(preguntas_para_desactivar[0].reset) - + def __get_encuestado(self): """ Devuelve lista con datos del encuestado seleccionado. """ - + modelo, iter = self.lista.get_selected_item() - + encuestado = [] - + for index in range(0, self.lista.get_num_columns()): encuestado.append(modelo.get_value(iter, index)) - + return encuestado - + def __new_selection(self, widget, encuestado): """ Cuando el usuario cambia de Encuestado. """ - + self.emit("new-selection", encuestado) - + def __show_groups(self, widget): - + widget.set_visible(True) - + def __hide_groups(self, widget): - + widget.set_visible(False) - + def __activar(self, widget): """ Recibe una pregunta. - + Cuando se cumplen las dependencias para esta pregunta, la misma se hace visible para de esa forma, permitir ser contestada. """ - + widget.set_visible(True) - + def __desactivar(self, widget): """ Recibe una pregunta. - + Cuando no se cumplen las dependencias para esta pregunta, la misma se hace invisible. """ - + widget.set_visible(False) - + def __check_sensitive(self): """ Habilita y deshabilita - Visibiliza e invisibiliza widgets y funcionalidad general según condiciones. """ - + if not self.encuesta: self.box_encuesta.hide() - + elif self.encuesta: self.box_encuesta.show_all() - + if not self.lista: self.scroll_list.hide() - + elif self.lista: self.scroll_list.show_all() - + if self.encuesta and self.lista: self.set_sensitive(True) - + else: self.set_sensitive(False) - + if self.encuesta_tipo == "general": self.get_children()[0].hide() - + elif self.encuesta_tipo == "normal": self.get_children()[0].show_all() - + def show_lista(self): """ Muestra la lista en encuestas de tipo general. """ - + self.get_children()[0].show() - + def __new_encuestado(self, widget, encuestado): """ Cuando se crea un nuevo encuestado, este debe agregarse a la lista de encuestados del panel. """ - + self.encuestados.append(encuestado) - + def update(self, dict): """ Cuando se selecciona un usuario, se @@ -453,19 +453,19 @@ class Panel(Gtk.Paned): respuestas del usuario. (dict == {}, actualiza la interfaz de una encuesta sin responder). """ - + self.load_encuesta(self.encuesta) - + grupos = self.box_encuesta.get_children() # grupos de preguntas - + ### Actualiza Respuestas. for grupo in grupos: if not grupo.indice in dict.keys(): continue - + else: grupo.update(dict[grupo.indice]) - + ### Obtener todas las opciones activas opciones_activas = [] grupos = self.box_encuesta.get_children() # grupos de preguntas @@ -473,284 +473,284 @@ class Panel(Gtk.Paned): preguntas = grupo.box_preguntas.get_children() for preg in preguntas: opciones_activas = opciones_activas + preg.widget_obtions.get_active_options() - + ### Actualiza Visibilidad. preguntas_para_activar = [] preguntas_para_desactivar = [] - + for grupo in grupos: preguntas = grupo.box_preguntas.get_children() - + for preg in preguntas: contestada = preg.widget_obtions.get_active_options() con_dependencias = preg.pregunta.get("dependence", False) - + if contestada or not con_dependencias: preguntas_para_activar.append(preg) - + elif not contestada and con_dependencias: dependencia = preg.pregunta.get("dependence", False) ### Solo si tienen dependencias valor, forma = G.convert(dependencia, opciones_activas) - + ### Si las dependencias de esta pregunta se cumplen if G.evaluar(valor, forma): preguntas_para_activar.append(preg) - + ### Si las dependencias no se cumplen else: preguntas_para_desactivar.append(preg) - + map(self.__activar, preguntas_para_activar) map(self.__desactivar, preguntas_para_desactivar) GObject.idle_add(self.check_text_inputs) - + def check_text_inputs(self): """ Forzar autocontestado en opciones de entrada de texto con valor por defecto . . . """ - + grupos = self.box_encuesta.get_children() # grupos de preguntas - + for grupo in grupos: preguntas = grupo.box_preguntas.get_children() - + for pregunta in preguntas: widget_options = pregunta.widget_obtions - + if widget_options.nombre == "TextInput": widget_options.check_text_inputs() - + class My_FileChooser(Gtk.FileChooserDialog): """ Selector de Archivos para poder cargar archivos desde cualquier dispositivo o directorio. """ - + __gsignals__ = { "load":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT,))} - + def __init__(self, parent_window = None, action_type = None, filter_type = None, title = None): - + Gtk.FileChooserDialog.__init__(self, parent = parent_window, action = action_type, flags = Gtk.DialogFlags.MODAL, title = title) - + self.set_size_request( 640, 480 ) self.set_select_multiple(False) self.set_current_folder_uri("file:///%s" % WORKPATH) - + if filter_type != None: filter = Gtk.FileFilter() filter.set_name(filter_type) filter.add_mime_type(filter_type) self.add_filter(filter) - + hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) - + texto = "" if action_type == Gtk.FileChooserAction.OPEN: texto = "Abrir" - + elif action_type == Gtk.FileChooserAction.SAVE: texto = "Guardar" - + abrir = Gtk.Button(texto) salir = Gtk.Button("Salir") - + hbox.pack_end(salir, False, False, 5) hbox.pack_end(abrir, False, False, 5) - + self.set_extra_widget(hbox) - + salir.connect("clicked", self.__salir) abrir.connect("clicked", self.__abrir) - + self.show_all() - + def __abrir(self, widget): - + self.emit("load", self.get_filename()) self.__salir(None) def __salir(self, widget): - + self.destroy() - + class Lista(Gtk.TreeView): """ Lista Dinámica de encuestados para encuestas de tipo normal. """ - + __gsignals__ = { "new-selection":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, ))} - + def __init__(self, encuestados): - + encabezado = encuestados[0] encuestados = encuestados[1:] - + Gtk.TreeView.__init__(self) - + self.set_property("rules-hint", True) self.set_headers_clickable(True) self.set_headers_visible(True) self.valor_select = None - + strings = [] - + for x in encabezado: strings.append(GObject.TYPE_STRING) - + self.modelo = Gtk.ListStore(*strings) - + for item in encabezado: - + visible = False - + if item == "CI" or item == "NOMBRE" or item == "ID": visible = True - + self.append_column( self.__construir_columa( item, encabezado.index(item), visible)) - + self.treeselection = self.get_selection() - + self.treeselection.set_select_function( self.__selecciones, self.modelo) - + self.set_model(self.modelo) self.show_all() - + self.add_encuestados(encuestados) - + def __selecciones(self, treeselection, model, path, is_selected, listore): """ Cuando se selecciona un item en la lista. """ - + iter = model.get_iter(path) - + encuestado = "" - + for index in range(0, len(self.get_columns())): encuestado += "%s " % model.get_value(iter, index) - + encuestado = encuestado.strip() - + if not is_selected and self.valor_select != encuestado: self.valor_select = encuestado self.emit("new-selection", self.valor_select) - + return True - + def __construir_columa(self, text, index, visible): - + render = Gtk.CellRendererText() columna = Gtk.TreeViewColumn(text, render, text=index) columna.set_sort_column_id(index) columna.set_property("visible", visible) columna.set_property("resizable", False) columna.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - + return columna - + def add_encuestados(self, encuestados): """ Recibe lista de: encuestados y Comienza secuencia de agregado. """ - + GObject.idle_add(self.__run_add_encuestado, encuestados) - + def __run_add_encuestado(self, encuestados): """ Agrega los items a la lista, uno a uno, actualizando. """ - + if not encuestados: self.seleccionar_ultimo() return - + encuestado = encuestados[0] - + self.modelo.append( encuestado ) - + encuestados.remove(encuestado) - + GObject.idle_add(self.__run_add_encuestado, encuestados) def __seleccionar_primero(self, widget = None): """ Selecciona el primer elemento en la lista. """ - + self.treeselection.select_path(0) - + def get_selected_item(self): """ Devuelve modelo de la lista e iter seleccionado. """ - + modelo, iter = self.treeselection.get_selected() - + return (modelo, iter) - + def get_num_columns(self): """ Devuelve la cantidad de columnas de la lista. """ - + return len(self.get_columns()) - + def seleccionar_ultimo(self): """ Selecciona el último elemento en la lista. """ - + model = self.get_model() item = model.get_iter_first() - + iter = None - + while item: iter = item item = model.iter_next(item) - + if iter: self.treeselection.select_iter(iter) path = model.get_path(iter) self.scroll_to_cell(path) - + class Grupo(Gtk.Frame): """ Frame para grupo de Preguntas de la encuesta. - + Un grupo es: "0": { "name": "group 0", "fields": { . . . => Preguntas} } """ - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, @@ -759,48 +759,48 @@ class Grupo(Gtk.Frame): GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_PYOBJECT))} - + def __init__(self, indice_grupo, grupo): - + Gtk.Frame.__init__(self) - + self.indice = indice_grupo # indice del grupo en la encuesta self.grupo = grupo.copy() # Diccionario del grupo en la encuesta - + self.set_label(self.grupo["name"]) - + self.box_preguntas = Gtk.VBox() self.add(self.box_preguntas) - + preguntas = self.grupo["fields"] - + keys = preguntas.keys() keys.sort() - + for indice in keys: pregunta = Pregunta(indice, preguntas[indice]) self.box_preguntas.pack_start(pregunta, False, True, 3) pregunta.connect("new", self.__change) pregunta.connect("text_and_change", self.__emit_text_and_change) - + self.show_all() - + def __emit_text_and_change(self, pregunta, id_opcion, text, activan): """ Cuando el usuario ingresa algún valor en una entrada de texto, se manda guardar los datos y chequear las dependencias. """ - + self.emit("text_and_change", pregunta, id_opcion, text, activan) - + def __change(self, widget, activan): """ Cuando se contesta una pregunta, chequea las dependencias y se guardan los datos. """ - + self.emit("new", widget, activan) - + def update(self, dict): """ Cuando se selecciona un usuario que ha @@ -808,19 +808,19 @@ class Grupo(Gtk.Frame): actualiza la interfaz gráfica de la misma con esos valores. """ - + for child in self.box_preguntas.get_children(): - + # Si se respondió esta pregunta if dict["fields"].get(child.indice, False): child.update(dict["fields"][child.indice]) - + class Pregunta(Gtk.HBox): """ Box con Pregunta. - + Una pregunta es: - + { "0": { "widget_type": "RadioButton", @@ -833,72 +833,72 @@ class Pregunta(Gtk.HBox): } } """ - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE,(GObject.TYPE_PYOBJECT,)), "text_and_change":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE,(GObject.TYPE_STRING, GObject.TYPE_STRING,GObject.TYPE_PYOBJECT))} - + def __init__(self, indice_pregunta, pregunta): - + Gtk.HBox.__init__(self) - + self.indice = indice_pregunta self.pregunta = pregunta.copy() - + self.widget_obtions = None widget = self.pregunta["widget_type"] - + if widget == "DropDownList": self.widget_obtions = Widget_DropDownList(self.pregunta["options"].copy()) self.widget_obtions.connect("new", self.__change) - + elif widget == "TextInput": self.widget_obtions = Widget_TextInput(self.pregunta["options"].copy()) self.widget_obtions.connect("text_and_change", self.__emit_text_and_change) - + elif widget == "MultipleCheckBox" or widget == "ImageCheckBox": self.widget_obtions = Widget_MultipleCheckBox(self.pregunta["options"].copy()) self.widget_obtions.connect("new", self.__change) - + elif widget == "RadioButton" or widget == "ImageRadioButton": self.widget_obtions = Widget_RadioButon(self.pregunta["options"].copy()) self.widget_obtions.connect("new", self.__change) - + else: print "Widget no Considerado", widget - + label = Gtk.Label(self.pregunta["name"]) - + pangoFont = Pango.FontDescription("10") - + label.modify_font(pangoFont) label.modify_fg(0, Gdk.Color(0, 0, 65000)) - + self.pack_start(label, False, True, 5) self.pack_end(self.widget_obtions, True, True, 0) - + self.show_all() - + def __emit_text_and_change(self, widget, id_opcion, text, activan): """ Cuando el usuario ingresa algún valor en una entrada de texto, se manda guardar los datos y chequear las dependencias. """ - + self.emit("text_and_change", id_opcion, text, activan) - + def __change(self, widget, activan): """ Cuando se Contesta una pregunta, se chequean las dependencia y se guardan los datos. """ - + self.emit("new", activan) - + def update(self, dict): """ Cuando se selecciona un usuario que ha @@ -906,219 +906,219 @@ class Pregunta(Gtk.HBox): actualiza la interfaz gráfica de la misma con esos valores. """ - + self.widget_obtions.update(dict) - + def reset(self): """ Devolver la pregunta a su estado original. - + Descontestar cualquier respuesta ingresada. """ - + self.widget_obtions.reset() class Widget_DropDownList(Gtk.ComboBoxText): """ Contenedor de opciones para respuestas posibles en una pregunta. - + Opciones es: - + "options": { "00001": {"text": "opcion 1"}, "00002": {"text": "opcion 2"} } """ - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT,))} - + def __init__(self, options): - + Gtk.ComboBoxText.__init__(self) - + self.nombre = "DropDownList" - + self.options = options.copy() self.updating = False - + for key in self.options.keys(): self.append_text(self.options[key]["text"]) - + self.show_all() - + def get_active_options(self): """ Devuelve los indices de las opciones activas. """ - + activas = [] - + for key in self.options.keys(): if self.options[key]["text"] == self.get_active_text(): - + if not key in activas: activas.append(key) - + elif not self.options[key]["text"] == self.get_active_text(): - + if key in activas: activas.remove(key) - + return activas - + def do_changed(self): """ Cuando el usuario hace click sobre una opción, se checkean dependencias y se guardan los datos. """ - + if self.updating: return - + activan = [] - + for key in self.options.keys(): if self.options[key]["text"] == self.get_active_text(): - + if not key in activan: activan.append(key) - + elif not self.options[key]["text"] == self.get_active_text(): - + if key in activan: activan.remove(key) - + self.emit("new", activan) - + def update(self, dict): """ Cuando el usuario cambia de encuestado, actualiza sus respuestas en la pregunta. """ - + self.updating = True - + model = self.get_model() item = model.get_iter_first() - + count = 0 - + for default in dict.get("default", []): - + while item: if model.get_value(item, 0) == \ dict["options"][default]["text"]: - + self.set_active(count) self.updating = False return - + item = model.iter_next(item) count += 1 - + self.updating = False - + def reset(self): """ La pregunta vuelve a su estado original. """ - + self.remove_all() - + activan = [] - + for key in self.options.keys(): self.append_text(self.options[key]["text"]) - + ### Porque se debe avisar que esta pregunta se ha desactivado. self.emit("new", activan) - + class Widget_TextInput(Gtk.Entry): """ Contenedor para entrada de texto para respuesta a una pregunta. - + Opciones es: - + "options":{ "00001":{"text": ""} } """ - + __gsignals__ = { "text_and_change":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE,(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_PYOBJECT))} - + def __init__(self, options): - + Gtk.Entry.__init__(self) - + self.nombre = "TextInput" - + self.options = options.copy() - + self.updating = False - + key = self.options.keys()[0] - + text = self.options[key].get("text", False) if text: self.set_text(text) - + self.show_all() - + def do_key_release_event(self, void): """ Cuando el usuario ingresa algún valor en la opción, se manda guardar los datos y chequear las dependencias. """ - + if self.updating: return - + activan = [] - + key = self.options.keys()[0] text = self.get_text() - + if text: activan.append(key) - + else: return self.reset() - + self.emit("text_and_change", key, text, activan) - + def get_active_options(self): """ Devuelve los indices de las opciones activas. """ - + activas = [] - + key = self.options.keys()[0] - + text = self.options[key].get("text", False) if text: activas.append(key) - + return activas - + def update(self, dict): """ Cuando el usuario cambia de encuestado, actualiza sus respuestas en la pregunta. """ - + self.updating = True - + key = self.options.keys()[0] - + if dict["options"][key].get("newtext", False): self.set_text(dict["options"][key]["newtext"]) - + else: text = self.options[key].get("text", "") self.set_text(text) - + self.updating = False def reset(self): @@ -1127,17 +1127,17 @@ class Widget_TextInput(Gtk.Entry): Si esta opción tenían un valor por defecto, luego de ser reseteada, ese valor ya no se tomará en cuenta. """ - + key = self.options.keys()[0] - + text = " " self.set_text("") - + activan = [] - + ### Porque se debe avisar que esta pregunta se ha desactivado. self.emit("text_and_change", key, text, activan) - + def check_text_inputs(self): """ Cuando una opcion del tipo entrada de texto trae @@ -1146,358 +1146,358 @@ class Widget_TextInput(Gtk.Entry): que de lo contrario, solo se guardará si el usuario contesta en forma explicita esta opción, modificando el valor por defecto. """ - + key = self.options.keys()[0] - + if not self.options[key].get("newtext", False) and self.options[key].get("text", False): - + activan = [] text = self.options[key]["text"] activan.append(key) - + self.emit("text_and_change", key, text, activan) class Widget_RadioButon(Gtk.ButtonBox): """ Contenedor de opciones para respuestas posibles en una pregunta. - + Opciones es: - + "options": { "00001": {"text": "opcion 1"}, "00002": {"text": "opcion 2"} } """ - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT,))} - + def __init__(self, options): - + Gtk.ButtonBox.__init__(self) - + self.nombre = "RadioButton" - + # Grupo de radio buttons. Necesario para pregunta sin contestar. self.null_button = Gtk.RadioButton() - + self.options = options.copy() self.updating = False - + grupo = None - + keys = self.options.keys() keys.sort() - + for key in keys: - + radio = MyRadioButton(key) - + text = self.options[key].get("text", "") imagen = self.options[key].get("img", "") - + if text: radio.set_label(text) - + if imagen: loader = GdkPixbuf.PixbufLoader() image_string = base64.b64decode(imagen) loader.write(image_string) loader.close() - + pixbuf = loader.get_pixbuf().scale_simple( 80, 80, GdkPixbuf.InterpType.BILINEAR) - + radio.set_image(Gtk.Image.new_from_pixbuf(pixbuf)) - + radio.join_group(self.null_button) - + self.pack_start(radio, False, False, 3) - + self.null_button.set_active(True) - + radio.connect("toggled", self.__change) - + self.show_all() - + def get_active_options(self): """ Devuelve los indices de las opciones activas. """ - + activas = [] - + options = self.get_children() - + for child in options: - + if child.get_active(): activas.append(child.indice) - + return activas - + def __change(self, widget): """ Cuando el usuario hace click sobre una opción, se checkean dependencias y se guardan los datos. """ - + if self.updating: return - + options = self.get_children() activan = [] - + for child in options: - + if child.get_active(): activan.append(child.indice) - + self.emit("new", activan) - + def update(self, dict): """ Cuando el usuario cambia de encuestado, actualiza sus respuestas en la pregunta. """ - + self.updating = True - + options = self.get_children() - + for child in options: if child.indice in dict.get("default", []): child.set_active(True) - + else: child.set_active(False) - + self.updating = False - + def reset(self): """ La pregunta vuelve a su estado original. """ - + # FIXME: Esto funciona bien en la persistencia # pero no actualiza gráficamente, debido a que siempre debe # haber un item seleccionado en un grupo de radio buttons. - + options = self.get_children() - + activan = [] - + for child in options: child.set_active(False) - + self.null_button.set_active(True) - + ### Porque se debe avisar que esta pregunta se ha desactivado. self.emit("new", activan) - + class Widget_MultipleCheckBox(Gtk.Table): """ Contenedor de opciones para respuestas posibles en una pregunta. - + Opciones es: - + "options": { "00001": {"text": "opcion 1"}, "00002": {"text": "opcion 2"} } """ - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT,))} - + def __init__(self, options): - + self.nombre = "MultipleCheckBox" - + columns = 2 - + rows = int(len(options)/columns) - + while rows*columns < int(len(options)): rows += 1 - + Gtk.Table.__init__( self, rows = rows, columns = columns, homogeneous = True) - + self.options = options.copy() self.updating = False - + keys = self.options.keys() keys.sort() - + col = 0 row = 0 - + for key in keys: - + check = MyCheckButton(key) - + text = self.options[key].get("text", "") imagen = self.options[key].get("img", "") - + if text: check.set_label(text) - + if imagen: loader = GdkPixbuf.PixbufLoader() image_string = base64.b64decode(imagen) loader.write(image_string) loader.close() - + pixbuf = loader.get_pixbuf().scale_simple( 80, 80, GdkPixbuf.InterpType.BILINEAR) - + check.set_image(Gtk.Image.new_from_pixbuf(pixbuf)) - + self.attach_defaults(check, col, col+1, row, row+1) - + col += 1 - + if col == columns: col = 0 row += 1 - + check.connect("toggled", self.__change) - + self.show_all() - + def get_active_options(self): """ Devuelve los indices de las opciones activas. """ - + activas = [] - + options = self.get_children() - + for child in options: - + if child.get_active(): activas.append(child.indice) - + return activas - + def __change(self, widget): """ Cuando el usuario hace click sobre una opción, se checkean dependencias y se guardan los datos. """ - + if self.updating: return - + options = self.get_children() - + activan = [] - + for child in options: - + if child.get_active(): activan.append(child.indice) - + self.emit("new", activan) - + def update(self, dict): """ Cuando el usuario cambia de encuestado, actualiza sus respuestas en la pregunta. """ - + self.updating = True - + options = self.get_children() - + for child in options: if child.indice in dict.get("default", []): child.set_active(True) - + else: child.set_active(False) - + self.updating = False - + def reset(self): """ La pregunta vuelve a su estado original. """ - + options = self.get_children() - + activan = [] - + for child in options: child.set_active(False) - + ### Porque se debe avisar que esta pregunta se ha desactivado. self.emit("new", activan) - + class MyCheckButton(Gtk.CheckButton): - + def __init__(self, indice): - + Gtk.CheckButton.__init__(self) - + self.indice = indice - + self.show_all() - + class MyRadioButton(Gtk.RadioButton): - + def __init__(self, indice): - + Gtk.RadioButton.__init__(self) - + self.indice = indice - + self.show_all() - + class My_Alert_Dialog(Gtk.Dialog): """ Dialogo que alerta al usuario sobre una acción que obliga a perder los datos. """ - + def __init__(self, parent_window = None, label = ""): - + Gtk.Dialog.__init__( self, title = "ATENCION !", parent = parent_window, flags = Gtk.DialogFlags.MODAL, buttons = ["OK", Gtk.ResponseType.ACCEPT]) - + label = Gtk.Label(label) label.show() - + self.set_border_width(10) - + self.vbox.pack_start(label, True, True, 0) - + class ToolbarEncuesta(Gtk.Toolbar): - + __gsignals__ = { "accion":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_STRING,))} - + def __init__(self): - + Gtk.Toolbar.__init__(self) - + separador = Gtk.SeparatorToolItem() separador.props.draw = False separador.set_size_request(0, -1) separador.set_expand(True) - + self.insert(separador, -1) - + item = Gtk.ToolItem() item.set_expand(False) self.anterior = Gtk.Button("Pag. Anterior") @@ -1506,7 +1506,7 @@ class ToolbarEncuesta(Gtk.Toolbar): self.anterior.show() item.add(self.anterior) self.insert(item, -1) - + item = Gtk.ToolItem() item.set_expand(False) self.siguiente = Gtk.Button("Pag. Siguiente") @@ -1515,193 +1515,182 @@ class ToolbarEncuesta(Gtk.Toolbar): self.siguiente.show() item.add(self.siguiente) self.insert(item, -1) - + self.show_all() - + def __button_clicked(self, widget): - + self.emit("accion", widget.get_label()) - + class InfoWidget(Gtk.EventBox): """ Widget con información sobre encuesta en proceso. """ - + def __init__(self): - + Gtk.EventBox.__init__(self) - + self.toolbar = Gtk.Toolbar(orientation = Gtk.Orientation.HORIZONTAL) - + self.info = {} - + self.poll_name = Gtk.Label("Encuesta: ") self.pollster_username = Gtk.Label("Encuestador: ") self.encuestado = Gtk.Label("Encuestado: ") - + self.poll_name.show() self.pollster_username.show() self.encuestado.show() - + separador = Gtk.SeparatorToolItem() separador.props.draw = False separador.set_size_request(5, -1) separador.set_expand(False) self.toolbar.insert(separador, -1) - + item = Gtk.ToolItem() item.set_expand(False) item.add(self.poll_name) self.toolbar.insert(item, -1) - + separador = Gtk.SeparatorToolItem() separador.props.draw = False separador.set_size_request(5, -1) separador.set_expand(False) self.toolbar.insert(separador, -1) - + item = Gtk.ToolItem() item.set_expand(False) item.add(self.pollster_username) self.toolbar.insert(item, -1) - + separador = Gtk.SeparatorToolItem() separador.props.draw = False separador.set_size_request(5, -1) separador.set_expand(False) self.toolbar.insert(separador, -1) - + item = Gtk.ToolItem() item.set_expand(False) item.add(self.encuestado) self.toolbar.insert(item, -1) - + separador = Gtk.SeparatorToolItem() separador.props.draw = False separador.set_size_request(0, -1) separador.set_expand(True) self.toolbar.insert(separador, -1) - + self.add(self.toolbar) - + self.show_all() - + def set_encuestado(self, encuestado): - + self.encuestado.set_text("Encuestado: %s" % encuestado) - + def set_info(self, dict): """ Ejemplo: - + dict = { "poll_name": "Encuesta de Prueba", "poll_id": "111111111111111111111111", "pollster_id": "5163fe24421aa9263991b229", "pollster_username": "José Antonio Rodriguez"} """ - + for key in dict.keys(): self.info[key] = dict[key] - + self.poll_name.set_text("Encuesta: %s" % self.info["poll_name"]) self.pollster_username.set_text("Encuestador: %s" % self.info["pollster_username"]) - + self.show_all() - + def get_info(self): - + return self.info - + class GeneralWidget(Gtk.Box): """ Lista Dinámica de encuestados, para encuestas de tipo general. """ - + __gsignals__ = { "new-selection":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT,)), "new_encuestado":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, ))} - + def __init__(self, encuestados): - + Gtk.Box.__init__(self, orientation = Gtk.Orientation.VERTICAL) - + self.lista = None self.listas = {} - + encabezado = encuestados[0] encuestados = encuestados[1:] - + grupos = [] - + id_grado = encabezado.index("GRADO") id_grupo = encabezado.index("GRUPO") - + ### Obteniendo los grupos en la lista. for encuestado in encuestados: grado = encuestado[id_grado] grupo = encuestado[id_grupo] - + item = "%s %s" % (grado, grupo) - + if not item in grupos: grupos.append(item) self.listas[item] = [encabezado] - + self.listas[item].append(encuestado) - + combo = ComboGrupos() - + self.pack_start(combo, False, False, 0) - + for g in grupos: combo.append_text(g) - + self.scroll_list = Gtk.ScrolledWindow() - + self.scroll_list.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) # self.scroll_list.add_with_viewport(self.lista) - + self.pack_start(self.scroll_list, True, True, 0) - + box = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) - + #anterior = Gtk.Button("Anterior") continuar = Gtk.Button("Continuar") siguiente = Gtk.Button("Siguiente") - + #box.pack_start(anterior, True, True, 0) box.pack_start(continuar, True, True, 0) box.pack_start(siguiente, True, True, 0) - + self.pack_start(box, False, False, 0) - + self.show_all() - + combo.connect("new", self.__new_group) - + combo.select(grupos[0]) self.__new_group(None, grupos[0]) # Forzar nueva lista - - #anterior.connect("clicked", self.__anterior) + continuar.connect("clicked", self.__continuar) siguiente.connect("clicked", self.__siguiente) - - #def __anterior(self, widget): - - # modelo, iter = self.get_selected_item() - - # if modelo.iter_previous(iter): - # while Gtk.events_pending(): - # Gtk.main_iteration() - - # self.lista.treeselection.select_iter(modelo.iter_previous(iter)) - + def __siguiente(self, widget): """ Obtiene el item seleccionado en la lista. @@ -1714,146 +1703,149 @@ class GeneralWidget(Gtk.Box): parent_window = self.get_toplevel(), label = msg) response = dialog.run() - + if Gtk.ResponseType(response) != Gtk.ResponseType.ACCEPT: dialog.destroy() return - + dialog.destroy() - + modelo, iter = self.get_selected_item() - + if not modelo.iter_next(iter): item = [] - + for x in range(0, self.get_num_columns()): valor = modelo.get_value(iter, x) item.append(str(valor)) - + item[-1] = str(int(item[-1]) + 1) - + ### Agregar a la lista de este grupo columnas = self.lista.get_columns() - + for columna in columnas: cabecera = columna.get_title() - + if cabecera == "GRADO": id_grado = columnas.index(columna) - + if cabecera == "GRUPO": id_grupo = columnas.index(columna) - + grado = modelo.get_value(iter, id_grado) grupo = modelo.get_value(iter, id_grupo) - + valor = "%s %s" % (grado, grupo) self.listas[valor].append(item) ### Agregar a la lista de este grupo - + self.lista.add_encuestados([item]) - + self.emit("new_encuestado", item) - + while Gtk.events_pending(): Gtk.main_iteration() - + self.lista.treeselection.select_iter(modelo.iter_next(iter)) - + # FIXME: Ver si se puede insensibilizar la linea. # Probablemente no se pueda y haya que usar filtros. # modelo[iter] http://faq.pygtk.org/index.py?file=faq13.048.htp&req=show - + def __new_group(self, widget, valor): - + if self.lista: self.lista.destroy() - + self.lista = Lista(self.listas[valor]) self.lista.set_headers_clickable(False) - + self.lista.connect("new-selection", self.__new_selection) self.scroll_list.add_with_viewport(self.lista) - + self.scroll_list.set_size_request(200,-1) - + def __continuar(self, widget): - + self.get_toplevel().menu_bar.hide() + self.get_toplevel().infowidget.hide() self.get_parent().get_parent().get_parent().hide() - + def __new_selection(self, widget, encuestado): """ Cuando el usuario cambia de Encuestado. """ - + self.emit("new-selection", encuestado) - + self.scroll_list.hide() - + self.get_toplevel().menu_bar.hide() + self.get_toplevel().infowidget.hide() + def get_selected_item(self): """ Devuelve modelo de la lista e iter seleccionado. """ - + return self.lista.get_selected_item() - + def get_num_columns(self): """ Devuelve la cantidad de columnas de la lista. """ return self.lista.get_num_columns() - + class ComboGrupos(Gtk.ComboBoxText): - + __gsignals__ = { "new":(GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, (GObject.TYPE_STRING,))} - + def __init__(self): - + Gtk.ComboBoxText.__init__(self) - + self.updating = False - + self.show_all() - + def select(self, valor): """ Setea el combo a un valor específico. """ - + self.updating = True - + model = self.get_model() item = model.get_iter_first() - + count = 0 - + while item: if model.get_value(item, 0) == str(valor): self.set_active(count) self.updating = False - + return - + item = model.iter_next(item) count += 1 - + self.updating = False - + def do_changed(self): """ Cuando el usuario hace click sobre una opción. """ - + if self.updating: return - + self.emit("new", self.get_active_text()) - + class Wizard(Gtk.Dialog): - + def __init__(self, parent_window = None): - + Gtk.Dialog.__init__( self, title = "Asistente", parent = parent_window, @@ -1861,25 +1853,25 @@ class Wizard(Gtk.Dialog): buttons = [ "Proceder", Gtk.ResponseType.ACCEPT, "Cancelar", Gtk.ResponseType.CANCEL]) - + self.set_border_width(5) - + abrirencuesta = Gtk.Button("Buscar . . .") abrirlista = Gtk.Button("Buscar . . .") cargarencuesta = Gtk.Button("Buscar . . .") - + abrirencuesta.connect("clicked", self.__abrir_encuesta) abrirlista.connect("clicked", self.__abrir_lista) cargarencuesta.connect("clicked", self.__cargar_encuesta) - + self.label_1 = Gtk.Label("") self.label_2 = Gtk.Label("") self.label_3 = Gtk.Label("") - + frame0 = Gtk.Frame() box0 = Gtk.Box(orientation = Gtk.Orientation.VERTICAL) frame0.add(box0) - + frame = Gtk.Frame() frame.set_label("Seleccionar Nueva Encuesta. (archivo *.json)") box = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) @@ -1887,9 +1879,9 @@ class Wizard(Gtk.Dialog): box.pack_start(self.label_1, False, False, 0) frame.add(box) frame.show_all() - + box0.pack_start(frame, False, False, 10) - + frame = Gtk.Frame() frame.set_label("Seleccionar Nueva Lista. (archivo *.csv)") box = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) @@ -1897,13 +1889,13 @@ class Wizard(Gtk.Dialog): box.pack_start(self.label_2, False, False, 0) frame.add(box) frame.show_all() - + box0.pack_start(frame, False, False, 10) - + self.vbox.pack_start(frame0, False, False, 30) - + frame0.show_all() - + frame = Gtk.Frame() frame.set_label("Seleccionar Encuesta Anterior. (archivo *.encuesta)") box = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL) @@ -1911,90 +1903,90 @@ class Wizard(Gtk.Dialog): box.pack_start(self.label_3, False, False, 0) frame.add(box) frame.show_all() - + self.vbox.pack_start(frame, False, False, 10) - + self.set_border_width(5) self.set_size_request(500, 300) - + def __abrir_encuesta(self, widget): """ Recuperar encuesta parcial o totalmente respondida. """ - + filechooser = My_FileChooser( parent_window = self, action_type = Gtk.FileChooserAction.OPEN, filter_type = None, title = "Cargar Nueva Encuesta") - + filechooser.connect("load", self.__set_encuesta) - + def __abrir_lista(self, widget): """ Abrir lista a encuestar. """ - + filechooser = My_FileChooser( parent_window = self, action_type = Gtk.FileChooserAction.OPEN, filter_type = "text/csv", title = "Cargar Lista a Encuestar") - + filechooser.connect("load", self.__set_encuestados) - + def __cargar_encuesta(self, widget): """ Abrir encuesta vacía. """ - + filechooser = My_FileChooser( parent_window = self, action_type = Gtk.FileChooserAction.OPEN, #filter_type = "text/encuesta", title = "Recuperar Encuesta") - + filechooser.connect("load", self.__set_encuesta_respondida) - + def __set_encuesta(self, widget, archivo): """ Las encuestas respondidas son *.json o *.slv. """ - + extension = os.path.splitext(os.path.split(archivo)[1])[1] - + if "json" in extension or "slv" in extension: self.label_1.set_text(archivo) - + def __set_encuestados(self, widget, archivo): """ Las listas son *.csv. """ - + extension = os.path.splitext(os.path.split(archivo)[1])[1] - + if "csv" in extension: self.label_2.set_text(archivo) - + def __set_encuesta_respondida(self, widget, archivo): """ Las encuestas respondidas son *.encuesta. """ - + extension = os.path.splitext(os.path.split(archivo)[1])[1] - + if "encuesta" in extension: self.label_3.set_text(archivo) - + class Password_Dialog(Gtk.Dialog): """ Dialogo para introdicir password y acceder a opciones de Encuestador. """ - + def __init__(self, parent_window = None, title = "ATENCION !", label = ""): - + Gtk.Dialog.__init__( self, title = title, parent = parent_window, @@ -2002,29 +1994,32 @@ class Password_Dialog(Gtk.Dialog): buttons = [ "Aceptar", Gtk.ResponseType.ACCEPT, "Cancelar", Gtk.ResponseType.CANCEL]) - + label = Gtk.Label(label) label.show() - + self.entry = Gtk.Entry() - self.entry.show() - + self.entry.set_visibility(False) + self.set_border_width(10) - + + self.entry.show() + self.set_default_response(Gtk.ResponseType.ACCEPT) + self.vbox.pack_start(label, True, True, 0) self.vbox.pack_start(self.entry, True, True, 0) - + def get_password(self): """ Deveulve el password introducido. """ - + return self.entry.get_text().strip() - + class My_Alert_Dialog2(Gtk.Dialog): - + def __init__(self, parent_window = None, label = ""): - + Gtk.Dialog.__init__( self, title = "ATENCION !", parent = parent_window, @@ -2032,11 +2027,11 @@ class My_Alert_Dialog2(Gtk.Dialog): buttons = [ "Aceptar", Gtk.ResponseType.ACCEPT, "Cancelar", Gtk.ResponseType.CANCEL]) - + label = Gtk.Label(label) label.show() - + self.set_border_width(10) - + self.vbox.pack_start(label, True, True, 0) - + |