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 に答える