我一直在try 创建一个带有滑块和按钮的图形用户界面,输出图像位于右侧(而不是背景图像).要求仅图像根据窗口大小动态改变大小.

在我的try 中,只有在水平而不是垂直调整大小时,窗口才能正确地显示调整大小的图像.当窗口在垂直调整大小后被更新时,它将不正确地zoom 图像,导致图像的一部分被切断.

我并不希望保持像这样的窗口/屏幕比率: -Dynamically resize images in Tkinter

我使用的信息来自:

和来自Codemy的YouTube视频,比如How To Resize A Window Dynamically - Python Tkinter GUI Tutorial #80

要获取此代码,请执行以下操作:

import tkinter as tk
from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import ImageTk, Image


def show_values():
    print(slider1.get())


window = tk.Tk()

filename = askopenfilename()  # show an "Open" dialog box and return the path to the selected file

image = ImageTk.PhotoImage(Image.open(filename))
imageWidth = image.width()
imageHeight = image.height()

canvas = Canvas(window, width=imageWidth, height=imageHeight)
canvas.pack(fill=BOTH, expand=True, side=RIGHT)
canvas.create_image(0, 0, image=image, anchor='nw')

slider1 = Scale(window, from_=0, to=42, orient='vertical')
slider1.pack(side=LEFT)


def resizer(e):
    global image1, resized_image, new_image
    image1 = Image.open(filename)
    resized_image = image1.resize((e.width, e.height), Image.Resampling.LANCZOS)
    new_image = ImageTk.PhotoImage(resized_image)
    canvas.create_image(0, 0, image=new_image, anchor='nw')


window.bind('<Configure>', resizer)

Button(window, text='Process Image', command=show_values).pack(side=BOTTOM)

window.mainloop()

我也try 过使用加权网格和NSEW(N+S+E+W)方法,但没有成功.

推荐答案

当您绑定到根窗口时,该绑定将应用于所有小部件.这是因为绑定被应用于绑定tags,并且根窗口的标签被添加到每个窗口小部件的绑定标签列表.

因此,每次更改窗口大小时,根窗口和画布窗口分别调用resizer一次和一次.这意味着e.widthe.height将是不同的,因为它有时指窗口的宽度,有时指画布的宽度.

简单的解决方案是仅绑定到画布的<Configure>事件.如果您将画布正确配置为在调整窗口大小时调整大小,那么这一切都会很好地工作.

此外,您不应该在画布上创建新的图像对象.你只是把一个图像叠加在另一个图像之上.你的程序最终会因为图像太多而崩溃.

相反,您可以重新配置现有的图像对象以使用新的小部件.

...
image_id = canvas.create_image(0, 0, image=image, anchor='nw')
...
def resizer(e):
    global image1, resized_image, new_image
    image1 = Image.open(filename)
    resized_image = image1.resize((e.width, e.height), Image.Resampling.LANCZOS)
    new_image = ImageTk.PhotoImage(resized_image)
    canvas.itemconfigure(image_id, image=new_image)

canvas.bind('<Configure>', resizer)
...

Python相关问答推荐

处理(潜在)不断增长的任务队列的并行/并行方法

未删除映射表的行

Pandas 都是(),但有一个门槛

Polars:用氨纶的其他部分替换氨纶的部分

无法使用requests或Selenium抓取一个href链接

我如何根据前一个连续数字改变一串数字?

使用NeuralProphet绘制置信区间时出错

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

如何在TensorFlow中分类多个类

python sklearn ValueError:使用序列设置数组元素

Numpyro AR(1)均值切换模型抽样不一致性

Python pint将1/华氏度转换为1/摄氏度°°

使用嵌套对象字段的Qdrant过滤

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

极柱内丢失类型信息""

利用SCIPY沿第一轴对数组进行内插

在聚合中使用python-polars时如何计算模式

排除NRRD文件中的多切片卷加载问题

在FastAPI/Starlette中使用WebSockets时如何运行后台任务?

如何在包含时间戳的词典列表中找到每天的第一个时间?