我想将复选框与目录中的文件和文件夹放在一起。例如,使用 GenericDirCtrl 类,我们可以在GUI中获取目录,并可以使用 ExpandPath 方法扩展目录。现在我想把目录中存在的文件和文件夹的复选框分别选择每个文件/文件夹,这样我就可以获取所选文件并将列表作为参数发送到proc。它应该是智能的,但是当目录树被扩展时,复选框应该与文件/文件夹一起出现,并且当目录树折叠到根级别时可能会消失(可能是本地驱动器)。
答案 0 :(得分:1)
我最近遇到了类似的问题。
主要的障碍是当使用" os.walk(pathOfDir)
"时,它会产生基于" level"的文件/目录数组。例如,它会列出第一级的所有文件和目录,然后进入每个目录并在其中提供文件和目录列表,依此类推。此过程将以递归方式继续,直到不再有目录为止。
我首先制作了os.walk(pathOfDir)
返回的每个文件的完整路径列表,从而解决了这个问题。为此,使用了os.path.join(rootOfFile, nameOfFile)
。
后来,在这些文件的列表中,我实现了某种算法来使用该文件列表并从中创建一个HyperTreeList。
您可以使用我的以下代码作为样本,并在遇到任何混淆时问我:
import os
import wx
import wx.lib.agw.hypertreelist as HTL
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, pos = (0,0), size=(700, 900), title= "HyperTreeList Demo")
# ------------------------------------------
# Algo for creating Files' List Starts here
# ------------------------------------------
allFiles = []
for root, dirs, files in os.walk("D:\\DIRECTORY", topdown = True):
for name in files:
location = os.path.join(root, name)
allFiles.append(location)
treeList= HTL.HyperTreeList(self, agwStyle= wx.TR_DEFAULT_STYLE| 0x4000 )
treeList.AddColumn("List View")
treeList.SetColumnWidth(0, 600)
TLRoot = treeList.AddRoot ("D:", ct_type= 1)
allDirs = []
allDirsItem = []
allDirs.append ("D:")
allDirsItem.append(TLRoot)
# --------------------------------------
# Algo for filling Tree List Starts here
# --------------------------------------
for eachName in allFiles:
nameSplit = eachName.split(os.sep)
matchingDirFound = 0
lenNS= len(nameSplit)
i=lenNS -1
for eachNameSplit in reversed(nameSplit):
for eachDoneDir in reversed(allDirs):
if eachNameSplit == eachDoneDir:
matchingDirFound = 1
break
if matchingDirFound == 1:
break
i= i-1
if matchingDirFound ==1:
for k in range(i, lenNS-1):
allDirsItem.append([])
allDirsItem[k+1] = treeList.AppendItem (allDirsItem[k], nameSplit[k+1], ct_type= 1)
if len(allDirs)> k+1:
allDirs[k+1] = nameSplit[k+1]
else:
allDirs.append (nameSplit[k+1])
答案 1 :(得分:0)
我不相信有一个内置的小部件可以完全满足您的需求。但是,我认为您可以使用Python的os.walk编写一个相当简单的脚本来遍历文件夹:
然后使用其中的结果填充HyperTreeList小部件,该小部件支持复选框。