4

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

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

我的问题是:

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

  2. 更麻烦的是,在我拖动鼠标时,动态调整窗口大小会不断调用该函数!如何避免这种情况?

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

4

2 回答 2

4

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()
于 2013-07-19T15:42:52.400 回答
2

根据官方 tk 文档,<Configure>事件“只要它的大小、位置或边框宽度发生变化,有时当它在堆叠顺序中的位置发生变化时”就会触发。这可能在启动期间发生多次。

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

于 2013-07-19T15:26:45.663 回答