'TreeCtrl'에 해당되는 글 1건

  1. wxPython PathTreeCtrl 2010/05/26

wxPython PathTreeCtrl

Posted at 2010/05/26 13:26// Posted in wxPython/wxTreeCtrl
트리 컨트롤은 디렉토리 구조를 표현할때 편리합니다.

사용자 삽입 이미지
















그런데 경로를 파싱해서 디렉토리를 만드는건 의외로 귀찮은 일이더라구요 = =)~

그래서 만들어본 예제입니다



# vi: set sw=4 sts=4 expandtab:
import wx
import os

class wxPathTreeCtrl(wx.TreeCtrl):
def __init__(self, *args, **kwargs):
wx.TreeCtrl.__init__(self, *args, **kwargs)

def InitRoot(self, rootPath):
self.branchd = {}
self.DeleteAllItems()
self.root = self.AddRoot(rootPath)
self.SetPyData(self.root, ("ROOT", rootPath))
return self.root

def AppendPath(self, path):
branch = path

branches = []
while branch:
branch, leaf = os.path.split(branch)
if branch in self.branchd:
break
elif branch:
branches.append(branch)

branches.reverse()

last = self.branchd.get(branch, self.root)
for branch in branches:
last = self.AppendItem(last, os.path.split(branch)[1])
self.SetPyData(last, ("DIR", branch))
self.branchd[branch] = last

item = self.AppendItem(last, os.path.split(path)[1])
self.SetPyData(item, ("FILE", path))
return item

def ExpandAllDirs(self):
self.ExpandDirs(self.root)

def ExpandDirs(self, node):
if self.GetPyData(node)[0] == "FILE":
pass
else:
children = list(self.GenChildren(node))
fileCount = len([child for child in children if self.GetPyData(child)[0] == "FILE"])
if 0 == fileCount:
self.Expand(node)

for child in children:
self.ExpandDirs(child)

def GetBranchd(self):
return self.branchd

def GenChildren(self, node):
child = self.GetFirstChild(node)[0]
while child:
yield child
child = self.GetNextSibling(child)

if __name__ == "__main__":

class TestFrame(wx.Frame):
def __init__(self, parent, title, size=(800, 600)):
wx.Frame.__init__(self, parent, -1, title, pos=(0, 0), size=size)
self.CentreOnScreen(wx.BOTH)

self.pathTreeCtrl = wxPathTreeCtrl(self)
self.pathTreeCtrl.InitRoot("root")
self.pathTreeCtrl.AppendPath("bin/main.exe")
self.pathTreeCtrl.AppendPath("data/char/pc/warrior/warriror.png")
self.pathTreeCtrl.AppendPath("data/char/pc/warrior/warriror2.png")
self.pathTreeCtrl.ExpandAllDirs()

class TestApp(wx.App):
def OnInit(self):
toolFrame = TestFrame(None, "TEST")
toolFrame.Show()
self.SetTopWindow(toolFrame)
return True

TestApp(redirect=False).MainLoop()


이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/05/26 13:26 2010/05/26 13:26