【问题标题】:Tkinter recursive behavior with '<Configure>' callback带有“<Configure>”回调的 Tkinter 递归行为
【发布时间】:2017-12-14 01:22:47
【问题描述】:

我尝试让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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

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

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

    另一个与绑定标签相关的答案在这里:https://stackoverflow.com/a/2472992/7432

    【讨论】:

    • 我不想计算 gui 的边框和层次结构(对每个孩子应用边框和填充)。有没有办法获得一个全宽小部件,该小部件自动具有容器宽度的图像?
    • 绑定的层次结构也是您有时在事件处理程序中看到return "break" 的原因。 “break”字符串脱离绑定层次结构。
    • @RobertVandenEynde:没有。 Tkinter 图像不能那样工作。您必须做您正在做的事情 - 检测小部件大小的变化,计算正确的大小,然后强制调整图像大小。
    • 原来我使用了一个画布,它只绘制一个图像而不是一个标签。它具有我想要的属性(在窗口调整大小时调整大小)。但我仍然想知道是否有一个 css "max-width: 100%" 等价物。
    • @RobertVandenEynde:不,图像没有等效的“最大宽度”。小部件,是的,图像,没有。
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多