使用'<configure>'回调的Tkinter递归行为

时间:2017-12-14 01:22:47

标签: python tkinter

我试图让tkinter.Frame有一个全屏图像,下面有一些按钮

WIDTH, HEIGHT = 800, 600

root = Tk()

mainframe = Frame(root, padding="3 3 12 12")
mainframe.pack(fill=BOTH, expand=True)

infovariable = StringVar()
infovariable_label = Label(mainframe, textvariable=infovariable, anchor=S)
infovariable_label.pack(fill=X, side=TOP)

label = Label(mainframe)
label.pack(fill=BOTH, expand=True) 

image_base = Image.open('hello.jpg')

# setting the photo
image = (image_base
         .resize(2500, 1000)
         .crop(0, 0, WIDTH,HEIGHT))

label.configure(image=photo)

当我调整窗口大小时,如果我这样做,我希望我的照片尺寸(宽度/高度)相同:

def onResize(event):
    global WIDTH, HEIGHT
    WIDTH = event.width
    HEIGHT = max(0, event.height - 50)

    # setting the photo
    image = (image_base
             .resize(2500, 1000)
             .crop(0, 0, WIDTH,HEIGHT))

root.bind('<Configure>', onResize)

调整大小,使图像改变大小,然后再次调用调整大小,有一个无限调整大小的窗口。

我和这个帖子有同样的问题:

odd behavior with '<Configure>' callback

1 个答案:

答案 0 :(得分:2)

当您绑定到根窗口时,由于tkinter如何使用绑定标记,该绑定也适用于根窗口的每个子窗口。

解决方案的一部分是将onResize更改为仅在event.widget代表根窗口时更改图像的大小。可能还有其他问题,但这是第一个问题。

您还需要确保考虑边框。如果您使图像的大小与窗口大小相同,但标签有一个像素边框,则会导致标签增长,从而导致根窗口增长,这将重新开始整个过程​​。

与绑定标记相关的另一个答案是:https://stackoverflow.com/a/2538611/271577