我正在尝试编写一个函数来动态调整tkinter窗口中显示的图像。 因此,我将此函数绑定到Configure事件:
connroot.bind( "<Configure>", connresiz)
我的问题是
1)在程序启动时connresiz()函数被调用3次(为什么3?)
2)更麻烦的是,当我拖动鼠标时,动态调整窗口大小会不断调用函数!怎么能避免这个?我考虑过同时检查<Configure>
和<ButtonRelease-1>
事件,但我不知道如何编码
答案 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()