我正在尝试从类外部访问类FirstPage中定义的Text小部件。 我尝试通过创建FirstPage的新实例来解决此问题,但无法找到要使用的正确参数。还尝试使用GUI实例获取访问权限,但未成功。
当我可以从类外部使用text.insert(0.0,t)时,我的问题就解决了。它可以帮助我修改与Tkinter一起显示的文本,这些函数与GUI没有直接关系。
找到我尝试使用的代码的来源:Switch between two frames in tkinter
我也删除了这个问题不需要的行。
_y
修改 这是工作代码:
import Tkinter as tk
class GUI(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.geometry(self, '580x410')
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
frame = FirstPage(container, self)
self.frames[FirstPage] = frame
frame.grid(row=0, column=0, sticky="nsew")
frame = self.frames[FirstPage]
frame.tkraise()
class FirstPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
text = tk.Text(self , height=25, width=80)
text.grid(column=0, row=0, sticky="nw")
app = GUI()
app.mainloop()
答案 0 :(得分:2)
你没什么需要做的。与任何python对象一样,您只需要对对象进行引用即可对其进行操作。
您开始使用的代码中的概念是拥有一个“控制器”来控制对所有页面的访问,因为该对象是创建页面的位置。您可以在控制器中添加一个函数,为您提供对页面的引用,然后您可以使用它来调用该页面上的函数。
以下是您需要对控制器进行的更改:
class GUI(tk.Tk):
def __init__(self, *args, **kwargs):
...
page_name = FirstPage.__name__
self.frames[page_name] = frame
...
def get_page(self, page_name):
return self.frames[page_name]
您还需要修改FirstPage
以保留对窗口小部件的引用,以便以后可以访问它:
class FirstPage(tk.Frame):
def __init__(self, parent, controller):
...
self.text = tk.Text(...)
...
从任何其他代码中,您现在可以通过get_page
访问文本小部件(但您的页面必须保存对控制器的引用才能使其生效)。
class AnotherPage(tk.Frame):
def __init__(self, parent, controller):
...
self.controller = controller
...
def some_function(self):
...
first_page = self.controller.get_page("FirstPage")
text = first_page.text.get("1.0", "end-1c")
...
first_page.text.insert("end", "some new text\n")
请注意,此技术适用于任何GUI页面。在您的代码中,app
是控制器,因此您可以执行以下操作:
app = GUI()
app.get_page("FirstPage").text.insert("1.0", "Hello, world")