在 Tkinter 3.x 中获取 canvas/widget 大小

Getting canvas/widget size in Tkinter 3.x

之前有人问过一个问题,,关于在 window 的大小发生变化时获取小部件的尺寸。

链接的问题和答案完美无缺,但我有一个跟进问题,遗憾的是因为我的帐户很新,我还不能 post 发表评论!

我的问题是;两者之间的有效区别是什么:

event.width

event.widget.winfo_width()

我的完整代码如下。

from tkinter import *

root = Tk()

display = Canvas(root, width=300, height=300, background="bisque")
display.pack(fill="both", expand=True)

display.create_text(10, 15, anchor="w", tags=["events"])
display.create_text(10, 30, anchor="w", tags=["winfos"])


def show_dims(event):
    display.itemconfigure("events", text="event.width: {0}, event.height: {1}".format(event.width, event.height))
    display.itemconfigure("winfos", text="winfo_width: {0}, winfo_height: {1}".format(event.widget.winfo_width(), event.widget.winfo_height()))

display.bind("<Configure>", show_dims)

root.mainloop()

据我所知,代码运行完美。随着 window 大小的更改,“”事件调用 show_dims 函数,更新显示的文本以显示 window 当前的宽度和高度(以像素为单位)。

我使用的两种获取window维度的方法是否相同?出于某种原因更好吗?

谢谢,

查看 event 文档:

width - width of the exposed window (Configure, Expose)

因此在您的特定情况下,event.widthevent.widget.winfo_width() 始终完全相同。

但有一个不同的事件:

from tkinter import *

root = Tk()
d = Label(root, width=50, height=50, text="HI")
d.pack(expand=True)

def check(event):
    print(event.width)
    print(event.widget.winfo_width())

d.bind("<1>", check)
root.mainloop()

这段代码显示:

??
456

所以除非事件是ConfigureExpose,否则必须使用winfo方法。 event.width 对客户来说可能更具可读性。