防止Tkinter LabelFrames之间的交互

时间:2015-01-31 10:02:49

标签: python python-2.7 tkinter

我遇到一个问题,即创建一个tkinter标签框架会影响另一个标签框架。下面是一些将重新创建问题的代码。我希望第二个标签框self.group2延伸到低于第一个框架self.group1的底部。但是,如代码所示,self.group1的底部已扩展为与self.group2的结尾相匹配。

import Tkinter

class gui(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        for x in xrange(0, 11):
            self.grid_rowconfigure(x,weight=1)
            self.grid_columnconfigure(x,weight=1)

        self.group1 = Tkinter.LabelFrame(self, text="Group1", padx=5, pady=5)
        self.group1.grid(row=0, column=0, padx=10, pady=10, sticky='NSEW')

        self.b1 = Tkinter.Button(self.group1, text='Click', command=self.b1_f)
        self.b1.grid(row=1, column=0, sticky='NSEW')

    def b1_f(self):
        self.group2 = Tkinter.LabelFrame(self, text="Group2", padx=5, pady=5)
        self.group2.grid(row=0, column=1, padx=10, pady=10, sticky='NSEW')

        for row_count in xrange(6):
            Tkinter.Label(self.group2, text=row_count).grid(row=row_count, column=1, sticky='NSEW')

if __name__ == "__main__":
    # loop the window
    app = gui(None)
    app.mainloop()

在创建group2期间添加rowspan=7会有所帮助,但仍然会修改group1。

由于

1 个答案:

答案 0 :(得分:2)

我在使用布局管理器时发现的令人困惑的一点是,它们可以在多个层上工作'。在此示例中,您具有包含2个LabelFrame的窗口图层,然后每个LabelFrame都有一个图层。图层没有相互连接。

在这种情况下,问题出现在'窗口层'中。在此图层中,您有2个放置在第0行的LabelFrame,并使用sticky来填充整个区域。这意味着如果其中一个框架的尺寸发生变化,另一个框架也会发生变化。

试试这个:

import Tkinter

class gui(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        self.grid_rowconfigure(1, weight=1)

        self.group1 = Tkinter.LabelFrame(self, text="Group1", padx=5, pady=5)
        self.group1.grid(row=0, column=0, padx=10, pady=10, sticky='NSEW')

        self.b1 = Tkinter.Button(self.group1, text='Click', command=self.b1_f)
        self.b1.grid(row=1, column=0, sticky='NSEW')

    def b1_f(self):
        self.group2 = Tkinter.LabelFrame(self, text="Group2", padx=5, pady=5)
        self.group2.grid(row=0, column=1, rowspan=2, padx=10, pady=10, sticky='NSEW')

        for row_count in xrange(6):
            Tkinter.Label(self.group2, text=row_count).grid(row=row_count, column=1, sticky='NSEW')

if __name__ == "__main__":
    # loop the window
    app = gui(None)
    app.mainloop()

这里我改变了所以group2 frame rowspan是2然后在第二行设置weight = 1。通过这样做,第一行的大小不应该改变,即使第二行也是如此。