Python Tkinter,从类外修改文本

Python Tkinter,从类外修改文本,python,oop,tkinter,Python,Oop,Tkinter,我试图从类外部访问类FirstPage中定义的文本小部件。 我试图通过创建一个新的FirstPage实例来解决这个问题,但是找不到正确的参数来使用。还尝试使用GUI实例获得访问权限,但未成功 当我可以从类外使用text.insert(0.0,t)时,我的问题就解决了。它将帮助我通过与GUI不直接相关的函数修改Tkinter显示的文本 我尝试使用的代码的来源是: 我还删除了这个问题不需要的行 import Tkinter as tk class GUI(tk.Tk): def __in

我试图从类外部访问类FirstPage中定义的文本小部件。 我试图通过创建一个新的FirstPage实例来解决这个问题,但是找不到正确的参数来使用。还尝试使用GUI实例获得访问权限,但未成功

当我可以从类外使用text.insert(0.0,t)时,我的问题就解决了。它将帮助我通过与GUI不直接相关的函数修改Tkinter显示的文本

我尝试使用的代码的来源是:

我还删除了这个问题不需要的行

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()
编辑: 以下是工作代码:

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()

        page_name = FirstPage.__name__
        self.frames[page_name] = frame


    def get_page(self, page_name):
        return self.frames[page_name]


class FirstPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        self.text = tk.Text(self , height=25, width=80)
        self.text.grid(column=0, row=0, sticky="nw")



app = GUI()
app.get_page("FirstPage").text.insert("1.0", "Hello, world")
app.mainloop()

你没什么特别需要做的。与任何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
访问文本小部件(但您的页面必须保存对控制器的引用才能工作)

请注意,此技术在任何GUI页面之外工作。在您的代码中,
app
是控制器,因此您可以执行以下操作:

app = GUI()
app.get_page("FirstPage").text.insert("1.0", "Hello, world")

谢谢你的回答,布莱恩!我试图问一个不同的问题(我不想通过使用不同的页面来修改文本,而是从与GUI无关的其他函数中修改文本)。例如,读入一个.txt文件并在第一页上显示内容。我将对我的问题进行更具体的编辑,但首先我将尝试在这段代码中找出OOP理论,因为我仍然对它感到非常困惑。@additional:这个答案仍然适用。您可以从代码的任何其他部分执行
app.get_page(“FirstPage”).text.insert(…)
。是的!谢谢你,你真的帮了大忙!现在可以了。还只是说def get_page(self,page_name)-self缺失,在def下,某些_函数需要是self。text@additive:我已修复get_页面中丢失的自我。谢谢你指出这一点
app = GUI()
app.get_page("FirstPage").text.insert("1.0", "Hello, world")