忽略用户的输入

时间:2016-12-11 12:56:56

标签: python-3.x input tkinter callback

我有一个显示图像的程序。每次用户按下回车键,我都会重新计算图像,这需要一些时间:

root = tk.Tk()
def callback_enter(e):
    # Heavy computation

root.bind("<Return>", callback_enter)
root.mainloop()

问题是,当用户多次按下回车键时,即使用户停止按下按钮,也会一次又一次地调用回叫功能,因为程序会记住之前的所有键按下。有没有办法callback_enter()删除在执行过程中完成的所有按键操作?

1 个答案:

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