1

我正在尝试在 Python v2.7 的 tkinter 中创建一个自定义框架。我已经完成了一次(带有滚动条的框架),但我的第二次尝试不起作用。我将它与确实有效的框架进行了比较,但我无法理解我做了什么不同的事情。

我想要的是一个在它下面有一条小分隔线的框架,所以我正在创建一个“普通”框架,一个用作其下方分隔符的薄框架,以及一个用于容纳它的 bigFrame。

我在课堂上创建的所有东西都有效,除了框架本身。希望我的评论能解释什么是显示什么没有显示。

from Tkinter import *

class FunFrame(Frame):
    def __init__(self, master, lbl,  **kwargs):
        self.bigFrame = Frame(master) 
        Frame.__init__(self, self.bigFrame, width=280, height=200, bg="red", **kwargs)
        self.grid(row=0, column=0, pady=3) #this is in bigFrame, and doesn't display
                                    #however the padding is still respected
        self.separator = Frame(self.bigFrame, height=2, bd=1, width=280, relief = SUNKEN)
        self.separator.grid(row=1, column=0) #this is in bigFrame, and displays

        self.l = Label(self, text=lbl) #this is in self and doesn't display
        self.l.grid(row=0, column=0)


    def grid(self, **kwargs):
        self.bigFrame.grid(**kwargs)

if __name__ == "__main__":
    root=Tk()
    Frame1=FunFrame(root, "hello")
    Frame2=FunFrame(root, "world")
    Frame1.grid(row=0, column=0)
    Frame2.grid(row=1, column=0)
    root.mainloop()
4

1 回答 1

1

如果你调用self.grid__init__它调用你自己的grid,而不是 Tkinter 的版本。

尝试以下(重命名gridgrid_):

from Tkinter import *

class FunFrame(Frame):
    def __init__(self, master, lbl,  **kwargs):
        self.bigFrame = Frame(master) 
        Frame.__init__(self, self.bigFrame, width=280, height=200, bg="red", **kwargs)
        self.grid(row=0, column=0, pady=3)
        self.separator = Frame(self.bigFrame, height=2, bd=1, width=280, relief=SUNKEN)
        self.separator.grid(row=1, column=0)

        self.l = Label(self, text=lbl)
        self.l.grid(row=0, column=0)

    def grid_(self, **kwargs): ######## grid -> grid_
        self.bigFrame.grid(**kwargs)

if __name__ == "__main__":
    root=Tk()
    Frame1 = FunFrame(root, "hello")
    Frame2 = FunFrame(root, "world")
    Frame1.grid_(row=0, column=0) ######## grid -> grid_
    Frame2.grid_(row=1, column=0) ######## grid -> grid_
    root.mainloop()

我宁愿编写如下代码(if '....'用于直观地表示层次结构):

from Tkinter import *

class FunFrame(Frame):
    def __init__(self, master, lbl,  **kwargs):
        Frame.__init__(self, master)
        if 'inside outer frame (self)':
            innerFrame = Frame(self, width=280, height=200, bg="red", **kwargs)
            innerFrame.grid(row=0, column=0, pady=3)
            if 'inside inner frame':
                self.l = Label(innerFrame, text=lbl)
                self.l.grid(row=0, column=0)
            separator = Frame(self, height=2, bd=1, width=280, relief=SUNKEN)
            separator.grid(row=1, column=0)

if __name__ == "__main__":
    root = Tk()
    Frame1 = FunFrame(root, "hello")
    Frame2 = FunFrame(root, "world")
    Frame1.grid(row=0, column=0)
    Frame2.grid(row=1, column=0)
    root.mainloop()
于 2013-09-28T15:27:14.473 回答