Python 从单独的类调用GUI方法/子类

Python 从单独的类调用GUI方法/子类,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我正在尝试创建一个脚本来创建一个GUI类的实例,它本身就有子类来表示我想要显示的各种页面 目标是创建一个序列文件,调用特定的GUI页面来显示,一旦显示GUI页面并单击按钮,它就会从序列文件运行序列,然后命令显示哪些GUI页面 Sequeuncer看起来像这样(显示测试页面的标准简化了) 导入gui 类Sequencer(): 定义初始化(自): 通过 def run_gui(自身): #创建测试GUI的实例 self.my_gui=gui.TestGUI() self.my_gui.mainlo

我正在尝试创建一个脚本来创建一个GUI类的实例,它本身就有子类来表示我想要显示的各种页面

目标是创建一个序列文件,调用特定的GUI页面来显示,一旦显示GUI页面并单击按钮,它就会从序列文件运行序列,然后命令显示哪些GUI页面

Sequeuncer看起来像这样(显示测试页面的标准简化了)

导入gui
类Sequencer():
定义初始化(自):
通过
def run_gui(自身):
#创建测试GUI的实例
self.my_gui=gui.TestGUI()
self.my_gui.mainloop()
def运行测试(自我,输入):
如果x=1:
gui.TestGUI().show_页面(第一页)
如果x=2:
gui.TestGUI().show_页面(第二页)
GUI看起来像:

导入序列器
类TestGUI(tk.tk):
定义初始化(自):
#初始化容器
tk.tk.\uuuuu初始化(self)
容器=tk.框架(自身)
container.pack(side=“top”,fill=“both”,expand=True)
container.grid_rowconfigure(0,权重=1)
container.grid\u column配置(0,权重=1)
#将容器设置为固定大小
tk.tk.可调整大小(self、False、False)
#设置GUI的页面
self.pages={}
页面列表=[
第一页,
第二页
]
对于页面列表中的P:
框架=P(容器,自身)
self.pages[P]=框架
frame.grid(行=0,列=0,sticky=“nsew”)
#设置主页面
self.show_页面(主页)
def显示页面(自我,第页):
frame=self.pages[page]
frame.tkraise()
类别第一页(传统框架):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
entry=tk.entry(self,width=40,font=“Arial 16”,justify=“center”)
入口位置(relx=0.5,rely=0.5,anchor=“center”)
#为返回键创建绑定
entry.bind(“”,lambda事件:sequencer.sequencer().run_测试(entry.get())
第二类(传统框架):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
然后,我创建一个顶层脚本(main.py),该脚本创建Sequencer的一个实例并运行gui。我没有显示应该显示的页面,而是出现了一个错误


我做错了吗?

您不应该创建
Sequencer
的新实例。相反,传递引用或为其他类提供访问实例的方法

我要做的是将sequencer传递到您的GUI,如下所示:

class Sequencer():
    def run_gui(self):
        ...
        self.my_gui = gui.TestGUI(sequencer=self)
        ...

class TestGUI(tk.Tk):
    def __init__(self, sequencer):
        self.sequencer = sequencer
        ...
由于每个子页面都有一个
TestGUI
实例作为控制器,因此可以通过删除导入,然后使用控制器获取对sequencer的引用来引用现有sequencer:

class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        ...
        self.controller = controller
        ...

        entry.bind("<Return>", lambda event: self.controller.sequencer.run_test(entry.get()))
这样,对代码进行调试就容易多了,因为您可以在调用
run\u test
之前检查数据。在这个简单的例子中,这可能不是必需的,但是如果您养成了这样编码的习惯,那么当您发现自己在编写更复杂的命令时,它将派上用场

您还需要更改
run\u test
函数以重用现有的TestGUI实例,而不是每次都创建一个新实例

def run_test(self, entry):
    ...
        self.mygui.show_page(PageOne)
    ...

“我做错了吗?”:您没有显示完整的回溯。你的问题很有说服力。我喜欢这个。这简化了我将sequencer传递到GUI并从中运行方法的方式。但是,我想我仍然对调用GUI的
show\u page()
方法来更改显示给操作员的内容的代码片段感到困惑?我这样称呼它正确吗?@gerf.merns:您需要将
gui.TestGUI().show_page(PageOne)
更改为
self.my_gui.show_page(PageOne)
def run_test(self, entry):
    ...
        self.mygui.show_page(PageOne)
    ...