Tkinter:使用网格

时间:2015-08-03 05:03:39

标签: python tkinter alignment grid-layout

grid中使用tkinter,我正在尝试对齐一组帧(我很想发布一张图片,但我不允许这样做。)

我有两个不同大小的外LabelFrames并且彼此叠加,我想伸展和对齐。 在底部框架中,我有几个其他LabelFrames的堆栈,并且在每个LabelFrames内都有一个Label。我希望LabelFrames扩展到外部容器,并使每个内部Labels与包含LabelFrame正确对齐。

我尝试了stickyanchorjustify的各种组合,但没有成功。

有任何建议,推荐吗?

#!/usr/bin/env python
import Tkinter as tk



class AlignTest(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.parent = parent
        self.grid()
        self.parent.title('Align test')
        self.createMenus()
        self.createWidgets()


    def createMenus(self):
        # Menu
        self.menubar = tk.Menu(self.parent)
        self.parent.config(menu=self.menubar)

        # Menu->File
        self.fileMenu = tk.Menu(self.menubar)

        # Menu->Quit
        self.fileMenu.add_command(label='Quit',
                                  command=self.onExit)

        # Create File Menu
        self.menubar.add_cascade(label='File',
                                 menu=self.fileMenu)


    def createWidgets(self):

        # Main frame
        self.mainFrame = tk.Frame(self.parent)
        self.mainFrame.grid(row=0, column=0)

        # Outer LabelFrame1
        self.outerLabelFrame1 = tk.LabelFrame(self.mainFrame,
                                             text='Outer1')
        self.outerLabelFrame1.grid(row=0, column=0)

        # Inner Label
        self.innerLabel = tk.Label(self.outerLabelFrame1,
                                   text='This is a longer string, for example!')
        self.innerLabel.grid(row=0, column=0)


        # Outer LabelFrame2
        self.outerLabelFrame2 = tk.LabelFrame(self.mainFrame,
                                             text='Outer2')
        self.outerLabelFrame2.grid(row=1, column=0, sticky='ew')

        # Inner labelFrames each with a single labels
        self.innerLabel1 = tk.LabelFrame(self.outerLabelFrame2,
                                         bg='yellow',
                                         text='Inner1')
        self.innerLabel1.grid(row=0, column=0, sticky='ew')
        self.value1 = tk.Label(self.innerLabel1,
                               bg='green',
                               text='12.8543')
        self.value1.grid(row=0, column=0, sticky='')

        self.innerLabel2 = tk.LabelFrame(self.outerLabelFrame2,
                                         bg='yellow',
                                         text='Inner2')
        self.innerLabel2.grid(row=1, column=0, sticky='ew')
        self.value2 = tk.Label(self.innerLabel2,
                               bg='green',
                               text='0.3452')
        self.value2.grid(row=0, column=0, sticky='')

        self.innerLabel3 = tk.LabelFrame(self.outerLabelFrame2,
                                         bg='yellow',
                                         text='Inner3')
        self.innerLabel3.grid(row=2, column=0, sticky='')
        self.value3 = tk.Label(self.innerLabel3,
                               bg='green',
                               text='123.4302')
        self.value3.grid(row=0, column=0, sticky='')

    def onExit(self):
        self.parent.quit()



def main():
    root = tk.Tk()
    app = AlignTest(root)
    app.mainloop()



if __name__ == '__main__':
   main()

2 个答案:

答案 0 :(得分:1)

如果没有运行代码,我会发现两个问题。首先,您在调用sticky时并不总是使用grid参数。这可能是问题的一部分。我很少使用grid而不使用该参数。

第二个问题是你没有给任何重量的行和列。如果没有正重量,列和行只会占用内容所需的空间,而不会更多。任何额外的空间都是未分配的。

一个好的经验法则是,在用作其他小部件(通常是框架)的容器的每个小部件中,您应该始终给予至少一行和一列正权重。

作为最后的建议:在开发过程中,为每个框架赋予独特的颜色是非常有帮助的。这实际上有助于可视化帧如何使用可用空间。

答案 1 :(得分:0)

感谢Bryan对weight的评论,以下是该代码的工作版本作为潜在参考。 (我会在允许的情况下添加图片。)

#!/usr/bin/env python
import Tkinter as tk



class AlignTest(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.parent = parent
        self.grid()
        self.parent.title('Align test')
        self.createMenus()
        self.createWidgets()


    def createMenus(self):
        # Menu
        self.menubar = tk.Menu(self.parent)
        self.parent.config(menu=self.menubar)

        # Menu->File
        self.fileMenu = tk.Menu(self.menubar)

        # Menu->Quit
        self.fileMenu.add_command(label='Quit',
                                  command=self.onExit)

        # Create File Menu
        self.menubar.add_cascade(label='File',
                                 menu=self.fileMenu)


    def createWidgets(self):

        # Main frame
        self.mainFrame = tk.Frame(self.parent)
        self.mainFrame.grid(row=0, column=0)

        # Outer LabelFrame1
        self.outerLabelFrame1 = tk.LabelFrame(self.mainFrame,
                                             text='Outer1')
        self.outerLabelFrame1.grid(row=0, column=0)

        # Inner Label
        self.innerLabel = tk.Label(self.outerLabelFrame1,
                                   text='This is a longer string, for example!')
        self.innerLabel.grid(row=0, column=0)


        # Outer LabelFrame2
        self.outerLabelFrame2 = tk.LabelFrame(self.mainFrame,
                                             text='Outer2')
        self.outerLabelFrame2.grid(row=1, column=0, sticky='ew')
        self.outerLabelFrame2.grid_columnconfigure(0, weight=1)

        # Inner labelFrames each with a single labels
        self.innerLabel1 = tk.LabelFrame(self.outerLabelFrame2,
                                         bg='yellow',
                                         text='Inner1')
        self.innerLabel1.grid(row=0, column=0, sticky='ew')
        self.innerLabel1.grid_columnconfigure(0, weight=1)
        self.value1 = tk.Label(self.innerLabel1,
                               bg='green',
                               anchor='e',
                               text='12.8543')
        self.value1.grid(row=0, column=0, sticky='ew')


        self.innerLabel2 = tk.LabelFrame(self.outerLabelFrame2,
                                         bg='yellow',
                                         text='Inner2')
        self.innerLabel2.grid(row=1, column=0, sticky='ew')
        self.innerLabel2.grid_columnconfigure(0, weight=1)
        self.value2 = tk.Label(self.innerLabel2,
                               bg='green',
                               anchor='e',
                               text='0.3452')
        self.value2.grid(row=0, column=0, sticky='ew')


        self.innerLabel3 = tk.LabelFrame(self.outerLabelFrame2,
                                         bg='yellow',
                                         text='Inner3')
        self.innerLabel3.grid(row=2, column=0, sticky='ew')
        self.innerLabel3.grid_columnconfigure(0, weight=1)
        self.value3 = tk.Label(self.innerLabel3,
                               bg='green',
                               anchor='e',
                               text='123.4302')
        self.value3.grid(row=0, column=0, sticky='ew')

    def onExit(self):
        self.parent.quit()



def main():
    root = tk.Tk()
    app = AlignTest(root)
    app.mainloop()



if __name__ == '__main__':
   main()