Форум сайта python.su
Добрый день. Не могли бы вы меня направить в нужную сторону?)
Собственно понадобилось мне создать дерево(wx.tree) из моего файла(от 60000 записей). Собственно на импорт и первоначальную обработку записей уходит достаточно маленькое время. А вот на создание самого дерева очень много.
Для создания дерева был взят код из темы “Помогите с заполнением wx.TreeCtrl из SQL” (http://python.su/forum/viewtopic.php?id=5459)
#######################################################
import wx
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, “Test”, size=(300, 300))
self.tree = wx.TreeCtrl(self)
_Tree = [,,,
,,]
def branch(node, id):
for x in filter(lambda x: x == id, _Tree):
if node:
new_node = self.tree.AppendItem(node, x)
else:
new_node = self.tree.AddRoot(x)
self.tree.SetPyData(new_node, x)
branch(new_node, x)
self.tree.Freeze()
branch(None, 0)
self.tree.Thaw()
if __name__ == ‘__main__’:
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show(True)
app.MainLoop()
#######################################################
После некоторого раздумья, так как программа для формирования дерева из 18000 записей дерево делала за 83 секунды, а из 60000 записей ну вообще много времени))) было принято решение доработать для того чтобы она не проходила одно место 2 раза. Собственно я отсортировал список и переписал немного
#######################################################
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, “Test”, size=(300, 300))
self.tree = wx.TreeCtrl(self)
_Tree = p
def branch(node, id):
a, i = , 0
while i < len(_Tree):
if _Tree == id:
a.append(_Tree)
del _Tree
i-=1
elif a: break
i+=1
for x in a:
if node:
new_node = self.tree.AppendItem(node, x)
else:
new_node = self.tree.AddRoot(x)
#print x
self.tree.SetPyData(new_node, x)
branch(new_node, x)
self.tree.Freeze()
branch(None, 0)
self.tree.Thaw()
if __name__ == ‘__main__’:
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show(True)
app.MainLoop()
#######################################################
теперь она выполнялась за 48 секунд для 18000, но это тоже многовато будет… Подскажите какой нибудь другой подход или как её ещё убыстрить?
Офлайн
Один из стандертных способов - строить виртуальное дерево - отображается только то что нужно в текущий момоент.
class TEdTree(wx.lib.mixins.treemixin.VirtualTree,wx.gizmos.TreeListCtrl,listctrl.ListCtrlAutoWidthMixin):
def __init__(self,parent,obj):
super(TEdTree,self).__init__(parent, style =
wx.TR_DEFAULT_STYLE
| wx.TR_FULL_ROW_HIGHLIGHT
| wx.TR_COLUMN_LINES
)
listctrl.ListCtrlAutoWidthMixin.__init__(self)
self.panel=parent
self.AddColumn("...")
self.AddColumn(u"значение")
self.AddColumn(u"тип")
self.AddColumn(u"единицы измерения")
self.AddColumn(u"описание")
self.SetMainColumn(_COL_NAME) # the one with the tree in it...
self.SetColumnWidth(_COL_NAME,_COL_NAME_W)
self.SetColumnWidth(_COL_VALUE,_COL_VALUE_W)
self.SetColumnWidth(_COL_TYPE,_COL_TYPE_W)
self.SetColumnWidth(_COL_UNITS,_COL_UNITS_W)
self.SetColumnWidth(_COL_DSK, _COL_DSK_W)
def OnGetItemText(self, indexes,col=0):
info=self.ObjInfoR(indexes)
if col == _COL_NAME:
return info.name
elif col== _COL_VALUE:
return str(info.obj)
elif col== _COL_TYPE:
return info.typ
elif col== _COL_DSK:
return info.dsk if info.dsk else ""
elif col== _COL_UNITS:
return info.units if info.units else ""
def OnGetChildrenCount(self, indexes):
return 4
Отредактировано (Окт. 3, 2011 22:59:29)
Офлайн