Python 3.x 从其他帧更改Tkinter帧

Python 3.x 从其他帧更改Tkinter帧,python-3.x,tkinter,Python 3.x,Tkinter,我在Tkinter做了一个项目,我在一个框架中收集了一些信息(我们称之为框架一),基于这些信息,我想改变另一个框架的布局(我们称之为框架二) 我附加的代码是我想要实现的基本版本(我的项目大约有630行) 我遇到的问题是如何访问框架,这是一个类。我在谷歌上看到了布莱恩·奥克利(Bryan Oakley)的回复,但当我试图复制它时,我发现了一个错误 编辑:下面的修改使它工作,所以当点击第二页上的按钮时,它当前会在testText后面添加“testing” from tkinter import

我在Tkinter做了一个项目,我在一个框架中收集了一些信息(我们称之为框架一),基于这些信息,我想改变另一个框架的布局(我们称之为框架二)

我附加的代码是我想要实现的基本版本(我的项目大约有630行)

我遇到的问题是如何访问框架,这是一个类。我在谷歌上看到了布莱恩·奥克利(Bryan Oakley)的回复,但当我试图复制它时,我发现了一个错误

编辑:下面的修改使它工作,所以当点击第二页上的按钮时,它当前会在testText后面添加“testing”



from tkinter import *
from tkinter import ttk

class MyApp(Tk):

    def __init__(self):
        Tk.__init__(self)
        container = ttk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        self.frames = {}
        for F in (PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky = NSEW)
        self.show_frame(PageOne)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    def get_page(self, classname):
        '''Returns an instance of a page given its class name as a string'''
        for page in self.frames.values():
            if str(page.__class__.__name__) == classname:
                return page
        return None
    def test_get_page(self, page_class):
        return self.frames[page_class]
class PageOne(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller=controller
        ttk.Frame.__init__(self, parent)
        ttk.Label(self, text='PageOne').grid()
        self.testText = Text(self, height=2, width=30)

        button1 = ttk.Button(self, text='Next Page',
                                  command=lambda: controller.show_frame(PageTwo))
        self.testText.grid()
        button1.grid()


class PageTwo(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller=controller
        ttk.Frame.__init__(self, parent)
        ttk.Label(self, text='PageTwo').grid()        
        button1 = ttk.Button(self, text='Previous Page',
                             command=self.testButton)#controller.show_frame(PageOne))

        button1.grid()

    def testButton(self):
        page = self.controller.test_get_page(PageOne)
        page.testText.insert(END,'testing')       
        self.controller.show_frame(PageOne)

app = MyApp()
app.title('Multi-Page Test App')
app.mainloop()



当点击第二页上的“上一页”按钮时,PageOne的“testText”小部件将显示“testing”,但我得到了以下错误:

"Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Max\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:\Users\Max\Dropbox\Programación\prueba.py", line 54, in testButton
    page.testText.insert(0,'testing')
AttributeError: 'PageOne' object has no attribute 'testText'"

错误在堆栈跟踪中给出。“testText”变量当前不是PageOne对象的实例变量。你应该设置self.testText=Text(self,高度=2,宽度=30)

你的意思是在第一页吗?因为我刚刚尝试过这样做,但是当我运行它时,我得到了一个错误:“NameError:name'testText'未定义”。您可以发布更新的源代码以及完整的堆栈跟踪吗?对不起,我不知道这两个源代码是什么:您正在运行的程序背后的代码。(您的源代码是您先前发布的代码块。显示您在尝试我的回复时所做的操作。)堆栈跟踪:所做函数调用的记录。基本上就是那一大块函数和最终的错误消息。