簡體   English   中英

Tarfile 項目的 Tkinter Treeview

[英]Tkinter Treeview for Tarfile items

我在編寫一個函數時遇到了問題,該函數可以通過.getmembers()方法.getmembers() tarfile 項目列表,並將它們放在 Treeview 小部件中的適當樹結構(文件夾和子文件夾中的文件)中。 我找到了一個類似於我想要的帖子: Tkinter: Treeview widget ,但我無法讓它適應查看檔案。
我引用的解決方案的問題是它使用os來遍歷給定的目錄並將項目插入到 Treeview 中。 當然,這不適用於 tarfile,因為它是一個文件,而不是一個文件夾,所以當我嘗試修改解決方案時,我將 tarfile 成員存儲在一個列表中,並嘗試通過該函數提供它,但它對我不起作用。

本質上,我需要幫助編寫一個函數,該函數接受目錄和文件名列表,並且可以將父目錄插入到樹視圖的根目錄中,並將子項插入到它們的包含文件夾中。

import os
import tkinter as tk
import tkinter.ttk as ttk
import tarfile

window = tk.Tk()
window.title("Testing")
window.geometry("500x500")

tree = ttk.Treeview(window)
tree.pack()
tree.heading('#0', text="Item")
tree.column('#0', width=495)

# Get TAR items
with tarfile.TarFile("testing.tar") as topen:
    tarlist = topen.getmembers()

# Get our first directory in the list and remove it from stack
for i in tarlist:
    if i.isdir() == True:
        start_node = i.name
        del tarlist[tarlist.index(i)]
        break

# Insert root folder
root_node = tree.insert('', 'end', text=start_node)

def insert():
    # Go through the rest of the member list and put the member in the proper place
    # within the tree structure

window.mainloop()

這個想法是使用完整項目的路徑作為它在樹中的 iid,這樣您就可以獲得項目的父項和帶有parent, label = os.path.split(item.path)項的標簽parent, label = os.path.split(item.path)

根據.getmembers()文檔字符串,

將存檔成員作為 TarInfo 對象列表返回。 該列表與存檔中的成員具有相同的順序。

因此,您無需擔心是否存在父級,如果您使用 for 循環遍歷tarlist ,它將在之前創建,如下面的代碼所示。

import os
import tkinter as tk
import tkinter.ttk as ttk
import tarfile

window = tk.Tk()
window.title("Testing")
window.geometry("500x500")

tree = ttk.Treeview(window)
tree.pack()
tree.heading('#0', text="Item")
tree.column('#0', width=495)

# Get TAR items
with tarfile.TarFile("testing.tar") as topen:
    tarlist = topen.getmembers()


def insert():
    for item in tarlist:
        parent, label = os.path.split(item.path)
        tree.insert(parent, 'end', iid=item.path, text=label)

insert()
window.mainloop()

感謝 j_4321,這就是我為得到我想要的東西所做的。 我將 tarlist 拆分為 tardirs 和 tarfiles 列表,然后首先添加 tardirs,因為我希望它們按層次順序排列。 接下來是 Tarfiles 並插入到適當的位置。 我使用異常處理程序來捕獲文件與目錄同名的任何異常,並避免在該實例中使用 iid。 結果是一個 TAR 存檔的結構良好的視圖,接下來將在標識為目錄的項目旁邊添加文件夾圖標,以及如何使其看起來不那么美觀。

tardirs = []
tarfiles = []

for i in tarlist:
    if i.isdir() == True:
        tardirs.append(i)
    else:
        tarfiles.append(i)

def insert():
    for item in tardirs:
        parent, label = os.path.split(item.path)
        try:
            tree.insert(parent, 'end', iid=item.path, text=label)
        except Exception:
            tree.insert(parent, 'end', text=label)
    for item in tarfiles:
        parent, label = os.path.split(item.path)
        try:
            tree.insert(parent, 'end', iid=item.path, text=label)
        except Exception:
            tree.insert(parent, 'end', text=label)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM