在tkinter中连续调用Configure事件(跟进)

时间:2018-02-22 23:36:56

标签: python tkinter event-handling window-resize

我是Python / Tkinter的新手,我真的被困在这里......我正在尝试设计一个相当灵敏的GUI,在其中一个框架中,我需要显示一个可能不适合所有小部件的垂直小部件列表同时。如果用户调整窗口大小,我想计算适合新大小的项目数量,最后重新绘制“可见”列表。我正在使用root.bind('<Configure>', do_something)来触发重绘。

问题:绑定到<configure>事件会为每个单独的调整大小操作多次触发命令。我希望能够确定何时完成调整大小(并释放鼠标按钮),并重新绘制一次。

我已经阅读了这个previously posted question的答案(非常相关且与我的情况基本相同),但第一个答案没有提供任何代码,我真诚地想不出如何遵循建议,而第二个答案给出了代码,但它没有解决问题。对第二个答案的评论之一已经暗示它可能不起作用,因为ButtonRelease-1事件不在窗口内(因为它是一个调整大小)。事实上,在我的操作系统上不起作用(Win10)。

有人可以为我提供解决方案或解决方法来帮助我吗?如果可能的话,我希望该解决方案适用于Windows和Linux / Debian系统。您可以在下面看到我的代码如何。

非常感谢您的帮助。

import tkinter as tk

class MyListOfStuff(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.redraw()

def redraw(self):
    # (re)populate the frame with as many widgets as possible

class MyApp(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.pack(fill=tk.BOTH, expand=1)
        self.child_frame = MyListOfStuff(self)
        self.bind('<Configure>', self.resize_detected)

def resize_detected(self, *args):
    self.child_frame.redraw()
    # HERE LIES THE PROBLEM... 
    # This method gets called multiple times per second during the resizing 
    # of the main window, and the user experience is very bad because the 
    # resize action is not smooth and fluid. I'd like to call it only AFTER 
    # the resize has been completed (and quite possibly after the mouse 
    # button has been released).

def main():
    root = tk.Tk()
    my_app = MyApp(root)
    my_app.mainloop()

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

您是否在accepted answer中尝试了该建议?

绑定回调可以使用time.time()来存储当前通话的时间,如果在两秒钟内再次调用,则不要采取行动。

import time

def your_class:
    def __init__(self, ...):
        self.last_callback_time = time.time()
        # ... other init
# More stuff in your class
# ...
    def configure_callback(self, event):
        cur_time = time.time()
        if (cur_time - self.last_callback_time) > 2:
             # Do intended stuff
        self.last_callback_time = time.time()