用于 Tarfile 项目的 Tkinter Treeview
Tkinter Treeview for Tarfile items
我在编写一个函数时遇到问题,该函数可以通过 .getmembers()
方法获取 tarfile 项目列表并将它们放入 Treeview 小部件中的正确树结构(文件夹和子文件夹中的文件)中。我找到了一个与我想要的相似的 post: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)
获得项目的父项和项目的标签。
根据 .getmembers()
文档字符串,
Return the members of the archive as a list of TarInfo objects. The
list has the same order as the members in the archive.
因此您无需担心父级是否存在,如果您使用 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)
我在编写一个函数时遇到问题,该函数可以通过 .getmembers()
方法获取 tarfile 项目列表并将它们放入 Treeview 小部件中的正确树结构(文件夹和子文件夹中的文件)中。我找到了一个与我想要的相似的 post: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)
获得项目的父项和项目的标签。
根据 .getmembers()
文档字符串,
Return the members of the archive as a list of TarInfo objects. The list has the same order as the members in the archive.
因此您无需担心父级是否存在,如果您使用 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)