Tkinter跟踪窗口是否要重新调整大小?

问题描述 投票:0回答:1

我正在编写一个小程序,当窗口大小改变时,该程序旨在运行一个调整大小的方法。因此,我使用了toplevel.bind("<Configure>", 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()

输出:

widget .!toplevel
height 200 width 200
widget .!toplevel.!scrollbar
height 286 width 17
widget .!toplevel.!scrollbar2
height 17 width 382
widget .!toplevel.!canvas
height 269 width 382
widget .!toplevel
height 286 width 399
widget .!toplevel
height 286 width 399
widget .!toplevel.!can

事件虽然窗口上只有一块画布以及滚动条,但在用户甚至没有更改要与窗口交互之前,都会调用resize事件7次。当窗口调整大小时,如何停止这种疯狂行为,仅调用调整大小函数?

python events tkinter window-resize
1个回答
0
投票

In effbot DOC

<Configure>:小部件已更改大小(或在某些平台上为位置)。在传递给回调的事件对象的width和height属性中提供了新的大小。

运行代码时,它将在窗口中绘制这些小部件,因此窗口的宽度和高度将发生变化。您可以使用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杂音。

© www.soinside.com 2019 - 2024. All rights reserved.