2016-12-11 16 views
0

イメージを表示するプログラムがあります。ユーザーがEnterキーを押すたびに、私は画像を再計算し、どのように時間がかかる:ユーザーからの入力を無視する

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

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

問題は、ユーザーを押すが複数回入力したときに、コールバック関数は、ユーザが停止した場合であっても、何度も何度も呼び出されます、ですプログラムは以前のすべてのキーの押下を記憶しているので、ボタンを押す。方法はありますか?callback_enter()は実行中に実行されたすべてのキー押下を削除しますか?

答えて

1

ここでの問題は、画像の計算に忙しい一方、入力をバッファリングしているメインループと対話できないということです。それにアプローチする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() 
+0

ありがとうございます!私はPythonにはまったく新しいです。この文脈でグローバルなものは何かを簡単に説明できますか? – Jonas

0

、おそらく私が簡単に、とにかく...手遅れだ: ここにあなたが維持し、持続的な滞在変数を使用するために、グローバル変数を使用する必要がありますプログラム実行中のそれらの値。したがって、それらを関数定義内でグローバルとして宣言して、それらを関数のローカルとして再定義しないようにします。

あなたはこれを見てとることができます: http://www.python-course.eu/python3_global_vs_local_variables.php またはこの: Use of "global" keyword in Python

歓声が。

関連する問題