Python Tkinter,从类外部修改Text

时间:2016-11-08 01:06:09

标签: python oop tkinter

我正在尝试从类外部访问类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()

1 个答案:

答案 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")