我试图弄清楚如何走一棵树然后在一个窗口中显示输出,用户可以在我的计算机左侧进行导航。最终我打算在右侧看到一个完全可浏览的窗口。这是我到目前为止,我猜它是伪代码和实际代码的混合。这适用于使用python的Linux机器。我不是在寻找任何代码,但主要是帮助我如何使用tkinter实现这一目标。也许只是我,但我找不到太多帮助,帮助我解决我的问题 - 大多数只是告诉我如何显示目录等任何帮助将不胜感激。
我希望这个窗口看起来像这样
My Documents <--------starting directory
My pictures<------subdirectory
picture1.jpg<-inside of subdirectoy
picture2.jpg
1234.exe<---------random file inside of my documents
我想在目录或子目录旁边有一个小文件夹图片。
start at root
create window with tk
for dirname,subdirList,filelist in os.walk(root)
create new item(dirname)
for i in subdirList: #not sure what I would have to do to only
have subdirs showing once the directory was
clicked once
append i to item 1
for fname in fileList:
append fname to item 1
else:
item +=1
答案 0 :(得分:2)
你可以使用小工具ttk.Treeview
来完成,有一个演示dirbrowser.py
可以做到这一点。所以我能在这里做的就是给它一个剥离版本并解释它是如何工作的。首先,这是简短版本:
import os
import sys
import Tkinter
import ttk
def fill_tree(treeview, node):
if treeview.set(node, "type") != 'directory':
return
path = treeview.set(node, "fullpath")
# Delete the possibly 'dummy' node present.
treeview.delete(*treeview.get_children(node))
parent = treeview.parent(node)
for p in os.listdir(path):
p = os.path.join(path, p)
ptype = None
if os.path.isdir(p):
ptype = 'directory'
fname = os.path.split(p)[1]
oid = treeview.insert(node, 'end', text=fname, values=[p, ptype])
if ptype == 'directory':
treeview.insert(oid, 0, text='dummy')
def update_tree(event):
treeview = event.widget
fill_tree(treeview, treeview.focus())
def create_root(treeview, startpath):
dfpath = os.path.abspath(startpath)
node = treeview.insert('', 'end', text=dfpath,
values=[dfpath, "directory"], open=True)
fill_tree(treeview, node)
root = Tkinter.Tk()
treeview = ttk.Treeview(columns=("fullpath", "type"), displaycolumns='')
treeview.pack(fill='both', expand=True)
create_root(treeview, sys.argv[1])
treeview.bind('<<TreeviewOpen>>', update_tree)
root.mainloop()
首先列出sys.argv[1]
给出的路径中存在的文件和目录。您不希望在此处使用os.walk
,因为您只显示给定路径中直接可用的内容,而不会进入更深层次。然后代码继续显示这样的内容,对于目录,它会创建一个虚拟子项,因此这个Treeview
条目将显示为可以进一步扩展的内容。然后,您可能会注意到,只要用户单击<<TreeviewOpen>>
中可以进一步扩展的项目(在这种情况下,表示的条目),就会触发对虚拟事件Treeview
的绑定目录)。触发事件时,代码最终删除先前创建的虚拟节点,现在使用指定目录中的内容填充节点。其余代码由有关在Treeview
中存储其他信息以使一切正常工作的详细信息组成。
答案 1 :(得分:-1)
我认为tkinter对此不是一个好选择。其他库如wxPython,PyQt或GTK都有GUI组件,可以帮助您以最少的工作量实现这一目标。