askopenfilename()禁用编辑tkinter条目

时间:2018-07-27 22:22:08

标签: python-3.x tkinter

我正在使用以下代码打开文件,将其行读入列表,并使用Entry中的子字符串过滤它们:

def get_entries(self):
    """
    Open a file and load entries into a list.
    """

    try:
        # self.file_name = "p1.py"
        self.file_name = askopenfilename(title="Open file")
        self.file_handle = open(self.file_name, "r")
    except IOError:
        messagebox.showinfo("Info", "No file has been openned.")
        self.destroy()
    else:
        self.entry_list = self.file_handle.readlines()
        self.update_list()

def update_list(self, *args):
    """
    Update the list after each editing of the search filter
    """

    search_term = self.search_var.get()

    self.lbox.delete(*self.lbox.get_children())

    for index, item in enumerate(self.entry_list):
        if search_term.lower() in item.lower():
            self.lbox.insert('', END, values=(index, item))

为什么使用self.file_name = "p1.py"可以正常工作,但是使用askopenfilename()却无法编辑条目? 使用Entry最小化和还原窗口可解决此问题。

我在Windows 10上使用PyCharm

以下是可供参考的其余代码:

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from tkinter.filedialog import askopenfilename


class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        self.file_name = ""
        self.file_handle = ""
        self.entry_list = None

        self.search_label = Label(self, text="Filter: ")
        self.search_var = StringVar()
        self.search_var.trace("w", self.update_list)
        self.search_entry = Entry(self, textvariable=self.search_var)

        self.lbox = ttk.Treeview(self, columns=('indices', 'entries'), displaycolumns='entries', show='headings')
        self.lbox.heading('entries', text="Entries", anchor="w")

        self.confirm = Button(self, text="Confirm", width=10, command=self.confirm_action)
        self.cancel = Button(self, text="Cancel", width=10, command=quit)

        self.search_label.grid(row=0, column=0, sticky=E, padx=12, pady=5)
        self.search_entry.grid(row=0, column=1, sticky=W, columnspan=4, pady=5)
        self.lbox.grid(row=1, column=0, columnspan=3, sticky=(N, W, S, E), padx=12, pady=5)

        self.cancel.grid(row=2, column=0, pady=5)
        self.confirm.grid(row=2, column=1, sticky=W, padx=12, pady=5)

        self.grid_columnconfigure(0, weight=1, uniform="u")
        self.grid_columnconfigure(1, weight=1, uniform="u")
        self.grid_columnconfigure(2, weight=4, uniform="u")

        self.get_entries()

    def get_entries(self): ...

    def update_list(self, *args): ...

    def confirm_action(self): ...


root = Tk()
root.title('Filter Listbox Test')
app = Application(master=root)
app.mainloop()

1 个答案:

答案 0 :(得分:1)

这似乎是一个问题,因为在绘制根窗口之前调用了askfilename。作为解决方法,您可以在致电self.update()之前添加askopenfilename

class Application(Frame):
    def __init__(self, master=None):
        # ... stuff ...

        self.update()
        self.get_entries()

我现在将提交有关此问题的错误报告。