Guest User

Untitled

a guest
Aug 25th, 2011
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. # Chapter 4: An Applications Building Blocks, Advanced Controls
  2. # Recipe 2: CustomTreeCtrl
  3. #
  4. import os
  5. import wx
  6. import wx.lib.customtreectrl as customtree
  7.  
  8. #---- Recipe Code ----#
  9.  
  10. class FileBrowser(customtree.CustomTreeCtrl):
  11. FOLDER, \
  12. ERROR, \
  13. FILE = range(3)
  14. def __init__(self, parent, rootdir, *args, **kwargs):
  15. super(FileBrowser, self).__init__(parent,
  16. *args,
  17. **kwargs)
  18. assert os.path.exists(rootdir),\
  19. "Invalid Root Directory!"
  20. assert os.path.isdir(rootdir),\
  21. "rootdir must be a Directory!"
  22.  
  23. # Attributes
  24. self._il = wx.ImageList(16, 16)
  25. self._root = '/home/nprtouch/Workspace_for_indigo/wxPython_example/PythonApplication2/Simple_Editor' # rootdir
  26. self._rnode = None
  27.  
  28. # Setup
  29. for art in (wx.ART_FOLDER, wx.ART_ERROR,
  30. wx.ART_NORMAL_FILE):
  31. bmp = wx.ArtProvider.GetBitmap(art, size=(16,16))
  32. self._il.Add(bmp)
  33. self.SetImageList(self._il)
  34. self._rnode = self.AddRoot(os.path.basename('/home/nprtouch/Workspace_for_indigo/wxPython_example/PythonApplication2/Simple_Editor'),
  35. image=FileBrowser.FOLDER,
  36. data=self._root)
  37. self.SetItemHasChildren(self._rnode, True)
  38. # Use Windows Vista style selections
  39. self.EnableSelectionVista(True)
  40.  
  41. # self.Expand(self._rnode)
  42.  
  43. # Event Handlers
  44. self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.OnExpanding)
  45. self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnCollapsed)
  46.  
  47. def _GetFiles(self, path):
  48. try:
  49. files = [fname for fname in os.listdir(path)
  50. if fname not in ('.', '..')]
  51. except OSError:
  52. files = None
  53. return files
  54.  
  55. def OnCollapsed(self, event):
  56. item = event.GetItem()
  57. self.DeleteChildren(item)
  58.  
  59. # def sort(self, files):
  60. # sorted(os.walk('.'))
  61. #
  62. # def OnCompareItems(self, item1, item2):
  63. # data1 = self.GetItemPyData(item1)
  64. # data2 = self.GetItemPyData(item2)
  65. # return cmp(data1, data2)
  66.  
  67. def OnExpanding(self, event):
  68. item = event.GetItem()
  69. path = self.GetPyData(item)
  70. files = self._GetFiles(path)
  71. files.sort(cmp=None, key=None, reverse=False)
  72. self.SortChildren(item)
  73.  
  74. if files is None:
  75. self.SetItemImage(item, FileBrowser.ERROR)
  76. self.SetItemHasChildren(item, False)
  77. return
  78.  
  79. for fname in files:
  80. fullpath = os.path.join(path, fname)
  81. if os.path.isdir(fullpath):
  82. self.AppendDir(item, fullpath)
  83. else:
  84. self.AppendFile(item, fullpath)
  85.  
  86.  
  87. # pt = self.GetPosition();
  88. # item, flags = self.HitTest(pt)
  89. # if item:
  90. # parent = self.GetItemParent(item)
  91. # if parent.IsOk():
  92. # self.SortChildren(parent)
  93.  
  94. def AppendDir(self, item, path):
  95. """Add a directory node"""
  96. assert os.path.isdir(path), "Not a valid directory!"
  97. name = os.path.basename(path)
  98. nitem = self.AppendItem(item, name,
  99. image=FileBrowser.FOLDER,
  100. data=path)
  101. self.SetItemHasChildren(nitem, True)
  102.  
  103. def AppendFile(self, item, path):
  104. """Add a file to a node"""
  105. assert os.path.isfile(path), "Not a valid file!"
  106. name = os.path.basename(path)
  107. self.AppendItem(item, name,
  108. image=FileBrowser.FILE,
  109. data=path)
  110.  
  111. def GetSelectedPath(self):
  112. """Get the selected path"""
  113. sel = self.GetSelection()
  114. path = self.GetItemPyData(sel)
  115. return path
  116.  
  117. def GetSelectedPaths(self):
  118. """Get a list of selected paths"""
  119. sels = self.GetSelections()
  120. paths = [self.GetItemPyData(sel)
  121. for sel in sels ]
  122. return paths
  123.  
  124. #---- End Recipe Code ----#
  125.  
  126. #---- Sample Application ----#
  127.  
  128. class MyApp(wx.App):
  129. def OnInit(self):
  130. self.frame = MyFrame(None, title="CustomTreeCtrl", size=(300,200))
  131. self.SetTopWindow(self.frame)
  132. self.frame.Show()
  133.  
  134. return True
  135.  
  136. class MyFrame(wx.Frame):
  137. def __init__(self, parent, *args, **kwargs):
  138. super(MyFrame, self).__init__(parent, *args, **kwargs)
  139.  
  140. # Attributes
  141. self.panel = MyPanel(self)
  142.  
  143. # Layout
  144. sizer = wx.BoxSizer(wx.VERTICAL)
  145. sizer.Add(self.panel, 1, wx.EXPAND)
  146. self.SetSizer(sizer)
  147. self.CreateStatusBar()
  148.  
  149. class MyPanel(wx.Panel):
  150. def __init__(self, parent):
  151. super(MyPanel, self).__init__(parent)
  152.  
  153. # Attributes
  154. self.browser = FileBrowser(self, wx.GetHomeDir())
  155.  
  156. # Setup
  157.  
  158. # Layout
  159. sizer = wx.BoxSizer(wx.VERTICAL)
  160. sizer.Add(self.browser, 1, wx.EXPAND)
  161. self.SetSizer(sizer)
  162.  
  163. # Event Handlers
  164. self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnItemActivated)
  165.  
  166. def OnItemActivated(self, event):
  167. path = self.browser.GetSelectedPath()
  168. self.GetTopLevelParent().PushStatusText(path)
  169.  
  170. if __name__ == "__main__":
  171. app = MyApp(False)
  172. app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment