我有一个简单的tkinter GUI应用程序,我在标签小部件中显示图像并使用水平缩放小部件来缩放图像。 但是,每当我增加图像大小时,窗口会调整大小(根据需要),这会更改缩放小部件的位置。缩放小部件向右移动,这意味着鼠标相对于缩放小部件保留。 图像在大小之间闪烁。
我知道我可以使用事件绑定来仅对鼠标释放事件做出反应(如TkInter, slider: how to trigger the event only when the iteraction is complete?中所述),但这会给用户提供较少的反馈。
一种解决方案是仅增加窗口大小但不会自动降低窗口大小。这可能吗?
另一个解决方案是在按下鼠标时暂停窗口大小调整/固定当前几何体的窗口大小,并且只有在释放鼠标时才允许自动重新缩放。我怎么做到这一点?
此问题是否有其他解决方案。
from PIL import Image, ImageTk
import tkinter as tk
from tkFileDialog import askopenfilename
class Window(object):
def __init__(self):
self.root = tk.Tk()
filename = askopenfilename(
parent=self.root,
title='Please choose the image',
filetypes = [("Image Files", ("*.jpg", "*.png", "*.bmp")),
("All", "*")]
)
self.imgPIL = Image.open(filename)
self.imgTk = ImageTk.PhotoImage(self.imgPIL)
self.imgDisplay = tk.Label(self.root, image = self.imgTk)
self.imgDisplay.grid(row=2, column=0, columnspan=2)
tk.Label(
self.root,
text="Zoom:"
).grid(row = 0, column = 0, sticky = "E")
tk.Scale(
self.root, from_=1, to_=15,
orient=tk.HORIZONTAL,
command = self.resize
).grid(row = 0, column = 1, sticky = "W")
def resize(self, zoom):
newsize = (self.imgPIL.size[0]*int(zoom),
self.imgPIL.size[1]*int(zoom))
scaledImg = self.imgPIL.resize(newsize, Image.NEAREST)
self.imgTk = ImageTk.PhotoImage(scaledImg)
self.imgDisplay.configure(image = self.imgTk)
def show(self):
self.root.mainloop()
if __name__ == "__main__":
window = Window()
window.show()