Python 使用Tkinter将标准对象添加为帧类属性

Python 使用Tkinter将标准对象添加为帧类属性,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我正在尝试使用Tkinter创建一个GUI,它将允许我与一些实验室设备进行交互 我想有一个组合框,参考我的“硬件管理器”中各种设备的手柄 目前,在顶层框架(即Root())中,我将硬件管理器实例化为一个类atribute。但是,从嵌套帧访问该信息时遇到一些问题 下面是测试代码(为了简化事情): 从Tkinter导入* 导入ttk 类TestClass(): 定义初始化(自): self.test_数组=[1,2,3] 类TestFrame(框架): 定义初始化(自我,frMaster): 帧。初

我正在尝试使用Tkinter创建一个GUI,它将允许我与一些实验室设备进行交互

我想有一个组合框,参考我的“硬件管理器”中各种设备的手柄

目前,在顶层框架(即
Root()
)中,我将硬件管理器实例化为一个类atribute。但是,从嵌套帧访问该信息时遇到一些问题

下面是测试代码(为了简化事情):

从Tkinter导入*
导入ttk
类TestClass():
定义初始化(自):
self.test_数组=[1,2,3]
类TestFrame(框架):
定义初始化(自我,frMaster):
帧。初始帧(self,frMaster,bg='gray',padx=5,pady=5)
self.frMaster=frMaster
self.testClass=testClass()
self.subFrame=子帧(self.frMaster)
self.subFrame.grid(行=0,列=0,padx=10,pady=10)
类子帧(帧):
定义初始化(自我,frMaster):
帧。\uuuu初始化(自,frMaster)
self.frMaster=frMaster
self.sHandle=StringVar()
self.cbTest=ttk.Combobox(self.frMaster,宽度=20,justify='left',
值=[0,1,2],textvariable=self.sHandle)
self.cbTest.grid(行=0,列=0,padx=10,pady=10,sticky='nesw')
root=Tk()
测试=测试帧(根)
root.mainloop()
我希望使用
test\u类
中的
test\u数组
属性作为组合框的值列表。因此,理想情况下,实例化组合框的行实际上看起来如下所示:

self.cbTest=ttk.Combobox(self.frMaster,width=20,justify='left',
值=self.frMaster.testClass.test\u数组,
textvariable=self.sHandle)
但是,这显然不起作用,因为该实例中的
self.frMaster
实际上指的是根窗口,而不是
test\u框架
实例。所以我得到一个属性错误

我还尝试用“self”作为主帧来实例化
子帧。这在技术上是可行的,但它无法显示组合框

那么,有没有更好的方法来访问
TestClass
实例中的数据呢?或者,如果我将
TestFrame
实例作为主帧传递给
子帧
实例,那么如何让组合框显示


谢谢

尽可能简单地说,如果需要对象的属性(例如:
TestClass
中的
test\u数组
),则需要对该对象的引用(例如:
TestClass
的实例)

有几种方法可以做到这一点。最简单的方法是将引用传递给需要它的代码。例如:

class TestFrame(Frame):
    def __init__(self, frMaster):
        ...
        self.testClass = TestClass()
        self.subFrame = SubFrame(self.frMaster, self.testClass)
        ...

class SubFrame(Frame):
    def __init__(self, frMaster, testclass):
        ...
        self.cbTest = ttk.Combobox(..., values=testclass.test_array, ...)

在测试框架的
\uuu init\uu
函数中将测试类实例化为
self.frMaster.testClass=test\u class()
。这虽然很实用,但似乎有点“黑客”。我不得不想象有一个更好的方法来实现这一点。对于类,使用
大写名称
是一个很好的规则,例如
StringVar
TestFrame
子帧
,对于变量,使用
小写名称
,即
self.test\u frame=TestFrame()
。它有助于识别代码中的类。PEP8建议,许多人和工具都遵守这一规则。更多:很高兴知道,我将编辑帖子。看起来像是
TestFrame.\u init\u()
可以简单地将
self.testClass
作为参数传递给
SubFrame.\u init\u()
当它创建其
self.SubFrame
属性时。这可能是我必须走的路。如果可能的话,我想尽量避免它,因为我在实际代码中有超过20个子帧。不过,看起来我只能接受它了。@detroily:如果你有那么多的
子帧要创建,你可能应该根据软件开发的经验在某种循环中完成它。