Skip to main content
 首页 » 编程设计

python gui树走

2025年05月04日27三少

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

请您参考如下方法:

您可以使用小部件 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>> 的绑定(bind)。每当用户单击 Treeview 中的项目时都会触发可以进一步扩展(在这种情况下,代表目录的条目)。当事件被触发时,代码最终删除了之前创建的虚拟节点,现在用指定目录中的内容填充该节点。其余代码由有关在 Treeview 中存储附加信息的详细信息组成。让一切正常运转。