2017-01-08 17 views
1

私はtkinterを使ってPython GUIアプリケーションを構築しています。 基本的には、別のスレッドで開始して統合していますが、通信には入出力キューを使用しています。PythonのTkinter after()関数はCPUをジャンプします

GUI側(tkinterのmainloop()があるメインスレッド)では、mainloopの繰り返しごとに呼び出される関数を追加したいと思います(私はリアルタイムで情報を処理して表示しています)。私はちょうどself.loop_id = self.after(1, self.loop)を呼び出すプログラムを起動するときながら

def loop(self): 
    try: 
     output_type, data = wlbt.output_q.get_nowait() 
     pass # if got something out of the queue, display it! 
    except Queue.Empty: 
     pass 
    self.loop_id = self.after(1, self.loop) 

だから私の機能は、そのようなことを行います。

だから、私を気に二つのこと:

  1. ループ機能は30%-50%でCPU使用率を上げます。私はそれを無効にする場合、それは良いです。
  2. リフレッシュレートを最大限に高めるためにafter_idle()を使用したいと思っていますが、それを置き換えることができませんでした。

私には完全に理解できないことがあります。これらの問題に取り組むためには何ができますか?

答えて

0

self.after(1, self.loop)に電話すると、約1ミリ秒ごとに機能を実行するように求められます。毎秒1000回の関数呼び出しを行っているので、CPU使用率が上がるというのは驚くことではありません。

人間は多くの変化を感じ取れないので、ディスプレイを更新するだけであれば、毎秒20〜30回以上行う必要はありません。

+0

メインループにリソースがあるたびに実行したい場合、どうしたらよいですか? 'after_idle()'でそれを行うべきですか?もしそうなら、どうですか? – galah92

+0

@ galah92:私のアドバイスは、私が書いたものです:あなたの機能を20秒または30秒ごとに呼び出します。人間のディスプレイを更新することを目標としている場合は、それよりも頻繁にチェックを行うことは、計算サイクルを無駄にするだけです。 –

関連する問題