从tkinter文本小部件

时间:2020-09-05 08:38:23

标签: python tkinter

借助以下代码,我将文件名(文件基本名称)插入tkinter文本小部件中,然后在按下“获取数据”按钮之后尝试打印完整的文件路径。

import tkinter as tk
from tkinter.filedialog import askopenfilename
import os

root=tk.Tk()    

ent=tk.Text(root)
ent.grid(row=1,column=0)

def addfile():
    filename =askopenfilename(filetypes=(("Tiff files","*.tif"),("All files","*.*")))
    ent.insert(tk.INSERT, '"' + os.path.basename(filename) + '"') 
    ent.insert(tk.INSERT, "\n")

def getfile():
    print(ent.get("1.0", tk.END))

b=tk.Button(root,text="Select File",command=addfile)
b.grid(row=0,column=0)

b1 = tk.Button(root,text="Get Data",command=getfile)
b1.grid(row=2,column=0)

root.mainloop()

运行上述代码后,仅打印文件名(不带文件路径)。

现在基本上我想要的是,在按下“获取数据”按钮(读取文本小部件的内容)之后,应该打印文件的完整路径。

其他信息:-

我知道,如果文件名不同,那么我可以使用字典(键,值)对来链接每个文件的基本名称及其绝对路径。但是,当将不同文件存在于不同文件夹位置但名称相同的文件添加到“文本”窗口小部件时,就会出现问题。

2 个答案:

答案 0 :(得分:1)

正如Cool Cloud所说,很难给出所需的确切答案,因为您没有告诉我们正在发生什么以及您期望/会发生什么。

我的阅读方式是您要么想要

  1. 您从public interface RequestMapper<Map<String, MyRequest>> extends Mapper { } 获得的完整文件名,将其插入askopenfilename()小部件中。
  2. 您希望在单击Text Button时打印完整的文件名,但要保留b1小部件。

1。。我将Text更改为

def addfile():

这是插入完整的文件路径,而不是插入基本名称,即插入def addfile(): filename = askopenfilename() ent.insert(tk.INSERT, '"' + filename + '"\n') 而不是"D:/example/help.tif"

2。。我将使用下面的代码

help.tif

我要做的是创建一个名为root = tk.Tk() def addfile(): filename = askopenfilename() list_of_filenames.append(filename) ent.insert(tk.INSERT, '"' + os.path.basename(filename) + '"\n') def getfile(): for i in range(len(list_of_filenames)): print(list_of_filesnames[i]) list_of_filenames = [] ent = tk.Text(root) ent.grid(row=1, column=0) b=tk.Button(root,text="Select File",command=addfile) b.grid(row=0,column=0) b1 = tk.Button(root,text="Get Data",command=getfile) b1.grid(row=2,column=0) root.mainloop() 的全局列表变量,并在list_of_filenames中添加了行def addfile():,这将获取您选择的文件和路径,并将其添加到列表变量。这样就为您提供了一个列表,其中列出了您选择的每个文件,并且您创建的任何函数都可以访问它,因为它是全局的。

最后的更改是list_of_filenames.append(filename)可以完全按照您想要的方式完成,我已经写好了它,可以将每个文件单独打印在单独的行上,而无需方括号或引号。

使用与第1部分相同的示例,如果我选择了路径为def getfile():的文件,则D:/example/help.tif小部件将显示为“ help.tif”,并且当单击Text时{{ 1}}将被打印到控制台上。

答案 1 :(得分:0)

我将拆分代码以尝试解释我所做的事情。

前4个功能是执行addfile():以及您要求的其他操作。

  1. 第一个功能split_filename(path):的功能名称所言。它将采用输入的路径并创建路径各个部分的列表。 (即,如果您有D:/folder/example/help/test.tif,它将返回['D:/', 'folder', 'example', 'help', 'test.tif'],稍后您将看到,当您拥有两个相同的基本名称时,这很有用。
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
  1. 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
  1. 如果新选择的文件基本名称已经存在于if_true_split_path_for_basename(selected_file_path, selected_file_basename):小部件中,则调用第三个Text。功能采用新选定文件和已保存文件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)})
  1. 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的内容,然后获取基本名称并打印相应的路径。

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)

您需要做的最后更改是创建全局词典 通过添加dict_of_filename = {}函数下方的def getFile():插入,没有像TextButton变量那样的缩进

其他一切都保持不变。