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
而不是普通字符串和 Label
的 textvariable
选项来实现目标:
...
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)
...
今天早上我开始开发一个小应用程序,以便更好地理解 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
而不是普通字符串和 Label
的 textvariable
选项来实现目标:
...
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)
...