Python Tkinter,从类外修改文本
我试图从类外部访问类FirstPage中定义的文本小部件。 我试图通过创建一个新的FirstPage实例来解决这个问题,但是找不到正确的参数来使用。还尝试使用GUI实例获得访问权限,但未成功 当我可以从类外使用text.insert(0.0,t)时,我的问题就解决了。它将帮助我通过与GUI不直接相关的函数修改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
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")