使用wxPython GUI工具包将文件和文件夹的复选框放在目录中

时间:2014-09-15 10:56:15

标签: checkbox directory wxpython

我想将复选框与目录中的文件和文件夹放在一起。例如,使用 GenericDirCtrl 类,我们可以在GUI中获取目录,并可以使用 ExpandPath 方法扩展目录。现在我想把目录中存在的文件和文件夹的复选框分别选择每个文件/文件夹,这样我就可以获取所选文件并将列表作为参数发送到proc。它应该是智能的,但是当目录树被扩展时,复选框应该与文件/文件夹一起出现,并且当目录树折叠到根级别时可能会消失(可能是本地驱动器)。

2 个答案:

答案 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小部件,该小部件支持复选框。