我有一个显示图像的程序。每次用户按下回车键,我都会重新计算图像,这需要一些时间:
root = tk.Tk()
def callback_enter(e):
# Heavy computation
root.bind("<Return>", callback_enter)
root.mainloop()
问题是,当用户多次按下回车键时,即使用户停止按下按钮,也会一次又一次地调用回叫功能,因为程序会记住之前的所有键按下。有没有办法callback_enter()
删除在执行过程中完成的所有按键操作?
答案 0 :(得分:1)
这里的问题是你的程序在忙于图像计算时,不能与缓冲输入的主循环交互。接近它的一种方法是用时间范围标准过滤事件;这是一个实现示例:
import time
import random
import Tkinter as tk
root = tk.Tk()
LAST_CALL_TIME = 0
TIME_THRESHOLD = .1
def performHeavyComputation():
print("performHeavyComputation() START")
time.sleep(1 + random.random())
print("performHavyComputation() END")
def callback_enter(e):
global LAST_CALL_TIME
global TIME_THRESHOLD
t = time.time()
if t - LAST_CALL_TIME < TIME_THRESHOLD:
print("[%.3f] filtering event e:%s"%(t, e))
else:
LAST_CALL_TIME = t
performHeavyComputation()
t1 = time.time()
TIME_THRESHOLD = t1 - t + 0.1
root.bind("<Return>", callback_enter)
root.mainloop()