Python:检索ttk.Frame大小

时间:2017-09-06 09:38:03

标签: python tkinter

我想要获得Frame的大小 - 但没有运气。

在下面的代码中 - 我得到了两个答案,“0”(标有***的行)

from tkinter import *
from tkinter import ttk

root = Tk()
w = '400'
h = '100'
root.geometry('{}x{}'.format(w, h))
root.configure(bg='lightgreen')

txt = StringVar()
txt.set("Hello")


testframe = ttk.Frame(root)
testframe.grid(row=0, column=1 )

label1 = ttk.Label(testframe, textvariable=txt)
label1.grid(row=0, column=0)

print(testframe["width"], testframe.cget("width"))   ***This line

root.mainloop()

2 个答案:

答案 0 :(得分:5)

首先需要调用update方法,以便呈现窗口小部件。 如果不是,则其宽度等于零。 这在this answer中解释。

现在,testframe['width']的问题在于它只是小部件实际宽度的提示,如this answer中所述。

以下代码将按预期输出32

from tkinter import *
from tkinter import ttk

root = Tk()
w = '400'
h = '100'
root.geometry('{}x{}'.format(w, h))
root.configure(bg='lightgreen')

txt = StringVar()
txt.set("Hello")


testframe = ttk.Frame(root)
testframe.grid(row=0, column=1 )

label1 = ttk.Label(testframe, textvariable=txt)
label1.grid(row=0, column=0)

# Modified lines
testframe.update()
print(testframe.winfo_width())

root.mainloop()

答案 1 :(得分:2)

框架小部件在屏幕上映射之前不会有大小。映射窗口小部件时会引发一个Tk事件,因此该示例的正确解决方案是绑定框架的<Map>事件,并在事件处理函数中执行print语句。

def on_frame_mapped(ev):
    print(ev.widget.winfo_width())

testframe.bind('<Map>', on_frame_mapped)