[英]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.