elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Temas
Páginas: [1]
1  Sistemas Operativos / GNU/Linux / ubuntu 10.04 no arranca interface grafica en: 5 Junio 2010, 19:05 pm
Pues eso, que he actualizado de 9 a 10.04 mi Ubuntu, y me arranca en consola, y cada vez tengo que meter el comando sudo /etc/init.d/gdm start.
   ¿Que hago para que entre directamente en graficos?.
  Saludos : Gaby
2  Programación / Scripting / python, GTK y MySQL en: 5 Abril 2010, 18:34 pm
   Bueno, pues para ir practicando con python, en entorno grafico GTK, y con bases de datos MySQL, he hecho estos widgets heredados de widgets GTK, para poder manejar tablas MySQL, no esta demasiado comentado, si a alguien le interesa el tema puede consultarme lo que quiera.
   Estoy preparando un programita ejemplo de uso de estos widgets, lo enviare proximamente.
   Tened en cuenta que os hace falta ademas del python, el motor de BD MySQL, GTK2 y las librerias de python para MySQL, mysqldb y para gtk pygtk.
   Ala, saludos : Gaby

Código
  1. #!/usr/bin/env python
  2.  
  3. import pygtk
  4. pygtk.require('2.0')
  5. import gtk
  6. import MySQLdb  
  7.  
  8.  
  9. class Database:
  10.    def __init__(self,database,usuario=None,password=None):
  11.        self.database_nombre=database
  12.  
  13.        self.conectada=False
  14.        if usuario!=None:
  15.            self.mysquser=usuario
  16.        else:            
  17.            self.mysquser='usuario' #podemos poner el valor en la clase si va a ser siempre el mismo
  18.        if password!=None:
  19.            self.mysqpasw=password
  20.        else:
  21.            self.mysqpasw='********' #podemos poner el password por defecto, igual que el usuario
  22.        self.conexion=None
  23.  
  24.    def conectar(self):
  25.        try:
  26.            self.conexion=MySQLdb.connect(host='localhost',user=self.mysquser,passwd=self.mysqpasw,db=self.database_nombre)
  27.            self.conectada=True
  28.            return self.conexion
  29.        except:
  30.            #error, sacamos dialogo y decimos que hagan configuracion
  31.            md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  32.                        gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error conectando a base de datos\n Compruebe configuracion\n o MySQL")
  33.            md.run()
  34.            md.destroy()
  35.            return False
  36.  
  37.    def set_dbdatos(self,usuario=None,password=None):
  38.  
  39.        if usuario!=None:
  40.            self.mysquser=usuario
  41.        if password!=None:
  42.            self.mysqpasw=password
  43.  
  44.  
  45.  
  46.  
  47. class Tabla:
  48.  
  49.  
  50.  
  51.    def __init__(self,tabla,basedatos):
  52. # los errores en valores de datos en el sql, no da error da warning, lo
  53. # pasamos a error para poder trabajar con try: except:
  54.        import warnings
  55.        warnings.simplefilter("error")
  56.  
  57.        self.database=basedatos
  58.        self.abierta=False
  59.        self.tabla=tabla
  60.        self.datos_tabla=[]
  61.        self.widgets=[]
  62.        self.descripcion_tabla=[]
  63.        self.nombre_campos=[]
  64.        self.tipo_campos=[]
  65.        self.long_campos=[]
  66.        self.num_campos=0
  67.        self.num_lineas=0
  68.        self.tablas_rel=[]
  69.        self.campos_rel=[]
  70.        self.estado='consultar'
  71.        self.linea_actual=[]
  72.        self.indexado=False
  73.        self.indice=''
  74.        self.abrir()
  75.  
  76.  
  77.  
  78.    def abrir(self):
  79.        #abre la tabla
  80.        res=self.abre_tabla()
  81.  
  82.        if res:
  83.                self.datos_tabla=self.cursor.fetchall()
  84.                self.num_lineas=len(self.datos_tabla)
  85.                self.linea_actual=self.datos_tabla[0]
  86.                self.linea_pos=0  
  87.                #num_campos lleva el numero de campos
  88.                self.num_campos=len(self.cursor.description)
  89.                for i in range(self.num_campos):
  90.                    self.nombre_campos.append(self.cursor.description[i][0])
  91.                    self.tipo_campos.append(self.cursor.description[i][1])
  92.                    self.long_campos.append(self.cursor.description[i][3])
  93.  
  94.        #cerramos la tabla y la base de datos, y trabajamos con los
  95.        #datos en la variable datos_tabla
  96.        self.cierra_tabla()
  97.        return res
  98.  
  99.  
  100.    def abre_tabla(self):
  101.  
  102.        #conectamos la base de datos
  103.        self.conn=self.database.conectar()
  104.        self.cursor=self.conn.cursor()  
  105.  
  106.        if self.database.conectada==True: #True si estamos conectados a la base de datos
  107.            try:
  108.                sql='select * from '+self.tabla
  109.                if self.indexado:
  110.                    sql=sql+' order by '+self.indice
  111.                self.cursor.execute(sql)
  112.                self.abierta=True
  113.                result=True
  114.            except:
  115.                #error, sacamos dialogo y decimos que hagan configuracion
  116.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  117.                        gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error abriendo tabla\n Compruebe configuracion\n o MySQL")
  118.                md.run()
  119.                md.destroy()
  120.                result=False
  121.        else:
  122.            #la base de datos no esta conectada
  123.                #error, sacamos dialogo y decimos que hagan configuracion
  124.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  125.                        gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Base de datos no abierta\n Compruebe configuracion\n o MySQL")
  126.                md.run()
  127.                md.destroy()  
  128.                result=False  
  129.        return result
  130.  
  131.    def cierra_tabla(self):
  132.        self.cursor.close()
  133.        self.conn.close()
  134.  
  135.    def set_indice(self,indexado,*indice):
  136.        if indexado:
  137.            self.indexado=True
  138.            self.indice=indice[0]
  139.            self.abrir()
  140.        else:
  141.            self.indexado=False
  142.  
  143.    def set_tabla(self,tabla):
  144.        self.tabla=tabla
  145.        self.abrir()
  146.  
  147.    def adelante(self,widget):
  148.            # una fila adelante en la tabla.
  149.            if self.linea_pos<self.num_lineas-1:
  150.                self.linea_pos+=1
  151.                self.linea_actual=self.datos_tabla[self.linea_pos]
  152.                result=True
  153.                if self.linea_pos==self.num_lineas-1:
  154.                    result=False
  155.                self.actualizar()
  156.            else:
  157.                #hemos alcanzado final tabla
  158.                result=False
  159.            return result
  160.  
  161.    def atras(self,widget):
  162.            #una fila hacia atras, si es la primera, no cambia
  163.            if self.linea_pos>0:
  164.                self.linea_pos-=1
  165.                self.linea_actual=self.datos_tabla[self.linea_pos]
  166.                result=True
  167.                if self.linea_pos==0:
  168.                    result=False                
  169.                self.actualizar()
  170.            else:
  171.                #principio de tabla
  172.                result=False
  173.            return result
  174.  
  175.    def primero(self,widget):
  176.            self.linea_pos=0
  177.            self.linea_actual=self.datos_tabla[self.linea_pos]
  178.            self.actualizar()
  179.            return True
  180.  
  181.    def ultimo(self,widget):
  182.            self.linea_pos=self.num_lineas-1
  183.            self.linea_actual=self.datos_tabla[self.linea_pos]
  184.            self.actualizar()
  185.            return True
  186.  
  187.    def aplica_edicion(self):
  188.        #aqui salvamos los datos editados
  189.        #primero seleccionamos la fila de la tabla a cambiar
  190.        #los datos sin editar estan en la variable linea_actual[]
  191.        #hacemos el select con todos los campos, pues no sabemos
  192.        #si hay dos lineas con campos iguales.
  193.        #primero abrimos tabla
  194.        #pero antes guardamos el puntero que llevabamos
  195.        linea_antes=self.linea_pos
  196.        self.abre_tabla()
  197.        datos_antes=''
  198.        for i in range(self.num_campos):
  199.            campo=self.nombre_campos[i]
  200.            dato=str(self.linea_actual[i])
  201.            if dato!='' and dato!='None':
  202.                datos_antes=datos_antes+campo+' = "'+dato+'" AND '  
  203.        datos_antes=str(datos_antes[0:len(datos_antes)-4])    
  204.        sql='select * from '+self.tabla+' where '+datos_antes  
  205.        try:
  206.            self.cursor.execute(sql)
  207.        except:
  208.            #error, el registro a modificar tenia valores inconsistentes
  209.            md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  210.                                gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error en registro\n Debe arreglarlo desde\n Administrador MySQL\n")
  211.            md.run()
  212.            md.destroy()
  213.            return False
  214.  
  215.        #una vez seleccionada la linea a modificar, comprobamos que es una
  216.        # y solo una.
  217.        if self.cursor.rowcount != 1:
  218.            #error, sacamos dialogo y decimos que comprueben datos
  219.            md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  220.                                gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error al grabar datos\n Mas de un registro cambiado\n ")
  221.            md.run()
  222.            md.destroy()
  223.            return False
  224.        else:
  225.            #correcto, anotamos los nuevos valores
  226.            sql='update '+self.tabla+' set '
  227.            for i in range(self.num_campos):
  228.                campo=self.nombre_campos[i]
  229.                dato=self.widgets[i].get_text()
  230.                if dato!='':
  231.                    if i<self.num_campos-1:
  232.                        sql=sql+campo+' = "'+dato+'" , '
  233.                    else:
  234.                        sql=sql+campo+' = "'+dato+'"'
  235.                else:
  236.                    if i<self.num_campos-1:
  237.                        sql=sql+campo+' = NULL, '
  238.                    else:
  239.                        sql=sql+campo+' = NULL'            
  240.            sql=sql+' where '+datos_antes
  241.            try:
  242.                self.cursor.execute(sql)  
  243.                #abrir abre la tabla, carga las datos en variables y cierra tabla
  244.                self.abrir()
  245.                #dejamos en pantalla el registro modificado
  246.                self.linea_pos=linea_antes
  247.  
  248.                #quita el estado de edicion de los widgets
  249.                self.estado_consulta()
  250.                result=True        
  251.            except:
  252.                #error, sacamos dialogo y decimos que comprueben datos
  253.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  254.                                     gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error al grabar datos\n Compruebe datos \n o Cancele")
  255.                md.run()
  256.                md.destroy()
  257.                result=False
  258.  
  259.        return result
  260.  
  261.    def aplica_alta(self):
  262.        #anota nuevo registro en la tabla
  263.        #aqui salvamos los datos anotados
  264.        #primero abrimos tabla
  265.  
  266.        self.abre_tabla()
  267.        #correcto, anotamos los nuevos valores
  268.        sql='insert into '+self.tabla+' values ( '
  269.        vacio=True
  270.        for i in range(self.num_campos):
  271.            dato=self.widgets[i].get_text()
  272.            if dato != '':
  273.                vacio=False
  274.                if i<self.num_campos-1:
  275.                    sql=sql+'"'+dato+'" , '
  276.                else:
  277.                    sql=sql+'"'+dato+'" )'
  278.            else:
  279.                if i<self.num_campos-1:
  280.                    sql=sql+' NULL, '
  281.                else:
  282.                    sql=sql+' NULL )'    
  283.        if vacio:
  284.                #error, sacamos dialogo y decimos que comprueben datos
  285.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  286.                                     gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"No se puede guardar un\n Registro vacio\n")
  287.                md.run()
  288.                md.destroy()
  289.                return False    
  290.        try:
  291.            self.cursor.execute(sql)
  292.            result=True
  293.            self.abrir()
  294.            self.estado_consulta()            
  295.        except:
  296.            #error, sacamos dialogo y decimos que comprueben datos
  297.            md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  298.                    gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error al grabar datos\n Compruebe datos \n o Cancele")
  299.            md.run()
  300.            md.destroy()  
  301.            result=False            
  302.        return result
  303.  
  304.  
  305.    def borrar(self):
  306.        #primero seleccionamos la fila de la tabla a borrar
  307.        #los datos estan en la variable linea_actual[]
  308.        #hacemos el select con todos los campos, pues no sabemos
  309.        #si hay dos lineas con campos iguales.
  310.        #primero abrimos tabla
  311.        #pero antes guardamos el puntero que llevabamos
  312.        linea_antes=self.linea_pos
  313.        self.abre_tabla()
  314.        datos_antes=''
  315.        for i in range(self.num_campos):
  316.            campo=self.nombre_campos[i]
  317.            dato=str(self.linea_actual[i])
  318.            if dato!='' and dato!='None':
  319.                datos_antes=datos_antes+campo+' = "'+dato+'" AND '  
  320.        datos_antes=str(datos_antes[0:len(datos_antes)-4])    
  321.        sql='select * from '+self.tabla+' where '+datos_antes  
  322.        try:
  323.            self.cursor.execute(sql)
  324.  
  325.        except:
  326.            #error, el registro a modificar tenia valores inconsistentes
  327.            md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  328.                                gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error en registro\n Debe arreglarlo desde\n Administrador MySQL\n")
  329.            md.run()
  330.            md.destroy()
  331.            return False
  332.  
  333.        #una vez seleccionada la linea a borrar, comprobamos que es una
  334.        # y solo una.
  335.        if self.cursor.rowcount != 1:
  336.            #error, sacamos dialogo y decimos que comprueben datos
  337.            md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  338.                                gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error al borrar registro\n Mas de un registro seleccionado\n ")
  339.            md.run()
  340.            md.destroy()
  341.            return False
  342.        else:
  343.            #correcto, borramos la linea
  344.            sql='delete from '+self.tabla+' where '+datos_antes
  345.  
  346.            try:
  347.                self.cursor.execute(sql)  
  348.                #abrir abre la tabla, carga las datos en variables y cierra tabla
  349.                self.abrir()
  350.                #dejamos en pantalla el registro modificado
  351.                self.linea_pos=linea_antes
  352.                #quita el estado de edicion de los widgets
  353.                self.estado_consulta()
  354.                result=True        
  355.            except:
  356.                #error, sacamos dialogo y decimos que comprueben datos
  357.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  358.                                     gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error al borrar registro\n Compruebe datos \n o Cancele")
  359.                md.run()
  360.                md.destroy()
  361.                result=False
  362.  
  363.        return result
  364.  
  365.    def cancelar(self):
  366.        puntero=self.linea_pos
  367.        self.abrir()
  368.        self.linea_pos=puntero
  369.        self.linea_actual=self.datos_tabla[self.linea_pos]        
  370.        self.actualizar()  
  371.        self.estado_consulta()
  372.        return
  373.  
  374.    def buscar(self,campo,valor):
  375.        for n in range(self.num_campos):
  376.            if campo==self.nombre_campos[n]:
  377.                campo_index= n
  378.        encontrado=False  
  379.        for n in range(len(self.datos_tabla)):
  380.            if self.datos_tabla[n][campo_index]==valor:
  381.                self.linea_actual=self.datos_tabla[n]
  382.                encontrado=True
  383.                self.actualizar()
  384.                break
  385.        return encontrado
  386.  
  387.    def actualizar(self):
  388.            #isinstance(obj, int)
  389.            for w in self.widgets:
  390.                w.actualizar_widget()
  391.            self.actualizar_datos_relacionada()
  392.            return True
  393.  
  394.    def estado_consulta(self):
  395.        #pone los widgets en estado de consulta
  396.        self.estado='consultar'
  397.        for w in self.widgets:
  398.            w.set_editable(False)    
  399.  
  400.    def estado_editar(self):
  401.        #pone los widgets en estado de edicion
  402.        self.estado='editar'
  403.        for w in self.widgets:
  404.            w.set_editable(True)
  405.  
  406.    def estado_alta(self):
  407.        #pone los widgets en alta, en blanco
  408.        self.estado='alta'
  409.        for w in self.widgets:
  410.            w.set_text('')
  411.            w.set_editable(True)
  412.  
  413.    def widget_a_tabla(self,widget,campo):
  414.            self.widgets.append(widget)
  415.            result=-1
  416.            for n in range(self.num_campos):
  417.                if campo==self.nombre_campos[n]:
  418.                    result= n
  419.  
  420.            return result
  421.  
  422.    def relacionar(self,campoprop,tablarel,camporel):
  423.        #relaciona otra tabla con esta, recibe, campo propio
  424.        #tabla esclava a relacionar, y campo de la tabla a relacionar
  425.        result=-1
  426.        for n in range(self.num_campos):
  427.            if campoprop==self.nombre_campos[n]:
  428.                result= n
  429.                self.tablas_rel.append(tablarel)
  430.                self.campos_rel.append(n)
  431.                #envia a la tabla peticionaria, la identidad de esta tabla
  432.                #y el campo de la peticionaria
  433.                tablarel.relacionada(self,camporel)
  434.        return result  
  435.  
  436.    def relacionada(self,trelacion,camporel):
  437.        self.camporel=camporel
  438.        self.tablarelacion=trelacion
  439.  
  440.    def actualizar_datos_relacionada(self):
  441.            for t in range(len(self.tablas_rel)):
  442.                dato=self.linea_actual[self.campos_rel[t]]
  443.                tabla=self.tablas_rel[t]
  444.                tabla.actualizar_tabla(dato)
  445.            return True
  446.    def actualizar_tabla(self,dato):
  447.        self.buscar(self.camporel,dato)
  448.  
  449.  
  450.  
  451.  
  452. class DBLabel(gtk.Label):
  453.    #un label enlazado a una tabla y un campo de la misma
  454.    def __init__(self,tabla,campo=None,orden=None,titular=False):
  455.        #si no nos dan el campo, y se da el orden del campo,
  456.        #campo=None y orden = n, posicion en la tabla de la columna
  457.        #si titular=True, anteponemos el nombre del campo al label
  458.        gtk.Label.__init__(self)  
  459.        self.tabla=tabla
  460.        self.titular=titular
  461.  
  462.        if campo==None:
  463.            self.campo=self.tabla.nombre_campos[orden]
  464.        else:
  465.            self.campo=campo
  466.  
  467.        res=self.campo_index=tabla.widget_a_tabla(self,self.campo)
  468.        if res==-1:
  469.            #error, campo de tabla no encontrado
  470.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  471.                                     gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error, campo de tabla \n No existente \n")
  472.                md.run()
  473.                md.destroy()
  474.        self.titulo=self.campo+' : '                
  475.        self.show()
  476.        self.actualizar_widget()
  477.  
  478.    def set_titulo(self,titulo):
  479.        #pone el nombre que deseemos en titulo, en lugar del nombre del campo
  480.        self.titulo=titulo+' : '
  481.        self.titular=True
  482.  
  483.    def actualizar_widget(self):
  484.  
  485.        texto=self.tabla.linea_actual[self.campo_index]
  486.        if self.titular:
  487.            texto=self.titulo+str(texto)
  488.        self.set_text(str(texto))
  489.  
  490. class DBEntry(gtk.HBox):
  491.    #un label enlazado a una tabla y un campo de la misma
  492.    def __init__(self,tabla,campo=None,orden=None,titular=False):
  493.        #si no nos dan el campo, y se da el orden del campo,
  494.        #campo=None y orden = n, posicion en la tabla de la columna
  495.        #si titular=True, anteponemos el nombre del campo al label
  496.        gtk.HBox.__init__(self)  
  497.        self.set_size_request(500,40)
  498.        self.set_homogeneous(False)
  499.        self.entry=gtk.Entry()
  500.        self.entry.set_editable(False)
  501.        self.label=gtk.Label()
  502.        self.pack_start(self.label,False,False,False)
  503.        self.pack_end(self.entry,False,False,False)
  504.        self.entry.show()
  505.        self.label.show()
  506.        self.show()
  507.        self.tabla=tabla
  508.        self.titular=titular
  509.        if campo==None:
  510.            self.campo=self.tabla.nombre_campos[orden]
  511.        else:
  512.            self.campo=campo
  513.        #campo_index lleva el numero de campo en la tabla
  514.        res=self.campo_index=tabla.widget_a_tabla(self,self.campo)
  515.        if res==-1:
  516.            #error, campo de tabla no encontrado
  517.                md=gtk.MessageDialog(None,gtk.DIALOG_DESTROY_WITH_PARENT,
  518.                                     gtk.MESSAGE_ERROR,gtk.BUTTONS_CLOSE,"Error, campo de tabla \n No existente \n")
  519.                md.run()
  520.                md.destroy()
  521.  
  522.        self.titulo=self.campo+' : '
  523.        #poner anchura adaptada a la del campo
  524.        ancho=tabla.long_campos[self.campo_index]
  525.        self.entry.set_max_length(ancho)
  526.        self.entry.set_width_chars(ancho)
  527.        self.actualizar_widget()
  528.  
  529.    def set_titulo(self,titulo):
  530.        #pone el nombre que deseemos en titulo, en lugar del nombre del campo
  531.        self.titulo=titulo+' : '
  532.        self.titular=True
  533.  
  534.  
  535.    def set_editable(self,estado):
  536.        self.entry.set_editable(estado)
  537.  
  538.    def get_text(self):
  539.        return self.entry.get_text()
  540.  
  541.    def set_text(self,texto):
  542.        self.entry.set_text(texto)
  543.  
  544.    def actualizar_widget(self):
  545.  
  546.        texto=self.tabla.linea_actual[self.campo_index]
  547.        if self.titular:
  548.                self.label.set_text(self.titulo+' : ')
  549.                self.label.set_alignment(0,0.5)  
  550.        self.entry.set_text(str(texto))
  551.  
  552. class Navegador(gtk.HButtonBox):
  553.    def __init__(self,tabla,main=None):
  554.        #conjunto de botones para navegar y actuar sobre la tabla
  555.        gtk.HButtonBox.__init__(self)
  556.        self.main=main
  557.        self.tabla=tabla
  558.        self.estado='consultar'
  559.        self.set_homogeneous(False)
  560.        # METEMOS LOS BOTONES
  561.        self.principio=gtk.Button('<<')
  562.        self.add(self.principio)
  563.        self.principio.connect_object("clicked", self.movimiento, self.principio)
  564.        self.atras=gtk.Button('<')
  565.        self.add(self.atras)
  566.        self.atras.connect_object("clicked", self.movimiento, self.atras)
  567.        self.delante=gtk.Button('>')
  568.        self.add(self.delante)
  569.        self.delante.connect_object("clicked", self.movimiento, self.delante)
  570.        self.fin=gtk.Button('>>')
  571.        self.add(self.fin)
  572.        self.fin.connect_object("clicked", self.movimiento, self.fin)
  573.        self.editar=gtk.Button('Editar')
  574.        self.add(self.editar)
  575.        self.editar.connect_object("clicked", self.control, self.editar)
  576.        self.borrar=gtk.Button('Borrar')
  577.        self.add(self.borrar)
  578.        self.borrar.connect_object("clicked", self.control, self.borrar)
  579.        self.alta=gtk.Button('Alta')
  580.        self.add(self.alta)
  581.        self.alta.connect_object("clicked", self.control, self.alta)
  582.        self.aplicar=gtk.Button('Aplicar')
  583.        self.add(self.aplicar)
  584.        self.aplicar.connect_object("clicked", self.control, self.aplicar)  
  585.        self.cancelar=gtk.Button('Cancelar')
  586.        self.add(self.cancelar)
  587.        self.cancelar.connect_object("clicked", self.control, self.cancelar)
  588.        if main!=None:
  589.        #crea un toolbar en la ventana que contiene al navegador,
  590.        #donde representamos el numero de registro visualizado.
  591.            self.lestado=gtk.Label('inicio')  
  592.            labelitem=gtk.ToolItem()
  593.            labelitem.add(self.lestado)
  594.            self.toolb=gtk.Toolbar()
  595.            self.toolb.insert(labelitem,0)
  596.            main.vbox.pack_start(self.toolb,False,True)  
  597.            self.lestado.show()
  598.            labelitem.show()
  599.            self.toolb.show()  
  600.  
  601.        self.atras.show()
  602.        self.delante.show()
  603.        self.principio.show()
  604.        self.fin.show()
  605.        self.editar.show()
  606.        self.borrar.show()
  607.        self.alta.show()
  608.        self.show()
  609.        self.actualizar_widget()
  610.  
  611.    def actualizar_widget(self):
  612.        if self.tabla.linea_pos==0:
  613.            #primera linea
  614.            inicio=True
  615.            fin=False
  616.        elif self.tabla.linea_pos==len(self.tabla.datos_tabla)-1:
  617.            #ultima linea
  618.            fin=True
  619.            inicio=False
  620.        else:
  621.            inicio=False
  622.            fin=False  
  623.        if self.tabla.num_lineas==1:
  624.            #solo hay un registro, ni palante ni patras
  625.            inicio=True
  626.            fin=True
  627.        # oculta los botones que no estan operativos
  628.        if self.estado != 'consultar':
  629.            self.delante.hide()
  630.            self.fin.hide()  
  631.            self.atras.hide()
  632.            self.principio.hide()        
  633.            self.editar.hide()
  634.            self.alta.hide()
  635.            self.borrar.hide()
  636.            self.aplicar.show()
  637.            self.cancelar.show()
  638.            self.cancelar.grab_focus()
  639.            if self.main!=None:
  640.                self.lestado.set_text('Record : '+str(self.tabla.linea_pos)+' estado : '+self.estado)            
  641.        else:
  642.            self.delante.show()
  643.            self.fin.show()
  644.            self.atras.show()
  645.            self.principio.show()      
  646.            self.editar.show()
  647.            self.alta.show()
  648.            self.borrar.show()
  649.            self.aplicar.hide()
  650.            self.cancelar.hide()
  651.  
  652.            if self.main!=None:
  653.                self.lestado.set_text('Record : '+str(self.tabla.linea_pos))
  654.            if inicio:
  655.                self.atras.hide()
  656.                self.principio.hide()
  657.                # y anota en el label el numero de record mostrado
  658.                if self.main!=None:
  659.                    self.lestado.set_text('Record : '+str(self.tabla.linea_pos)+' Principio de fichero')            
  660.            if fin:
  661.                self.delante.hide()
  662.                self.fin.hide()
  663.                if self.main!=None:
  664.                    self.lestado.set_text('Record : '+str(self.tabla.linea_pos)+' Fin de fichero')
  665.  
  666.    def movimiento(self,widget):
  667.        if widget==self.delante:
  668.            self.tabla.adelante(widget)
  669.        elif widget==self.atras:
  670.            self.tabla.atras(widget)
  671.        elif widget==self.principio:
  672.            self.tabla.primero(widget)    
  673.        elif widget==self.fin:
  674.            self.tabla.ultimo(widget)  
  675.        self.actualizar_widget()
  676.  
  677.  
  678.    def control(self,widget):
  679.        res=True
  680.        if widget==self.editar:
  681.            self.estado='editar'
  682.            self.tabla.estado_editar()
  683.        elif widget==self.alta:
  684.            self.estado='alta'            
  685.            self.tabla.estado_alta()
  686.        elif widget==self.borrar:
  687.            self.tabla.estado='borrar'
  688.            self.estado='borrar'
  689.        elif widget==self.aplicar:
  690.            if self.estado=='editar':
  691.                #actualiza los datos en la tabla
  692.                res=self.tabla.aplica_edicion()
  693.                if res:
  694.                    self.estado='consultar'
  695.            elif self.estado=='alta':
  696.                res=self.tabla.aplica_alta()
  697.                if res:
  698.                    self.estado='consultar'
  699.            else:
  700.                self.tabla.borrar()
  701.                self.estado='consultar'
  702.  
  703.        elif widget==self.cancelar:
  704.            self.tabla.cancelar()
  705.            self.estado='consultar'
  706.        if res:
  707.            self.actualizar_widget()              
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
3  Programación / Ejercicios / Notacion Polaca Inversa en: 6 Marzo 2010, 13:37 pm
Hola, repasando mensajes por el Foro, he encontrado este post https://foro.elhacker.net/ejercicios/sugerencias-t34838.0.html;msg1229723#msg1229723 de Eliptico, y he recordado los viejos tiempos en los que trabajaba con mi calculadora Hewlett Packard, y la utilización que hacía la misma de la Notación Polaca Inversa, el algoritmo propuesto por Eliptico es la conversion de una expresión dada en notacion infixa a notación prefixa o notacion polaca.
   despues de estar un rato pensando en ella, he estado buscando por la red, y he encontrado este pseudocódigo que sirve para la Notación Polaca Inversa o notación postfixa.
  Lo adjunto y propongo la realización del programa en el lenguaje que deseeis, yo concretamente lo voy a realizar en python, que es el que estoy aprendiendo actualmente.

         Algoritmo para N.P.I. http://es.wikipedia.org/wiki/Algoritmo_shunting_yard
4  Programación / Scripting / Arranque de word desde batch indicando documento. en: 18 Febrero 2010, 14:58 pm
   A ver si algun alma caritativa que sea experto en patch, me dice que hago mal.

Código:
C:\Users\Gaby>dir \Users\gaby\desktop\ayuntamiento\mociones\
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: B42F-DE3C

 Directorio de C:\Users\gaby\desktop\ayuntamiento\mociones

18/02/2010  14:37    <DIR>          .
18/02/2010  14:37    <DIR>          ..
14/01/2010  11:47            18.432 0711291.doc
14/01/2010  12:45            21.504 07112910.doc
14/01/2010  12:48            19.968 07112911.doc
14/01/2010  12:54            19.456 07112912.doc



C:\Users\Gaby>\"Program Files"\"Microsoft Office"\Office\winword

C:\Users\Gaby>

Arranca word, con un dialogo que me dice
 " El nombre del documento o la ruta de acceso no son validos."
Hasta ahi correcto, pues no he indicado el documento, seguimos
Código:
C:\Users\Gaby>\"Program Files"\"Microsoft Office"\Office\winword \Users\gaby\des
ktop\ayuntamiento\mociones\0807314.doc

C:\Users\Gaby>
Arranca Word diciendo lo mismo,
 " El nombre del documento o la ruta de acceso no son validos."
He probado a cambiar de directorio, cambiandolo al que contiene el documento, resultado el mismo.
En fin, que no se que mas hacer.
El S.O. es Vista Home, el Word 2000.
Logicamente las pruebas en consola son porque a la orden que daba desde Python tambien daba el mismo error.
A ver si algun listo me dice que hago mal.
5  Programación / Bases de Datos / Instalacion de mysqldb en python y windows vista en: 15 Febrero 2010, 21:28 pm
Hola, soy nuevo en este foro, y no se si esta consulta ya se habra hecho, en caso de que asi sea, por favor decirme en que post esta.
Mi problema es la instalacion de mysqldb en python 2.6 y window vista, he bajado el fichero de marras, creo que si no me equivoco es el MySQL-Python-1.2.3c1 lo he descomprimido y me ha dado una serie de errores, algunos los he resuelto, por ejemplo uno de ellos esta en el fichero site.cfg, que describe el registro en windows del MySQL como version 5.0,  lo he cambiado por 5.1 y ha seguido avanzando, pero al final da un monton de errores.
  en fin, si alguien puede ayudarme se lo agradeceria.
   Saludos : Gaby
6  Foros Generales / Sugerencias y dudas sobre el Foro / Retorno al foro en: 15 Febrero 2010, 21:17 pm
Hola, hacía mucho tiempo que no entraba en este foro, de echo he intentado registrarme y me lo ha impedido porque el email estaba ocupado por otro usuario, que logicamente era yo, lo malo es que no recuerdo el usuario que utilice, y he tenido que registrarme dando el email de mi hija.
   a ver si podeis o bien cambiarme el email de mi nuevo usuario, dando de baja el anterior, o darme los datos del anterior, mi email es gamartinez@arrakis.es.
  Bueno, saludos a todos como novato que soy.
  Actualmente estoy jubilado, y me ha dado por empezar con Linux y Python, tengo algunas dudas que os ire consultando.
  Saludos a todos.
   Gaby
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines