Microcontroladores PIC en Linux.
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

módulos para una IDE en python

2 participantes

Ir abajo

para - módulos para una IDE en python Empty módulos para una IDE en python

Mensaje por Pikitin Sáb 13 Jun 2009 - 16:29

Estoy haciendo algunas cosillas en WxGlade con Python, la verdad es que se pueden hacer interfaces gráficas muy facilmente sin tener mucha idea de progaramación.

Este es un módulo que sirve tanto para seleccionar el compilador, programador y Pic a usar, como para cambiar las configuraciones de cada uno, los datos iniciales son leidos de un archivo de configuración y los cambios son grabados de nuevo a ese archivo. Esos datos servirán para determinar la acción de los botones ( o menú) compilar, grabar pic, leer memoria, etc de la IDE.


para - módulos para una IDE en python Pantal18

Este módulo se podría aplicar a varios programas... por ejemplo a esto
, aunque también se puede añadir como herramienta externa a Gedit, para
convertir este magnífico editor de textos en una IDE para trabajar con
PICs.

Por ahora solo está hecha la "carcasa"... osea la interface gráfica, pero hay que programar todas las acciones, entonces cualquier ayuda, sugerencia, etc. sería muy agradecida. Así que si alguien quiere colaborar sería estupendo.

Por ejemplo si alguien que sepa de python me echa una mano a programar los menú despleglabes (combo-box) me daría una alegría...

Un tema sería una rutina que lea un archivo donde hay una lista de (por ejemplo) todos los compiladores que hay configurados y coloque esos nombres en la lista desplegable.

Luego otra rutina sería: al darle a aceptar o guardar tendría que grabar todos los datos de la ventana al archivo.

También si alguien sabe la mejor manera de escribir los datos al archivo de configuración para que sean fáciles de leer: separados por comas, comillas, en una sola linea o un dato en cada linea...

Bueno... si alguien se anima que exponga sus ideas o preguntas...

Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

para - módulos para una IDE en python Empty shell en python

Mensaje por aztk Dom 14 Jun 2009 - 2:19

las ordenes que están en las texboxes se pueden usar desde una terminal shell, no?
pues en python se pueden ejecutar instrucciones shell importando el módulo 'system' y ejecutándolas con la función system, por ejemplo:

Código:

from os import system    # esta linea solo va una vez al principio del código
..
...
....
código
....
...
..
.
system("pk2cmd -P")
.
.
.
system("pk2cmd -P -E")
.
.
.

Ahora sobre el archivo de configuración, pss no sé nada del manejo de ficheros con python, aunque ha de haber info en internet, pero si te sirve de algo puedes mirar un script en bash que hice con un bro (necros-mx) el cual es un instalador de software para mecatrónicos-electrónicos el cual hace uso de un archivo de texto para tomar información, http://code.google.com/p/mechalinux/downloads/list

Buena Vibra!!!

aztk
Participante Activo
Participante Activo

Mensajes : 52
Fecha de inscripción : 08/06/2009
Edad : 35
Localización : Tenochtitlan

Volver arriba Ir abajo

para - módulos para una IDE en python Empty Re: módulos para una IDE en python

Mensaje por Pikitin Lun 15 Jun 2009 - 1:18

Gracias por las informaciones... las dos mme han servido bastante.

La de usar "system" para ejecutar comandos ya la he puesto en práctica.. he hecho una "barra de herramientas" flotante con la idea de lanzarla desde Gedit (los iconos los tomé prestados de Piklab):

para - módulos para una IDE en python Pantal19

Entonces desde esta barra ejecutar las acciones: grabar, verificar, leer, borrar, compilar y configurar... al ejecutar configurar se ejecuta la ventana de configuración que puse en el anterior mensaje, ahí se puede seleccionar compilador, programador y PIC, también se añaden compiladores y programadores nuevos.

Y funcionar funciona..... he añadido esta barra como "herramienta externa" en Gedit y bién... se abre y ejecuta las acciones, pero las acciones solo se aplican al documento activo en el momento de ejecutar la herramienta externa... si cambio de documento y le mando a compilar... se compila el documento anterior... siempre se compila el mismo aunque cambie de documento... creo que una vez lanzada la barra, esta no tiene acceso a la variable que contiene el nombre del archivo actual y se queda con el valor que se le dió al principio.... nosé...

Quizás tenga que ponerla como plugin... pero esto está más complicado... si alguien tiene alguna idea....

El script en bash está muy bién.. de ahí puedo sacar ideas, pero desde Python está más complicado manejar ficheros... por lo pronto para modificar cualquier cosilla, primero hay que abrirlo como lectura, cargar el fichero en memoria, cerrar el fichero, modificar lo que quieras, abrir el fichero como escritura, escribirlo todo y cerrar el fichero... en bash hay muchas opciones para trabajar con texto en ficheros, desde buscar por cadenas, por lineas, reemplazar... y montón de cosas que yo no sé.

Entonces lo que estoy haciendo por ahora es usar un fichero para cada cosa y así se simplifica bastante el programa en Python, por ahora funciona bién así, pero tendré que buscar la manera de usar un solo archivo de configuración... o al menos usar los menos posibles.

Mira... te voy a poner el código de la barrita de herramientas de arriba para que veas como va lo de WxPython, está creado todo con WxGlade, solo he escrito las lineas de os.system():
Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Sat Jun 13 22:10:43 2009

import wx, os

# begin wxGlade: extracode
# end wxGlade

class ide_herra(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: ide_herra.__init__
        kwds["style"] = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.MAXIMIZE_BOX|wx.STAY_ON_TOP|wx.SYSTEM_MENU|wx.RESIZE_BORDER|wx.FRAME_TOOL_WINDOW|wx.CLIP_CHILDREN
        wx.Frame.__init__(self, *args, **kwds)
        self.bitmap_button_1 = wx.BitmapButton(self, -1, wx.Bitmap("icons/grabar_pic.png", wx.BITMAP_TYPE_ANY))
        self.bitmap_button_2 = wx.BitmapButton(self, -1, wx.Bitmap("icons/verificar.png", wx.BITMAP_TYPE_ANY))
        self.bitmap_button_3 = wx.BitmapButton(self, -1, wx.Bitmap("/icons/leer_pic.png", wx.BITMAP_TYPE_ANY))
        self.bitmap_button_4 = wx.BitmapButton(self, -1, wx.Bitmap("icons/borrar_pic.png", wx.BITMAP_TYPE_ANY))
        self.static_line_1 = wx.StaticLine(self, -1, style=wx.LI_VERTICAL)
        self.bitmap_button_5 = wx.BitmapButton(self, -1, wx.Bitmap("icons/compilar.png", wx.BITMAP_TYPE_ANY))
        self.static_line_2 = wx.StaticLine(self, -1, style=wx.LI_VERTICAL)
        self.bitmap_button_6 = wx.BitmapButton(self, -1, wx.Bitmap("icons/configurar.png", wx.BITMAP_TYPE_ANY))

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.on_grabar_pic, self.bitmap_button_1)
        self.Bind(wx.EVT_BUTTON, self.on_verificar, self.bitmap_button_2)
        self.Bind(wx.EVT_BUTTON, self.on_leer_pic, self.bitmap_button_3)
        self.Bind(wx.EVT_BUTTON, self.on_borrar_pic, self.bitmap_button_4)
        self.Bind(wx.EVT_BUTTON, self.on_compilar, self.bitmap_button_5)
        self.Bind(wx.EVT_BUTTON, self.on_configurar, self.bitmap_button_6)
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: ide_herra.__set_properties
        self.SetTitle("Barra Herramientas PIC")
        self.bitmap_button_1.SetSize(self.bitmap_button_1.GetBestSize())
        self.bitmap_button_2.SetSize(self.bitmap_button_2.GetBestSize())
        self.bitmap_button_3.SetSize(self.bitmap_button_3.GetBestSize())
        self.bitmap_button_4.SetSize(self.bitmap_button_4.GetBestSize())
        self.bitmap_button_5.SetSize(self.bitmap_button_5.GetBestSize())
        self.bitmap_button_6.SetSize(self.bitmap_button_6.GetBestSize())
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: ide_herra.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.bitmap_button_1, 0, wx.LEFT|wx.RIGHT, 2)
        sizer_2.Add(self.bitmap_button_2, 0, wx.LEFT|wx.RIGHT, 2)
        sizer_2.Add(self.bitmap_button_3, 0, wx.LEFT|wx.RIGHT, 2)
        sizer_2.Add(self.bitmap_button_4, 0, wx.LEFT|wx.RIGHT, 2)
        sizer_2.Add(self.static_line_1, 0, wx.LEFT|wx.RIGHT|wx.EXPAND, 4)
        sizer_2.Add(self.bitmap_button_5, 0, wx.LEFT|wx.RIGHT, 2)
        sizer_2.Add(self.static_line_2, 0, wx.LEFT|wx.RIGHT|wx.EXPAND, 4)
        sizer_2.Add(self.bitmap_button_6, 0, wx.LEFT|wx.RIGHT, 2)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade

    def on_grabar_pic(self, event): # wxGlade: ide_herra.
        os.system('sh $HOME/.picide/grabar-pic')
        return

    def on_verificar(self, event): # wxGlade: ide_herra.
        print "Event handler `on_verificar' not implemented!"
        event.Skip()

    def on_leer_pic(self, event): # wxGlade: ide_herra.
        print "Event handler `on_leer_pic' not implemented!"
        event.Skip()

    def on_borrar_pic(self, event): # wxGlade: ide_herra.
        print "Event handler `on_borrar_pic' not implemented!"
        event.Skip()

    def on_compilar(self, event): # wxGlade: ide_herra.
        os.system('sh $HOME/.picide/compilar')
        return

    def on_configurar(self, event): # wxGlade: ide_herra.
        print "Event handler `on_configurar' not implemented!"
        event.Skip()

# end of class ide_herra


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    dialog_1 = ide_herra(None, -1, "")
    app.SetTopWindow(dialog_1)
    dialog_1.Show()
    app.MainLoop()

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

para - módulos para una IDE en python Empty leer ficheros python

Mensaje por aztk Mar 16 Jun 2009 - 21:07

Saludos kamaradas!

Pss he estado mirando como usar ficheros en python, he consultado el Tutorial de Python de MundoGeek y por lo menos ya puedo leer ficheros de una forma básica. Y por lo que comenta Pikitin de que bash tiene más herramientas para filtrar texto, pss la neta no lo creo (aunque la neta igual y aún no sé mucho de bash), para hacer el script de mechalinux me tomo bastante tiempo, hablamos de días casi una semana, todo por no saber como manejar al archivo de configuración, en cambio esta vez para conseguir leer información de un fichero desde python me tomo unas cuantas horas, jeje.Pss veamos lo que he conseguido...

Para empezar tendremos nuestro fichero de configuración con el siguiente formato:

Código:

---start---
[ETIQUETA00]valor00
[ETIQUETA01]valor01
.
.
.
[ETIQUETA_n]valor_n
---end---

y lo que haremos es desde python abrirlo como solo lectura y leer linea por linea buscando una cadena al principio de cada linea, hasta donde se encuentre la cadena se detiene la lectura y se toma esa ultima linea, se filtra la etiqueta y obtenemos el valor:

Código:

conffile = "archivo.conf"
f = open(conffile, "r")

while True:
    linea = f.readline()
    if (not linea) or (linea[0:10] == "[CONECTAR]"): break

print linea[10:-1]
f.close()

Hecho función quedaría de la siguiente forma:

Código:

def getdataconf(cadena):
    f = open(conffile, "r")
    #f.seek(0)
    while True:
        linea = f.readline()
        if (not linea) or (linea[0:len(cadena)] == cadena): break
    linea = linea[len(cadena):-1]
    f.close()
    return linea

# para llamar a la funcion puede ser como los siguientes ejemplos
print getdataconf("[ETIQUETA00]")
valorx = getdataconf("[ETIQUETA01]")
print valorx

Me falta saber como escribir de manera eficiente en el archivo de configuración, pero pikitin me gustaría que me mandaras el código de la ventana de configuraciones y como le haces para abrirla e intercambiar info desde las dos ventanas (barra herramientas y ventana configuraciones)????

Yo también hice, bueno... más bien copie tu barra de herramientas y la adecue para leer desde el archivo de configuración los comandos, no es funcional (así que para ver su funcionamiento usala desde terminal, ya que imprime cosas en la terminal), solo es mostrar que funciona lo que he hecho pero con unos cuantos cambios hará lo que queramos, jejeje
También le puse un statusbar pero todavía no le doy una utilidad importante. Adjunto los archivos.......................... ja! no vi que no había la opción de adjuntar archivos, así que te los mando a tu email.

Buena Vibra!

aztk
Participante Activo
Participante Activo

Mensajes : 52
Fecha de inscripción : 08/06/2009
Edad : 35
Localización : Tenochtitlan

Volver arriba Ir abajo

para - módulos para una IDE en python Empty Re: módulos para una IDE en python

Mensaje por Pikitin Miér 17 Jun 2009 - 2:03

Gracias aztk...

Me has aclarado bastante las cosas... me voy a mirar el tutorial a ver que tal.

Los dos programas no se comunican directamente, el de configuración escribe todo a unnos archivos de configuración y luego la barra de herramientas solo ejecuta un script en bash... este script lee el archivo donde dice que compilador, programador y pic están seleccionados y luego abre el archivo correspondiente y ejecuta la linea correspondiente de ese archivo.

Por ejemplo si le doy al botón grabar se ejecuta "grabar.sh" , este script lee en un archivo que el programador seleccionado es por ejemplo "PicKit2" y el pic es "pic16f876" entonces abre el archivo llamado "Pickit2" y lee la segunda linea, que es la correspondiente a grabar y ejecuta esa linea añadiéndole la drección del archivo actual... y es aquí donde tengo un problema porque una vez lanzada la barra de herramientas el script no puede leer la variable: $GEDIT_CURRENT_DOCUMENT_PATH que es la dirección del archivo actualmente seleccionado en Gedit... si ejecuto el script directamente desde Gedit con "herramientas externas" funciona perfectamente, pero si lanzo la barra de herramientas y ejecuto el script desde ahí, entonces no tiene acceso a la variable... por eso creo que la barra se debería programar como plugin de Gedit... nosé...

Ya te he mandado el código de la ventana de configuración.. está funcionando, pero habría que mejorar lo del archivo de configuración, ya que ahora usa varios archivos y quizás de una manera muy poco eficiente.

Si a alguien se le ocurren cosas para mejorar esto pues no tiene más que postearlas... Smile serán muy agradecidas.

Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

para - módulos para una IDE en python Empty Re: módulos para una IDE en python

Mensaje por Pikitin Miér 17 Jun 2009 - 8:44

Mira... ya tengo casi resuelto lo del plugin para Gedit, al menos un esquema básico que creo que puede funcionar.

El tema es que un plugin para gedit creo que tiene que estar en gtk, entonces he hecho uno que crea una ventanita "Hello Word" en gtk, pero yo no tengo ni idea de gtk, así que si tu consigues convertir esa ventanita en la barra de herramientas creo que lo tenemos casi solucionado.

El plugin son dos archivos: "Herramientas.py" donde está el código en Python y "HerramientasPIC.gedit-plugin" que es solo una especie de archivo de configuracion que usa el sistema de plugins de gedit.
Estos dos archivos hay que copiarlos a la carpeta: /home/usuario/.gnome2/gedit/plugins
Luego al abrir el Gedit hay que ir a: Editar-Preferencias-Complementos y activar el plugin: "Herramientas PIC"
Entonces en el menú Herramientas de Gedit aparecerá una entrada llamada "Barra de Herramientas PIC"
Al darle a esa entrada se abre la ventanita "Hello Word", la idea es que se abra la barra de herramientas.

Te pongo los dos archivos por si te dá por hacer la barra en GTK... o por si te sirve para hacer otros plugins:
Hay que poner exactamente esos nombres a los archivos.

Este es el archivo "HerramientasPIC.gedit-plugin":
Código:
[Gedit Plugin]
Loader=python
Module=HerramientasPIC
IAge=2
Name=Herramientas PIC
Description=Una barra de herramientas para PIC
Authors=PIC LINUX
Copyright=libre
Website=http://pic-linux.forosactivos.net

No sé que pasa aquí, pero no deja poner el signo "mayor que" ni "menor
que"... que se suele usar en html y esas cosas... así que en el
siguiente archivo los "menor que" los pongo como "¿" y los "mayor que"
como "?"... solo tienes que reemplazar...

Y este es el archivo "HerramientasPIC.py":
Código:
# -*- coding: utf8 -*-

import gedit
import gtk
import gnome
import os

HOME_DIR = gnome.user_dir_get() #esto puede servir para algo... no?

ui_str = """¿ui?
  ¿menubar name="MenuBar"?
    ¿menu name="ToolsMenu" action="Tools"?
      ¿placeholder name="ToolsOps_2"?
        ¿menuitem name="HerramientasPIC" action="HerramientasPIC"/?
      ¿/placeholder?
    ¿/menu?
  ¿/menubar?
¿/ui?
"""

class HerramientasPICPlugin(gedit.Plugin):
    def activate(self, window):
        self.window = window
        self._insert_menu()

    def deactivate(self, window):
        pass

    def update_ui(self, window):
        pass
       
    def _insert_menu(self):
        # Get the GtkUIManager
        manager = self.window.get_ui_manager()

        # Create a new action group
        self._action_group = gtk.ActionGroup("HerramientasPICPluginActions")
        self._action_group.add_actions([("HerramientasPIC", None,
                    _("Barra de Herramientas PIC"), None,
                    _("Herramientas para PIC"),
                    self.barra_herramientas)])

        # Insert the action group
        manager.insert_action_group(self._action_group, -1)

        # Merge the UI
        self._ui_id = manager.add_ui_from_string(ui_str)

   
    def barra_herramientas(self, action):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(10)
        self.button = gtk.Button("Hello World")
        self.button.connect("clicked", self.hello, None)
        self.button.connect_object("clicked", gtk.Widget.destroy, self.window)
        self.window.add(self.button)
        self.button.show()
        self.window.show()
       
       
    def hello(self, widget, data=None):
        print "Hello World"

    def bye(self, widget, data=None):
        print "bye World"

    def delete_event(self, widget, event, data=None):
       
        print "delete event occurred"

        return False

    def destroy(self, widget, data=None):
        print "destroy signal occurred"
        self.window.destroy()
           
           

Saludos...

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

para - módulos para una IDE en python Empty Re: módulos para una IDE en python

Mensaje por Pikitin Miér 17 Jun 2009 - 17:47

Waaaahhh... estoy flipando con lo que sepuede hacer con los plugins de Gedit, se puede hacer casi cualquier cosa... por lo pronto no hace falta lanzar una barra de herramientas exterior porque se pueden añadir elementos a la propia barra de herramientas de Gedit. También se pueden añadir menús nuevos a la barra de Menú y mil cosas más....

Entonces creo que mejor que lanzar una barra de herramientas flotante, mejor añadimos botones a la propia barra de herramientas de Gedit... no?

El tema de los botones hay que hacerlo en GTK... haría falta saber como meter los iconos en los nuevos botones, por ahora le he puesto algo llamado "gtk.STOCK_OK" que saca un botón con un símbolo de "enter".

EDITADO:

Este es el código mínimo que añade dos botones a la barra de herramientas de Gedit:
Esto va en el archivo "HerramientasPIC.py" y se usa con el mismo "HerramientasPIC.gedit-plugin" de antes o se crea uno nuevo con nombres distintos.
Hay que sustituir las interrogaciones por signos de mayor y menor!!!

Código:

# -*- coding: utf8 -*-

import gedit
import gtk
import gnome
import os

ui_str = """¿ui?
  ¿toolbar name="ToolBar"?
    ¿separator /?
    ¿toolitem name="Grabar_PIC" action="Grabar_PIC" /?
    ¿toolitem name="Leer_PIC" action="Leer_PIC" /?
  ¿/toolbar?
¿/ui?
"""

class HerramientasPICPlugin(gedit.Plugin):
    def activate(self, window):
        self.window = window
        self._insert_menu()

    def deactivate(self, window):
        pass

    def update_ui(self, window):
        pass
       
    def _insert_menu(self):
        # Get the GtkUIManager
        manager = self.window.get_ui_manager()

        # Create a new action group
        self._action_group = gtk.ActionGroup("PICPluginActions")
        self._action_group.add_actions([("Grabar_PIC", gtk.STOCK_OK,
                    _("Grabar"), None,
                    _("Grabar el PIC"),
                    self.on_grabar)])
        self._action_group.add_actions([("Leer_PIC", gtk.STOCK_OK,
                    _("Leer"), None,
                    _("Leer el PIC"),
                    self.on_leer)])

        # Insert the action group
        manager.insert_action_group(self._action_group, -1)

        # Merge the UI
        self._ui_id = manager.add_ui_from_string(ui_str)

   
    def on_grabar(self, action):
        print "grabar"
       
       
    def on_leer(self, action):
        print "leer"



Este es el resultado:
para - módulos para una IDE en python Pantal20

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

para - módulos para una IDE en python Empty Re: módulos para una IDE en python

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.