我将拆分我的代码来尝试解释我所做的事情。
前 4 个功能是执行 addfile(): 以及您要求的其他事情。
- 第一个函数
split_filename(path): 按照函数名称的说明进行操作。它将采用输入的路径并创建路径各个部分的列表。 (即,如果您有 D:/folder/example/help/test.tif,它将返回 ['D:/', 'folder', 'example', 'help', 'test.tif'],稍后您会发现,当您有 2 个相同的基本名称时,这很有用。
def split_filename(path):
allParts = []
while 1:
parts = os.path.split(path)
if parts[0] == path:
allParts.insert(0, parts[0])
break
elif parts[1] == path:
allParts.insert(0, parts[1])
break
else:
path = parts[0]
allParts.insert(0, parts[1])
return allParts
-
check_if_fileBasename_in_current_content(current_content, selected_file_basename): 函数名称再次告诉您它的作用。这会检查新选择的文件基名是否已经在 Text 小部件中。
def check_if_fileBasename_in_current_content(current_content, selected_file_basename):
for line in current_content:
if line == '':
pass
elif line == selected_file_basename:
return True
- 如果
Text 小部件中已存在新选择的文件基名,则调用第三个if_true_split_path_for_basename(selected_file_path, selected_file_basename):。该函数采用新选择的文件和已保存的 1 的路径。如果您有 2 个文件:D:/example1/help.tif(新选择)和 D:/example2/help.tif(先前添加),新选择的基本名称将变为 example2/help.tif 而不仅仅是 help.tif。通过这样做,可以区分两个文件之间的差异。在函数结束时,创建的基本名称认为函数被插入ent 并添加到字典dict_of_filenames(这在单击b1 时打印路径时很有用。)
def if_true_split_path_for_baseline(selected_file_path, selected_file_basename):
basename_for_text_widget = []
if selected_file_path in dict_of_filenames:
pass
else:
for path, basename in dict_of_filenames.items():
if basename == selected_file_basename:
duplicate_path_split = split_filename(path)
selected_file_path_split = split_filename(selected_file_path)
for i in range(len(selected_file_path_split)):
duplicate_slice = duplicate_path_split[-(i + 1)]
selected_slice = selected_file_path_split[-(i + 1)]
if duplicate_slice == selected_slice:
basename_for_text_widget.insert(0, selected_slice)
else:
basename_for_text_widget.insert(0, selected_slice)
break
ent.insert(tk.INSERT, str('/'.join(basename_for_text_widget) + '\n'))
dict_of_filenames.update({selected_file_path: '/'.join(basename_for_text_widget)})
-
addFile()链接以上所有功能,它:索要文件;获取基本名称;获取所有当前文本在Text 小部件中;检查基本名称是否已经存在,如果存在则调用函数 3(上文),最后如果它是新的基本名称,则将基本名称插入ent 并将路径和基本名称添加到字典中。
def addFile():
selected_file_path = askopenfilename(filetypes=(("Tiff files", "*.tif"), ("All files", "*.*")))
selected_file_basename = os.path.basename(selected_file_path)
current_content = ent.get("1.0", tk.END).splitlines()
check1 = check_if_fileBasename_in_current_content(current_content, selected_file_basename)
basename_for_text_widget = []
if check1:
if_true_split_path_for_baseline(selected_file_path, selected_file_basename)
else:
basename_for_text_widget.append(selected_file_basename)
dict_of_filenames.update({selected_file_path: ''.join(basename_for_text_widget)})
ent.insert(tk.INSERT, str(' '.join(basename_for_text_widget) + '\n'))
接下来是getFile():取ent的内容,然后取basename并打印对应的路径。
def getFile():
current_content = ent.get(1.0, tk.END).splitlines()
for path, basename in dict_of_filenames.items():
if basename in current_content:
print(path)
您需要做的最后一个更改是创建全局字典
通过在def getFile(): 函数下方添加dict_of_filename = {} 插入,没有像Text 和Button 变量那样的缩进
其他一切都保持原样。