2

我试图弄清楚如何走一棵树,然后在一个用户可以导航的窗口中显示输出,就像我电脑左侧的那样。最终我计划有一个完全可浏览的窗口,就像你在右手边的那样。这是我到目前为止所拥有的,我猜它是伪代码和实际代码的混合体。这是在使用 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            
4

2 回答 2

4

您可以使用小部件来做到这一点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以使一切正常的详细信息组成。

于 2013-01-19T22:56:43.310 回答
-2

我认为 tkinter 将是一个糟糕的选择。wxPython、PyQt 或 GTK 等其他库确实具有 GUI 组件,可以帮助您以最小的努力实现这一目标。

于 2013-01-19T04:38:49.690 回答