在Python Tkinter中将类用作框架

在Python Tkinter中将类用作框架,python,class,tkinter,Python,Class,Tkinter,我目前正在编写一个越来越长的Python Tkinter代码。我想对GUI中的一些框架使用多个类来实现 下面的代码是我正在尝试做的一个示例。基本上制作一个有框架的类,框架使用另一个类作为父类 但是当我运行代码时,我得到了这个错误“'MainProgram'对象没有属性'FirstFrame'” 有什么解决办法吗?我试着搜索,但没有找到像这样的东西 import tkinter as tk from tkinter import ttk class MainProgram(): def

我目前正在编写一个越来越长的Python Tkinter代码。我想对GUI中的一些框架使用多个类来实现

下面的代码是我正在尝试做的一个示例。基本上制作一个有框架的类,框架使用另一个类作为父类

但是当我运行代码时,我得到了这个错误“'MainProgram'对象没有属性'FirstFrame'”

有什么解决办法吗?我试着搜索,但没有找到像这样的东西

import tkinter as tk
from tkinter import ttk

class MainProgram():
    def __init__(self):
        self.mainwin = tk.Tk()
        self.FirstFrame()        


class FirstFrame():
    def __init__(self):
        self.firstframe = ttk.LabelFrame(self.MainProgram.mainwin, text="hi")
        self.firstframe.grid(column=0, row=0)

if __name__ == "__main__":
    main = MainProgram()
    main.mainwin.mainloop
替换:

self.Firstframe()
与:


-
Firstframe()
不是
Mainprogram

查看此处的链接,了解将代码组织到类中的良好起点

该示例可以“按原样”用于组织策略,也可以作为一个很好的模板,一次修改一个条目,并了解其他可能的结构,其中一个类可以用于创建另一个类的实例

import tkinter as tk
from tkinter import ttk

class MainProgram():
    def __init__(self):
        self.mainwin = tk.Tk()
        self.my_frame = FirstFrame()
        # examine the child parent relationship
        for child in self.mainwin.winfo_children():
            print(child['text'])        


class FirstFrame():
    def __init__(self):
        self.firstframe = ttk.LabelFrame(text="hi")
        self.firstframe.grid(column=0, row=0)
        ttk.Label(master=self.firstframe,text='a widget inside frame').grid()

if __name__ == "__main__":
    main = MainProgram()
    main.mainwin.mainloop

FirstFrame不是类MainProgram的方法,这就是为什么会出现此错误。可能是重复的,谢谢!如果我想使第二类中的帧成为mainwin的子帧,我会得到一个错误。我怎样才能解决这个问题?这是错误:“类型对象‘MainProgram’没有属性‘mainwin’”。可以使用.winfo_children()方法检查小部件的父子关系。上面的示例显示MainProgram中的框架有一个子项text=hi。这似乎是你的目标。这是一个使原始代码正常工作所需更改的示例。如果我想让FirstFrame.FirstFrame成为MainProgram.win的子级,我就是无法让它正常工作。在您提供的代码中,也没有安排它们来显示这是如何工作的。你能帮忙吗?
import tkinter as tk
from tkinter import ttk

class MainProgram():
    def __init__(self):
        self.mainwin = tk.Tk()
        self.my_frame = FirstFrame()
        # examine the child parent relationship
        for child in self.mainwin.winfo_children():
            print(child['text'])        


class FirstFrame():
    def __init__(self):
        self.firstframe = ttk.LabelFrame(text="hi")
        self.firstframe.grid(column=0, row=0)
        ttk.Label(master=self.firstframe,text='a widget inside frame').grid()

if __name__ == "__main__":
    main = MainProgram()
    main.mainwin.mainloop