【问题标题】:How to get a element to stick to the bottom-right corner in Tkinter?如何让一个元素粘在 Tkinter 的右下角?
【发布时间】:2016-12-25 17:37:59
【问题描述】:

我在 Tkinter for python3 中将按钮放在这样的框架上:

b2_1 = Button(frame1, text='aaaaaaaaaaaa')
b2_1.pack(pady=20, side=RIGHT)

b2_2 = Button(frame1, text='bbbbbbbbbbbbbbb')
b2_2.pack()

我希望按钮 b2_1 和 b2_2 不仅贴在右侧,而且贴在底部,一个在另一个上方。 我怎样才能做到这一点?

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    “如何在右下角放置东西?”的答案断章取义无法充分回答。这实际上取决于窗口中的其他内容。您可以使用 place 轻松地将小部​​件放置在您想要的任何位置,但这很少是正确的解决方案。

    如果您确实想在网格中布置事物(例如:最右边的列,底部有几行,顶部有一行或多行),网格相对容易理解。

    也可以使用Pack,尽管它通常涉及使用额外的框架。例如,您可以为左右创建一个框架,然后将按钮打包在右框架的底部。

    还可以使用多个框架以及其他框架。例如,您可以使用 grid 将主窗口小部件布局到页眉、主要区域和页脚中,然后使用 pack 在页脚中排列按钮。

    如果您实际上只想要两个按钮,并且希望它们堆叠在右下角,我建议使用grid。除了将它们放在底部的一行中之外,您还需要确保至少有另外一行和一列占用了任何额外的空间。行和列可以为空,但必须配置为具有“权重”。

    例如:

    frame1.grid_rowconfigure(0, weight=1)
    frame1.grid_columnconfigure(0, weight=1)
    
    # give the empty row 0 and column 0 a non-zero weight
    # so that grid gives all extra space to those columns.
    
    b2_1.grid(row=1, column=1)
    b2_2.grid(row=2, column=1)
    

    【讨论】:

      【解决方案2】:

      pack 在这种情况下不是理想的几何管理器。您在一个框架中使用包装,您只想一个接一个地粘贴孩子。还有一个地方经理,我还没有看到它的“自然”用途。

      在这种情况下使用grid manager。这不如 pack 简单,但具有您想要的灵活性。一旦你确定了你的网格将有多少行和列,使用.grid(column=lastcol,row=lastrow) 放置很简单。 Terry Jan Reedy 还建议使用太大的数字,因为不会显示空列/行,但我喜欢迂腐,所以我知道我的网格到底是什么样子。

      【讨论】:

      • 我同意使用网格。 “右下”表示最后一列,而不是第一列;-)。由于不显示空行和空列,因此“太大”的行和列也可以使用。例如,.grid(column=99, row=99)(或上面的按钮为row=98)通常应该可以工作。
      【解决方案3】:

      框架/窗口的 .gridsize() 方法返回一个具有网格大小的元组。即

          frame1.grid_size() = (number_of_columns_in_frame1, number_of_rows_in_frame1)
      

      要将某些东西放在框架的右下角,请使用:

          b2_1 = Button(frame1, text='aaaaaaaaaaaa')
          b2_1.grid(row=frame1.grid_size()[1], column=frame1.grid_size()[0])
      

      这将在 frame1 的网格中添加一行和一列,并将 b2_1 放置在新的行和列中(因为网格的行/列系统是零索引的)。

      在其下方添加另一个按钮: 使用与上述相同的系统,即

          b2_2 = Button(frame1, text='bbbbbbbbbbbbbbb')
          b2_2.grid(row=frame1.grid_size()[1], column=frame1.grid_size()[0])
      

      将创建另一个新行和列,并将 b2_2 放在 b2_1 的右下角。 因此,要将 b2_2 直接放在 b2_1 下方(即与 b2_1 在同一列中),您必须将列减少 1,即

          b2_2 = Button(frame1, text='bbbbbbbbbbbbbbb')
          b2_2.grid(row=frame1.grid_size()[1], column=frame1.grid_size()[0]-1)
      

      【讨论】:

        【解决方案4】:

        在网格单元内定位元素 - 位置与指南针相同:N、E、S、W、NE、NW、SE 和 SW。

        这个例子贴在右下角:

        example_label.grid(column=0, row=0,sticky =SE)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-12
          • 2023-04-06
          • 1970-01-01
          • 2016-03-13
          • 2022-06-18
          • 1970-01-01
          • 2020-07-10
          • 1970-01-01
          相关资源
          最近更新 更多