我正在尝试从Tk主类调用另一个框架的标签,由于某种原因,它无法弄清楚。例如,在这里我试图使其成为文件,以便使用文件菜单可以获取文件目录,然后将其显示在PageOne下的标签中。但是很遗憾,“ open_exposure”功能无法到达PageOne中的ExposureLabel。希望对此有所帮助。
import tkinter as tk
#from tkinter import ttk #css for tkintr
from tkinter import filedialog as fd
class NewClass(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "Complete Test")
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True) #expand will expand window
container.grid_rowconfigure(0, weight = 1)
container.grid_columnconfigure(0, weight = 1)
menubar = tk.Menu(container)
filemenu = tk.Menu(menubar, tearoff = 0)
filemenu.add_command(label="Import File", command = lambda: self.open_exposure(PageOne))
filemenu.add_separator()
filemenu.add_command(label="Exit",command= self.destroy)
menubar.add_cascade(label="File", menu = filemenu)
tk.Tk.config(self, menu = menubar)
self.frames = {}
for F in (PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column = 0, sticky = "nsew") #grid is other option to pack. sticky means north south east west (alignment + stretch)
self.show_frame(PageOne)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
def get_page(self, page_class):
return self.frames[page_class]
def open_exposure(self, cont):
file_path = fd.askopenfilename()
label1 = self.get_page(PageOne)
label1.randomtext.set(file_path)
class PageOne(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
randomtext = tk.StringVar()
tk.Frame.__init__(self, parent)
label = tk.Label(self, text = """I'm Page One.""")
label.pack(pady = 10, padx = 10)
exposureLabel = tk.Label(self, text = randomtext.get())
exposureLabel.pack(pady = 10, padx = 10)
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
tk.Frame.__init__(self, parent)
label = tk.Label(self, text = """I'm Page Two.""")
label.pack(pady = 10, padx = 10)
app = NewClass()
app.geometry("1200x700")
app.mainloop()
编辑:我的问题被布莱恩·奥克利(Bryan Oakley)标记为重复,他发布了一个非常有用的答案here。但是,尝试了他的回答后,我无法使其适合我的情况。
他的解决方案是从另一个类访问StringVar变量。我的问题是我正在尝试从文件菜单中编辑PageOne上的标签。
所以目前我的问题是,我仍然无法从NewClass访问我的ExposureLabel。即使使用Bryan Oakleyn的get_page方法,也出现错误“ PageOne对象没有属性'randomtext'”。对于某些经验丰富的Tkinter用户而言,该解决方案可能是显而易见的,但对我而言,这是完全令人困惑的。谢谢。