【问题标题】:Continuous calls of the <Configure> event in tkinter在 tkinter 中连续调用 <Configure> 事件
【发布时间】:2013-07-19 13:54:53
【问题描述】:

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

connroot.bind( "&lt;Configure&gt;", connresiz)

我的问题是:

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

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

我考虑过检查&lt;Configure&gt;&lt;ButtonRelease-1&gt; 事件的同时存在,但我不知道如何编写代码。

【问题讨论】:

    标签: events tkinter


    【解决方案1】:

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

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

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

    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()
    

    【讨论】:

    • 如果通过窗口边框调整窗口大小,您可能不会总是(或永远)得到&lt;ButtonRelease-1&gt; 事件。那是因为按钮按下起源于 tkinter 窗口之外。我认为这在某种程度上取决于平台和窗口管理器。
    • 哦,我不知道,因为我在 OS X 上,它按预期工作。无论如何,可以添加一个调整大小观察器:获取窗口的宽度高度,存储它, 并且可以添加一个 after 回调来观察变化——这可以代替鼠标释放。但这是一个可怕的黑客:P
    【解决方案2】:

    根据官方 tk 文档,&lt;Configure&gt; 事件“在其大小、位置或边框宽度发生变化时触发,有时在堆叠顺序中的位置发生变化时”。这可能在启动期间发生多次。

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

    【讨论】:

    • 布莱恩,彼得,感谢您的帮助。我遵循了 Bryan 的建议,因为我需要该程序在不同的平台上工作。通过检查窗口大小的变化、一个“_after”命令和一个防止多个 after 调用的标志,它起作用了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多