使用Grid布局管理器发现元素大小?

时间:2012-08-22 13:04:51

标签: python tkinter

TkDocs网站是一个很好的资源,但它并不完整。 manpage已完成,但当然不记录Python绑定。 “How to get the screen size in Tkinter?”指出可以使用root.winfo_screenwidth()/ root.winfo_screenheight()获取窗口大小,但这只能解决整个窗口,而不是网格中的单个单元格。

使用TkDocs代码作为示例,如何找到例如第三行的高度,以便我可以设置一个防止按钮被隐藏的minsize?我尝试过使用bbox()或grid_bbox()的任何内容都不会返回除(0,0,0,0)之外的任何内容。返回实际大小的正确语法是什么?

-----编辑-----

代码现在显示了如何在从事件循环调用的例程中使用bbox(),返回正确的值。

from tkinter import *
from tkinter import ttk

# bbox() works after window has been rendered
def e_config(event):
    w, h = event.width, event.height
    print("Resize: content", w, "x", h)
    print("content bbox=", content.bbox())

def OK():
    print("OK: winfo, bbox:")
    print("    root: ", root.winfo_width(), root.winfo_height(), root.bbox())
    print(" content: ", content.winfo_width(), content.winfo_height(), content.bbox())
    print("   frame: ", frame.winfo_width(), frame.winfo_height(), frame.bbox())

root = Tk()

content = ttk.Frame(root, padding=(5,5,12,12))
content.bind("<Configure>", e_config)

frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=100)
namelbl = ttk.Label(content, text="Name")
name = ttk.Entry(content)

onevar = BooleanVar()
twovar = BooleanVar()
onevar.set(True)
twovar.set(False)

one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
ok = ttk.Button(content, text="Okay", command=OK)
cancel = ttk.Button(content, text="Cancel")

content.grid(column=0, row=0, sticky=(E, W))    # Don't resize vertically
frame.grid(column=0, row=0, columnspan=3, rowspan=2)
namelbl.grid(column=3, row=0, columnspan=2)
name.grid(column=3, row=1, columnspan=2)
one.grid(column=0, row=3)
two.grid(column=1, row=3)
ok.grid(column=3, row=3)
cancel.grid(column=4, row=3)

root.configure(bg="#234")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=1)
content.columnconfigure(1, weight=1)
content.columnconfigure(2, weight=1)
content.columnconfigure(3, weight=1)

# This doesn't work - screen hasn't been rendered yet
print("pre-init bbox ", content.bbox())

root.mainloop()

1 个答案:

答案 0 :(得分:2)

方法winfo_widthwinfo_height将为您提供给定小部件的实际大小。

请注意,在将小部件实际呈现到屏幕之前,这些方法和bbox都不会给您任何有用的信息。如果您需要使用它们,您需要确保事件循环有机会更新显示。

另外,请注意bbox方法返回小部件内内部的小部件的边界框,而不是小部件本身的边界。这就是为什么frame.grid_bbox()的结果返回所有零 - 它内部没有任何内容,因此边界框为0,0,0,0。但是,在呈现显示后,您应该看到content.box()的数字。例如,在我的盒子上,我得到(0,0,352,125)