【问题标题】:Using classes as frames in Python Tkinter在 Python Tkinter 中使用类作为框架
【发布时间】:2018-04-08 20:41:28
【问题描述】:

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

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

但是当我运行代码时,我得到这个错误“'MainProgram' object has no attribute '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

【问题讨论】:

标签: python class tkinter


【解决方案1】:

替换:

self.Firstframe()

与:

self.ff=Firstframe()

- Firstframe() 不是Mainprogram 的属性。

【讨论】:

    【解决方案2】:

    查看此处的链接以获得将代码组织成类的良好起点

    Switch between two frames in tkinter

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

    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
    

    【讨论】:

    • 谢谢!如果我想让第二类中的框架成为 mainwin 的孩子,我会得到一个错误。我怎么能解决这个问题?这是错误:“类型对象'MainProgram'没有属性'mainwin'”
    • widget的父子关系可以通过.winfo_children()方法查看。上面的示例显示 MainProgram 中的框架有一个 text=hi 的子框架。这似乎是你的目标。这是使您的原始代码工作所需的更改示例。
    • 如果我想让 FirstFrame.firstframe 成为 MainProgram.win 的子级,我就是做不到。在您提供的代码中,它们也没有被安排来展示它是如何工作的。请问你能帮忙吗?
    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多