Tkinter - 在控制缩放窗口小部件时暂停窗口大小调整

时间:2016-08-09 10:37:48

标签: python tkinter

问题

我有一个简单的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()

实施例

我稍微向右拖动缩放小部件上的手柄

这会调整图像的大小。窗口,现在光标位置在手柄的左侧

在鼠标的下一次轻微移动中,图像再次变小。

0 个答案:

没有答案