Foros del Web » Programando para Internet » Python »

Treeview agregar nodos fuera de la clase

Estas en el tema de Treeview agregar nodos fuera de la clase en el foro de Python en Foros del Web. Bueno lo que quiero hacer es empezar a portar un proyecto de VB 6.0 a python.... Empese por el form principal, quiero popular un treeview ...
  #1 (permalink)  
Antiguo 19/01/2010, 13:05
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 11 años, 9 meses
Puntos: 0
Treeview agregar nodos fuera de la clase

Bueno lo que quiero hacer es empezar a portar un proyecto de VB 6.0 a python....

Empese por el form principal, quiero popular un treeview con la funcion AgregaFO
abre un cursor y agrega de forma recursiva... en python vi como agregar nodos dentro de la clase pero como puedo hacerlo por fuera de la clase

def AgregaFO(parent,chield):
cursor = mdDB.conn.cursor()
sql="Select Id,Nombre From SM_FO where parent ='%s'" % parent
cursor.execute(sql)
resultado=cursor.fetchall()
for registro in resultado:
if chield == "0":
print registro[0],"-->",registro[1] #---> aca en vez de imprimir deberia crear un nodo
else:
print "\t",registro[0],"-->",registro[1] ///----> aca un nodo hijo del parent anterior, en vb creo una variable nodo y asigno en cada bucle el nodo hago nodo.add nodonuevo///
AgregaFO(registro[0],"1")




Código:
import wx
import mdDB

class frm_main(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER)
        self.window_1_pane_1 = wx.Panel(self.window_1, -1)
        self.tree = wx.TreeCtrl(self.window_1_pane_1, -1, style=wx.TR_HAS_BUTTONS|wx.TR_DEFAULT_STYLE)
        self.window_1_pane_2 = wx.Panel(self.window_1, -1)
        self.frame_1_statusbar = self.CreateStatusBar(1, 0)
        
        # Tool Bar
        self.frame_1_toolbar = wx.ToolBar(self, -1)
        self.SetToolBar(self.frame_1_toolbar)
        # Tool Bar end
        
        # Menu Bar
        self.frame_1_menubar = wx.MenuBar()
        self.SetMenuBar(self.frame_1_menubar)
        # Menu Bar end

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
         self.SetTitle("SM ERP")
        _icon = wx.EmptyIcon()
        _icon.CopyFromBitmap(wx.Bitmap("C:\\Documents and Settings\\podio\\Escritorio\\MARIANO\\SM_ERP-local\\version mariano\\recursos\\16 x 16\\update.ico", wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.frame_1_statusbar.SetStatusWidths([-1])
        # statusbar fields
        frame_1_statusbar_fields = ["frame_1_statusbar"]
        for i in range(len(frame_1_statusbar_fields)):
            self.frame_1_statusbar.SetStatusText(frame_1_statusbar_fields[i], i)
        self.frame_1_toolbar.Realize()
 
    def __do_layout(self):
         sizer_1 = wx.GridSizer(1, 1, 0, 0)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.tree, 1, wx.EXPAND, 0)
        self.window_1_pane_1.SetSizer(sizer_2)
        self.window_1.SplitVertically(self.window_1_pane_1, self.window_1_pane_2)
        sizer_1.Add(self.window_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        self.Centre()
        # end wxGlade

# end of class frm_main

def AgregaFO(parent,chield):
    cursor = mdDB.conn.cursor()
    sql="Select Id,Nombre From SM_FO where parent ='%s'" % parent
    cursor.execute(sql)
    resultado=cursor.fetchall()
    for registro in resultado:
        if chield == "0":
            print registro[0],"-->",registro[1]
        else:
            print "\t",registro[0],"-->",registro[1]
        AgregaFO(registro[0],"1") 
        
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = frm_main(None, -1, "")
    app.SetTopWindow(frame_1)
    AgregaFO("0","0")
    frame_1.Show()
    app.MainLoop()
(edit)
en el modulo mdDB solo esta la conecion a la db y la variable conn que seria la conecion... una pregunta cada vez que importe este modulo desde otro modulo, se crea una conecion nueva?
  #2 (permalink)  
Antiguo 19/01/2010, 14:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Treeview agregar nodos fuera de la clase

Cita:
Iniciado por Nano-rosario
en el modulo mdDB solo esta la conecion a la db y la variable conn que seria la conecion... una pregunta cada vez que importe este modulo desde otro modulo, se crea una conecion nueva?
Si a menos que hayas usado el patrón singleton, al hacer el modulo mdDB
  #3 (permalink)  
Antiguo 19/01/2010, 16:39
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Treeview agregar nodos fuera de la clase

ah bien gracias, y acerca de popular el treeview en wxpython, se te ocurre algo?
  #4 (permalink)  
Antiguo 20/01/2010, 14:37
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Treeview agregar nodos fuera de la clase

Código Python:
Ver original
  1. #coding: utf-8
  2. import wx
  3.  
  4. class TestFrame(wx.Frame):
  5.     def __init__(self):
  6.         wx.Frame.__init__(self, None, title="Tree", size=(400,500))
  7.  
  8.         # Creamos el tree
  9.         self.tree = wx.TreeCtrl(self)
  10.  
  11.         # Añadimos una raiz
  12.         self.root = self.tree.AddRoot("Raiz")
  13.        
  14.         # Añadimos ramas (o nodos) a nuestra raiz
  15.         self.branches = [
  16.                     ["Rama1",
  17.                         ["SubRama1EnRama1", "SubRama2EnRama1"]],
  18.                     ["Rama2",
  19.                         ["SubRama1EnRama2", "SubRama2EnRama2"]]
  20.                    ]
  21.         self.AddTreeNodes(self.root, self.branches) #Metodo de clase
  22.  
  23.         # Expandimos el primer nivel
  24.         self.tree.Expand(self.root)
  25.  
  26.     def AddTreeNodes(self, root, items):
  27.         for item in items:
  28.             if type(item) == str:
  29.                 self.tree.AppendItem(root, item)
  30.             else:
  31.                 newItem = self.tree.AppendItem(root, item[0])
  32.                 self.AddTreeNodes(newItem, item[1])
  33.  
  34.  
  35. #Aqui añadimos ramas fuera de la clase
  36. def AppendNode(frame):
  37.     newroot = frame.tree.AppendItem(frame.root, "Rama3")
  38.     frame.tree.AppendItem(newroot, "SubRama1EnRama3")
  39.  
  40. app = wx.PySimpleApp()
  41. frame = TestFrame()
  42. AppendNode(frame)
  43. frame.Show()
  44. app.MainLoop()
La verdad es que no entiendo muy bien para que agregar nodos, fuera de una clase :s
  #5 (permalink)  
Antiguo 21/01/2010, 07:54
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Treeview agregar nodos fuera de la clase

Gracias, ahi lo hice lo que buscaba en realidad nunca habia usado clases gracias a VB 6 que todo funciones pero sin darme cuenta las creaba cuando ponia nodo = new ctreeviewnode....
entonces solocione el error creando una clase en python q me devuelva un nodo...
el objetivo de una tabla de este estilo

id-nombre-parent
1 - Padre1-0
2 - Padre2-0
3 - Padre3-0
4 - Hijo1 - 1
5 - Hijo2- 1
6 - subhijo1 - 4

me agrega asi
Padre1
-Hijo1
-Subhijo1
-Hijo2
Padre2
Padre3

y asi recursivamente.... como se ve en la imagen


Codigo python:
Código:
import wx
import mdDB

class frm_main(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.window_1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER)
        self.window_1_pane_1 = wx.Panel(self.window_1, -1)
        self.tree = wx.TreeCtrl(self.window_1_pane_1, -1, style=wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_DEFAULT_STYLE)
        self.window_1_pane_2 = wx.Panel(self.window_1, -1)
        self.frame_1_statusbar = self.CreateStatusBar(1, 0)
        
        # Tool Bar
        self.frame_1_toolbar = wx.ToolBar(self, -1)
        self.SetToolBar(self.frame_1_toolbar)
        # Tool Bar end
        
        # Menu Bar
        self.frame_1_menubar = wx.MenuBar()
        self.SetMenuBar(self.frame_1_menubar)
        # Menu Bar end

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        self.SetTitle("SM ERP")
        _icon = wx.EmptyIcon()
        #_icon.CopyFromBitmap(wx.Bitmap("C:\\Documents and Settings\\podio\\Escritorio\\MARIANO\\SM_ERP-local\\version mariano\\recursos\\16 x 16\\update.ico", wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.frame_1_statusbar.SetStatusWidths([-1])
        # statusbar fields
        frame_1_statusbar_fields = ["frame_1_statusbar"]
        for i in range(len(frame_1_statusbar_fields)):
            self.frame_1_statusbar.SetStatusText(frame_1_statusbar_fields[i], i)
        self.frame_1_toolbar.Realize()
 
    def __do_layout(self):
        sizer_1 = wx.GridSizer(1, 1, 0, 0)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.tree, 1, wx.EXPAND, 0)
        self.window_1_pane_1.SetSizer(sizer_2)
        self.window_1.SplitVertically(self.window_1_pane_1, self.window_1_pane_2)
        sizer_1.Add(self.window_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        self.Centre()
        # end wxGlade

# end of class frm_main
#
class  Tnodo (object):
    instance = None      
    def __new__(cls, *args, **kargs):
        if cls.instance is None:
            cls.instance = object.__new__(cls, *args, **kargs)
        return cls.instance
    
def AgregaFO(parent,chield,nod):
    nodo = Tnodo()
    conn = mdDB.GestorBD()    
    sql="Select Id,Nombre From SM_FO where parent ='%s'" % parent
    resultado= conn.execute(sql)
    for registro in resultado:
        if chield == "0":
            nodo = frame_1.tree.AppendItem(root,registro[1])
        else: 
            nodo = frame_1.tree.AppendItem(nod,registro[1])
        AgregaFO(registro[0],"1",nodo) 
        
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = frm_main(None, -1, "")
    app.SetTopWindow(frame_1)
    root = frame_1.tree.AddRoot('root')
    frame_1.tree.SetItemHasChildren(root)
    AgregaFO("0","0",root)
    frame_1.Show()
    app.MainLoop()
Si ven que se podria hacer de otra forma, por favor, notificarmelo..... estoy tratando de aprender a programar enserio, no a lo que estaba acostumbrado en vb 6, que por mas que tenga un aspecto profesional el resultado, no tenia nada de esto.

Saludos y gracias Razpeitia
  #6 (permalink)  
Antiguo 21/01/2010, 11:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Treeview agregar nodos fuera de la clase

Código Python:
Ver original
  1. def AgregaFO(parent,chield,nod):
  2.     nodo = Tnodo()
  3.     conn = mdDB.GestorBD()    
  4.     sql="Select Id,Nombre From SM_FO where parent ='%s'" % parent #PELIGRO!!!
  5.     resultado= conn.execute(sql)
  6.     for registro in resultado:
  7.         if chield == "0":
  8.             nodo = frame_1.tree.AppendItem(root,registro[1])
  9.         else:
  10.             nodo = frame_1.tree.AppendItem(nod,registro[1])
  11.         AgregaFO(registro[0],"1",nodo)
Por favor valida bien la variable parent de lo contrario podrias tener un ataque del tipo sql injection

Edito: No puedo ver la imagen D:
  #7 (permalink)  
Antiguo 21/01/2010, 21:37
 
Fecha de Ingreso: abril-2008
Mensajes: 68
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Treeview agregar nodos fuera de la clase

ahi edite el nombre de la imagen estaba como tree.JPG en el servidor, ahora se ve....

en realidad mi idea es que nadie vea el codigo... que sea todo por interfaz grafica, en linux no se como voy a hacer, se puede compilar, algo por el estilo, no lei mucho al respecto todavia...

Etiquetas: clase, fuera, nodos, treeview
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:36.