如何在 tkinter 中使用纵横比调整根窗口大小?

我该怎么办(如果任何用户尝试调整窗口宽度的大小,也会根据纵横比自动调整窗口高度的大小。这意味着用户不能仅调整一个大小。更改一侧的大小也会更改另一侧的大小。 )?

lingfan2 回答:如何在 tkinter 中使用纵横比调整根窗口大小?

(在仔细阅读了您在问题下所做的描述您希望它如何工作的评论后,我再次修改了代码以使其如此。)

您可以通过在绑定到根窗口的事件处理程序中处理 '<Configure>' 事件来实现。这很棘手,因为当您向根窗口添加绑定时,它也会被添加到它包含的 每个 小部件中 — 因此需要能够区分它们和事件处理程序中的根窗口.在下面的代码中,这是通过检查 event.widget.master 属性是否为 None 来完成的,这表明正在配置的小部件是没有根窗口的小部件。

该代码创建根窗口并将根窗口大小调整事件绑定到将保持所需纵横比的事件处理函数。当检测到根窗口的resize事件时,该函数检查新尺寸的纵横比,看它是否具有合适的比例,如果没有,则阻止对该事件的进一步处理,并手动设置窗口的尺寸到一个宽度和高度。

import tkinter as tk
WIDTH,HEIGHT = 400,300  # Defines aspect ratio of window.

def maintain_aspect_ratio(event,aspect_ratio):
    """ Event handler to override root window resize events to maintain the
        specified width to height aspect ratio.
    """
    if event.widget.master:  # Not root window?
        return  # Ignore.

    # <Configure> events contain the widget's new width and height in pixels.
    new_aspect_ratio = event.width / event.height

    # Decide which dimension controls.
    if new_aspect_ratio > aspect_ratio:
        # Use width as the controlling dimension.
        desired_width = event.width
        desired_height = int(event.width / aspect_ratio)
    else:
        # Use height as the controlling dimension.
        desired_height = event.height
        desired_width = int(event.height * aspect_ratio)

    # Override if necessary.
    if event.width != desired_width or event.height != desired_height:
        # Manually give it the proper dimensions.
        event.widget.geometry(f'{desired_width}x{desired_height}')
        return "break"  # Block further processing of this event.

root = tk.Tk()
root.geometry(f'{WIDTH}x{HEIGHT}')
root.bind('<Configure>',lambda event: maintain_aspect_ratio(event,WIDTH/HEIGHT))
root.mainloop()

本文链接:https://www.f2er.com/1399.html

大家都在问