【问题标题】:Tkinter: right align Labels within stretched LabelFrames using gridTkinter:使用网格在拉伸的 LabelFrames 中右对齐标签
【发布时间】:2015-10-25 02:43:25
【问题描述】:

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

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

【问题讨论】:

    标签: python tkinter alignment grid-layout


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢布莱恩! weight 确实是解决方案的关键。一个有趣的注意事项是,weight 应设置为 包含您要拉伸的小部件的小部件的属性。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2015-09-17
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多