我知道在同一个Tkinter窗口中不能使用不同类型的几何管理器,比如.grid()和.pack()。我有一个已经使用.grid()布局的窗口,现在我想添加一个状态栏,它会被固定在窗口底部。我在网上找到的唯一方法是使用.pack(side = BOTTOM),但这并不可行,因为窗口的其余部分使用了.grid()。
那么在使用.grid()时,是否有办法选择窗口底部作为放置控件的位置呢?
只需提供一个比其他行更大的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)
...
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)
您可以在文档中查看其他设置
PS:我正在使用一个类,因此有self关键字。如果您不想使用类,则将其更改为不带类也可以。但是,使用类会使代码更易读。
.grid_rowconfigure(<底部小部件的行索引 -1>, weight=1)
,可以将底部小部件定位在tkinter窗口的最底部。这会强制LayoutManager尽可能地调整底部小部件之前的空间大小。 - stovfl