Я почти уверен, что есть простое решение для этого, но я потратил часы, читая и перечитывая тот же набор связанных результатов, которые не вполне отвечают моей проблеме.
Контекстэтот вопрос (включен для завершения, но вы можете его пропустить)
Этот вопрос возник, потому что я хочу, чтобы пользователь мог выбрать группу файлов в каталоге (а также в любом подкаталоге),и, к сожалению, по умолчанию Tkinter не может выбрать несколько файлов в диалоговом окне файлов в Windows 7 (http://bugs.python.org/issue8010).
). Таким образом, я пытаюсь представить структуру каталогов альтернативным методом (все еще использующим Tkinter): создание факсимильного сообщенияструктуры каталогов, состоящей из помеченных и с отступом флажков (организованных в виде дерева). Таким образом, каталог вроде этого:
\SomeRootDirectory
\foo.txt
\bar.txt
\Stories
\Horror
\scary.txt
\Trash
\notscary.txt
\Cyberpunk
\Poems
\doyoureadme.txt
будет выглядеть примерно так (где # представляет флажок):
SomeRootDirectory
# foo.txt
# bar.txt
Stories
Horror
# scary.txt
Trash
# notscary.txt
Cyberpunk
Poems
# doyoureadme.txt
Создать оригинальный словарь из структуры каталогов легко, используя определенный рецепт I fв ActiveState (см. ниже), но я попадаю в стену, когда пытаюсь перебрать красиво вложенный словарь, с которым мне осталось.И я думаю, что мне нужно перебрать его, чтобы заполнить фрейм Tkinter довольно сетчатым представлением дерева.Затем я надеюсь загрузить различные текстовые файлы, выбранные пользователем, интерпретируя, какие флажки были истинными или ложными.Все кажется довольно простым, за исключением перебора словаря без без фиксации глубины.
В более абстрактных терминах
Для создания этих вложенных словарей я используюрецепт ActiveState - http://code.activestate.com/recipes/577879/. Он реализует os.walk для создания таких словарей:
a={
'SomeRootDirectory': {
'foo.txt': None,
'bar.txt': None,
'Stories': {
'Horror': {
'horror.txt' : None,
'Trash' : {
'notscary.txt' : None,
},
},
'Cyberpunk' : None
},
'Poems' : {
'doyoureadme.txt' : None
}
}
}
После чего я в тупике.Я новичок в Python на момент написания
Решение, адаптированное на основе ответов Spicavigo
#distinguish between directory and file
dirtab = "/==="
filetab = "|---"
Parents={-1:"Root"}
def add_dir(level, parent, index, k):
print (dirtab*level)+k
def add_file(level, parent, index, k):
#Currently an empty folder gets passed to add_file; here's a quick treatment.
if "." in k:
print (filetab*level)+k
else:
print (dirtab*level)+k
def addemup(level=0, parent=-1, index=0, di={}):
for k in di:
index +=1
if di[k]:
Parents[index]=k
add_dir(level, parent, index, k)
addemup(level+1, index, index, di[k])
else:
add_file(level, parent, index, k)
addemup(di=a) #dictionary from above
Это дает то, что, я думаю, будет очень легко преобразовать в Tkinterпредставление:
SomeRootDirectory
/===Poems
|---|---doyoureadme.txt
/===Stories
/===/===Horror
|---|---|---rickscott.txt
/===/===/===Trash
|---|---|---|---notscary.txt
/===/===Cyberpunk
|---foo.txt
|---bar.txt
Спасибо, это сообщество невероятно.