如何使用.grid()在tkinter窗口底部放置小部件?

3

我知道在同一个Tkinter窗口中不能使用不同类型的几何管理器,比如.grid()和.pack()。我有一个已经使用.grid()布局的窗口,现在我想添加一个状态栏,它会被固定在窗口底部。我在网上找到的唯一方法是使用.pack(side = BOTTOM),但这并不可行,因为窗口的其余部分使用了.grid()。

那么在使用.grid()时,是否有办法选择窗口底部作为放置控件的位置呢?


2
提供一些示例代码,以展示您想要实现的内容。 - ncica
你可以在第一层中打包状态栏,将其他窗口放在另一个也被打包的窗口内。root->(状态栏(pack), 其他(pack)) 其他(pack)-> (窗口1(网格), 窗口2(网格))如果需要,我可以发布完整代码。 - Jason Chia
1
最好的建议就像@Jason Chia所评论的那样。自从我开始使用tkinter以来,我一直遇到同样的问题。你可以做的最好的事情就是将你的主窗口分割成框架。用网格方法管理你的主窗口。然后在你的框架(底部的那个)里创建你的状态栏。由于这个框架还没有任何小部件,你可以用pack添加一个状态栏并使用side=BOTTOM。 - JimShapedCoding
使用.grid_rowconfigure(<底部小部件的行索引 -1>, weight=1),可以将底部小部件定位在tkinter窗口的最底部。这会强制LayoutManager尽可能地调整底部小部件之前的空间大小。 - stovfl
@JimErginbash 没有注意到关键字 frames :D - Jason Chia
@JasonChia 说实话,我对Tkinter非常陌生,并且很难想象你所说的内容,如果可能的话,请贴出完整的代码,这将会非常有帮助! - Jellyman
2个回答

3

只需提供一个比其他行更大的row参数。然后,在它之前至少给一个行分配权重。

更好的方法是使用框架来组织您的代码。将滚动条放在底部,上面放一个框架。然后,在框架内使用网格布局。

示例:

# layout of the root window
main = tk.Frame(root)
statusbar = tk.Label(root, text="this is the statusbar", anchor="w")

statusbar.pack(side="bottom", fill="x")
main.pack(side="top", fill="both", expand=True)

# layout of the main window
for row in range(1, 10):
    label = tk.Label(main, text=f"R{row}")
    label.grid(row=row, sticky="nsew")
    main.grid_rowconfigure(row, weight=1)
...

1
from tkinter import *
from tkinter.ttk import *
import tkinter as tk

class sample(Frame):
    def __init__(self,master=None):
        Frame.__init__(self, master)
        self.status = StringVar()
        self.status.set("Initializing")
        statusbar = Label(root,textvariable = self.status,relief = SUNKEN, anchor = W)
        statusbar.pack(side = BOTTOM, fill = X)
        self.parent1 = Frame()
        self.parent1.pack(side = TOP) 
        self.createwidgets()
    def createwidgets(self):
        Label(self.parent1,text = "Grid 1,1").grid(row = 1, column = 1)
        Label(self.parent1,text = "Grid 1,2").grid(row = 1, column = 2)
        Label(self.parent1,text = "Grid 2,1").grid(row = 2, column = 1)
        Label(self.parent1,text = "Grid 2,2").grid(row = 2, column = 2)




if __name__ == '__main__':

    root = Tk()
    app = sample(master=root)
    app.mainloop()
因为我有点懒,所以使用标签来确保窗口的每个部分可以按需打包/网格。当您尝试排列小部件时,框架将是一个有用的工具。请注意,使用类可以在确定父项时使事情变得更容易。因此,想象每个框架都是一个父项,它们的子项可以按需打包。我建议先绘制所需的GUI,然后看看如何安排它们。如果您想在框架内添加另一个框架,只需执行以下操作:
self.level2 = Frame(self.parent1)

您可以在文档中查看其他设置

http://effbot.org/tkinterbook/frame.htm

PS:我正在使用一个类,因此有self关键字。如果您不想使用类,则将其更改为不带类也可以。但是,使用类会使代码更易读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,