Python Tkinter轨迹窗口是否专门调整大小?

Python Tkinter轨迹窗口是否专门调整大小?,python,events,tkinter,window-resize,Python,Events,Tkinter,Window Resize,我正在写一个小程序,当窗口大小改变时,它打算运行一个调整大小的方法。出于这个原因,我使用了toplevel.bind(“,self.resize)。虽然这确实适用于调整大小,但该方法会被调用数百次:在滚动时,在使用某些按钮时,即使窗口大小不会随这些操作的任何一个而改变。如何绑定事件,使其仅在更改窗口大小时被调用 import tkinter as tk def resize(event): print("widget", event.widget) print("height"

我正在写一个小程序,当窗口大小改变时,它打算运行一个调整大小的方法。出于这个原因,我使用了
toplevel.bind(“,self.resize)
。虽然这确实适用于调整大小,但该方法会被调用数百次:在滚动时,在使用某些按钮时,即使窗口大小不会随这些操作的任何一个而改变。如何绑定事件,使其仅在更改窗口大小时被调用

import tkinter as tk

def resize(event):
    print("widget", event.widget)
    print("height", event.height, "width", event.width)

parent = tk.Toplevel()
canvas = tk.Canvas(parent)
scroll_y = tk.Scrollbar(parent, orient="vertical", command=canvas.yview)
scroll_x = tk.Scrollbar(parent, orient="horizontal", command=canvas.xview)
frame = tk.Frame(canvas)

# put the frame in the canvas
canvas.create_window(0, 0, anchor='nw', window=frame)
# make sure everything is displayed before configuring the scrollregion
canvas.update_idletasks()

canvas.configure(scrollregion=canvas.bbox('all'), 
                yscrollcommand=scroll_y.set,
                xscrollcommand=scroll_x.set)

scroll_y.pack(fill='y', side='right')
scroll_x.pack(fill='x', side='bottom')
canvas.pack(fill='both', expand=True, side='left')

parent.bind("<Configure>", resize)

parent.mainloop()
尽管窗口上只有一个画布加上滚动条,但在用户更改与窗口交互之前,resize事件会被调用7次。当窗口确实被调整大小时,我如何停止这种疯狂行为并只调用resize函数?

:

: 小部件更改了大小(或位置,在某些平台上)。新的大小在传递给回调的事件对象的宽度和高度属性中提供

当您运行代码时,它将在窗口中绘制这些小部件,因此窗口的宽度和高度将改变。 您可以使用
if
语句检查
Toplevel
的宽度和高度是否已更改

更改函数
size
并初始化代码中的全局变量:

def resize(event):
    global window_width, window_height
    if event.widget.widgetName == "toplevel":
        if (window_width != event.width) and (window_height != event.height):
            window_width, window_height = event.width,event.height
            print(f"The width of Toplevel is {window_width} and the height of Toplevel is {window_height}")

window_width, window_height = 0, 0

如果使用类(OOP),则可以避免
global
varibale。

本文中的解释可能会有所帮助。
def resize(event):
    global window_width, window_height
    if event.widget.widgetName == "toplevel":
        if (window_width != event.width) and (window_height != event.height):
            window_width, window_height = event.width,event.height
            print(f"The width of Toplevel is {window_width} and the height of Toplevel is {window_height}")

window_width, window_height = 0, 0