我是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()
答案 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()