【问题标题】:How to make multiple Frames in Tkinter using OOP?如何使用 OOP 在 Tkinter 中制作多个帧?
【发布时间】:2025-12-17 21:45:02
【问题描述】:

所以,我正在学习类和方法,并试图通过在类中使用 init 方法来制作多个框架。以下是我所做的:

    from tkinter import *
    import random
    from PIL import ImageTk, Image
    
    win = Tk()
    win.attributes('-fullscreen', True)
    # Define Frame Class
    
    class MyFrame:
        def __init__(self, master):
            frame = Frame(master, width = win.winfo_screenwidth(),
                    height = win.winfo_screenheight(),
                    bg='black')
            frame.pack()
    
    def FrameOne():
        frameone = MyFrame(win)
    
    
    def FrameTwo():
        frametwo = MyFrame(win)

    #Call Frame (This is where I want the following frames to have different unique attributes)
    
    FrameOne()
    FrameTwo()
    
    win.mainloop()

我的问题是如何设置不同的Frame背景、边框和其他Frame属性,让每个Frame都有独特的属性。

【问题讨论】:

    标签: python oop tkinter frame


    【解决方案1】:

    在使用类时指定框架参数的最简单方法是将关键字 args 传递给框架。这可以通过在 init 中的参数末尾添加 **kwargs 来轻松完成。那么你就可以在声明框架时像往常一样传递所有参数。

    代码如下:

    from tkinter import *
    import random
    from PIL import ImageTk, Image
    
    win = Tk()
    win.attributes('-fullscreen', True)
    # Define Frame Class
    
    class MyFrame:
        def __init__(self, master, **kwargs):
            frame = Frame(master, **kwargs)
            frame.pack()
    
    def FrameOne():
        frameone = MyFrame(win, width = win.winfo_screenwidth(),
                           height = win.winfo_screenheight()//2,
                           bg='black')
    
    
    def FrameTwo():
        frametwo = MyFrame(win, width=win.winfo_screenwidth(),
                           height = win.winfo_screenheight()//2,
                           bg='blue')
    
    #Call Frame (This is where I want the following frames to have different unique attributes)
    
    FrameOne()
    FrameTwo()
    
    win.mainloop()
    

    注意:如果要指定任何默认参数以应用于所有框架,请在声明中将它们添加到 ,**kwargs 之前。 例如:Frame(window, bg="white", **kwargs)

    编辑:*args,**kwargs: *args 基本上是以列表格式解包。 *args 接受尽可能多的值。如果你打印 args,它会输出一个列表。

    **kwargs 基本上是在字典值中解包。 **kwargs 接受键值对。如果你打印 kwargs,它会输出一个字典。

    【讨论】:

    • 非常感谢!!现在我终于明白 **kwargs 做了什么。您能告诉我它与 **args 有何不同吗??
    • 我用 *args 和 **kwargs 的基本大纲编辑了我的答案
    最近更新 更多