在tkinter中连续调用Configure事件

时间:2013-07-19 13:54:53

标签: events tkinter

我正在尝试编写一个函数来动态调整tkinter窗口中显示的图像。 因此,我将此函数绑定到Configure事件:

connroot.bind( "<Configure>", connresiz)

我的问题是

1)在程序启动时connresiz()函数被调用3次(为什么3?)

2)更麻烦的是,当我拖动鼠标时,动态调整窗口大小会不断调用函数!怎么能避免这个?

我考虑过同时检查<Configure><ButtonRelease-1>事件,但我不知道如何编码

2 个答案:

答案 0 :(得分:1)

根据官方tk文档,<Configure>事件会在其大小,位置或边框宽度发生变化时触发,有时甚至会在堆叠顺序中更改位置时触发。这可能会在启动期间多次发生。

在调整窗口大小时会连续调用它,因为窗口小部件的大小正在变化。这就是它的定义。你不能阻止它被调用,虽然你当然可以修改你在回调中做的事情。例如,您可能会延迟调整图像大小,直到您在一两秒内没有收到另一个<Configure>事件 - 这可能意味着用户已停止交互式调整大小。

答案 1 :(得分:1)

1)我们不知道,因为我们看不到您的代码......

2)简短的回答是:你不能,因为这正是<Configure>事件的作用!很长的答案,你可以,用一个小技巧/黑客。由于窗口随时都在变化,它会将所有绑定的函数调用到<Configure>,随着鼠标按钮的释放(在最后一次<Configure>调用之后),任何时候都会发生同样的事情我们可以创建一个标志/开关这将告诉我们,如果窗口是“已配置”,那么我们可以在任何时候释放鼠标按钮时检查该切换,并在我们运行某些操作后将其切换回默认值。

因此,如果您只想重新调整图像大小,释放鼠标并更改窗口时,这就是您需要的代码:

from tkinter import *

class Run:
    def __init__(self):
        self.root = Tk()
        self.clicked = False
        self.root.bind('<ButtonRelease-1>', self.image_resize)
        self.root.bind('<Configure>', lambda e: self.click(True))
    def image_resize(self, event):
        if self.clicked:
            print("I'm printed after <Configure>.")  # the action goes here!
            self.click(False)
    def click(self, value):
        self.clicked = value

app = Run()
app.root.mainloop()