Tkinter - 标签不更新

Tkinter - label doesn't update

今天早上我开始开发一个小应用程序,以便更好地理解 TkInter。 我没有走得太远,因为我无法在按下按钮后更新标签。

似乎在我创建了 Label 对象的实例之后,我猜是因为 mainloop() 的缘故我不能再处理它了?我尝试使用 .update() 和其他方法来完成这项工作,但我无法弄清楚。如果我将 () 添加到 file_explorer 方法,标签会更新,但我不能不再打开文件资源管理器,它还会在不按下按钮的情况下启动文件资源管理器,所以这毫无意义。在 Whosebug 上找到了一些东西,但仍然一无所获。

from tkinter import *
from tkinter import filedialog as fd
import os

# Main_window
App = Tk()
App.geometry("300x300")
App.resizable(0, 0)

filename = "empty"


class Btn:
    def __init__(self, master, pos_x, pos_y, label):
        frame = Frame(master)
        frame.pack()

        self.Button = Button(master, text=label, command=self.file_explorer)
        self.Button.place(x=pos_x, y=pos_y)

    def file_explorer(self):
        global filename
        filename = fd.askopenfilename(filetypes=(('text files', '*.txt'), ('All files', '*.*')))
        filename = os.path.basename(filename)


class FileLabel:
    def __init__(self, master, pos_x, pos_y):
        global filename
        frame = Frame(master)
        frame.pack()

        self.label1 = Label(master, text=filename)
        self.label1.place(x=pos_x, y=pos_y)


e = Btn(App, 10, 10, "Browse file")
f = FileLabel(App, 90, 12)

App.mainloop()

更新filename不会自动更新标签。但是,您可以使用 StringVar 而不是普通字符串和 Labeltextvariable 选项来实现目标:

...
filename = StringVar(value="empty")

class Btn:
    def __init__(self, master, pos_x, pos_y, label):
        frame = Frame(master)
        frame.pack()

        self.Button = Button(master, text=label, command=self.file_explorer)
        self.Button.place(x=pos_x, y=pos_y)

    def file_explorer(self):
        fname = fd.askopenfilename(filetypes=(('text files', '*.txt'), ('All files', '*.*')))
        # update filename
        filename.set(os.path.basename(fname))


class FileLabel:
    def __init__(self, master, pos_x, pos_y):
        frame = Frame(master)
        frame.pack()

        self.label1 = Label(master, textvariable=filename) # used textvariable instead
        self.label1.place(x=pos_x, y=pos_y)

...