Tkinter:使用网格在拉伸的 LabelFrames 中右对齐标签

Tkinter: right align Labels within stretched LabelFrames using grid

tkinter 中使用 grid,我正在尝试对齐一组帧(我很想 post 一张照片,但我不允许。)

我有两个不同大小的外部 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()

甚至没有 运行 你的代码我看到两个问题。首先是您在调用 grid 时并不总是使用 sticky 参数。这可能是问题的一部分。我很少在不使用该参数的情况下使用 grid

第二个问题是您没有为任何行和列赋予任何权重。如果没有正权重,列和行只会用完它们所需要的内容 space,不会更多。任何额外的 space 都未分配。

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

最后一个建议:在开发过程中,为每个框架赋予独特的颜色非常有帮助。这确实有助于可视化框架如何使用可用 space.

感谢 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()