2017-02-23 11 views
0

シンプルなPythonアプリケーションを開発してから、Tkinterを使って簡単なGUIを追加することにしました。Tkinterの凍結を避けるには?

問題は、主な機能がその機能を果たしている間に、ウィンドウがフリーズすることです。

私はそれが共通の問題であることを知っています。私は、多機能(それぞれの機能がGUIを更新するので非常に複雑です)を使用するか、 とにかく私はそのようなばかげたアプリケーションのコードを変更したくありません。

私の質問です:私のTkinterウィンドウを毎秒更新するのは簡単な方法はありませんか?私はKISSルールを適用したいだけです!

は、私が試したが、うまくいきませんでしたその下にあなたの擬似コードの例をあげる:

class Gui: 
     [...]#costructor and other stuff 

     def refresh(self): 
      self.root.update() 
      self.root.after(1000,self.refresh) 

     def start(self): 
      self.refresh() 
      doingALotOfStuff() 

    #outside 
    GUI = Gui(Tk()) 
    GUI.mainloop() 

それは単に一度だけリフレッシュを実行します、と私はその理由を理解することはできません。

ありがとうございました。

+0

あなたのプログラムが 'doingALotOfStuff()'を呼び出している間、毎秒 'self.refresh'を実行するとは期待できません。私はあなたがマルチスレッドを回避するとは思わない。 –

+0

私はそれを得た。そのようなシンプルなソフトウェアをやるのは簡単な解決策ではありません...誰かが私たちにどんなトリックを見せてくれるのでしょうか? – decadenza

答えて

1

Tkinterはmainloopです。これは、基本的にウィンドウを常に更新して、ボタンをクリックするのを待つこと、タイプする単語、コールバックを実行することなどを意味します。mainloopがオンになっている同じスレッドでいくつかのコードを実行すると、mainloopコードのそのセクションが完了するまで。非常に簡単な回避策は、長時間実行されているプロセスを別のスレッドに振り向けることです。これでもTkinterと通信し、GUIを更新することができます(ほとんどの場合)。

import threading 

class Gui: 
    [...]#costructor and other stuff 

    def refresh(self): 
     self.root.update() 
     self.root.after(1000,self.refresh) 

    def start(self): 
     self.refresh() 
     threading.Thread(target=doingALotOfStuff).start() 

#outside 
GUI = Gui(Tk()) 
GUI.mainloop() 

This答えはmainloopにいくつかの詳細になり、どのようにブロックしてコード:

はここで大幅にあなたの擬似コードを変更しない簡単な例です。

Here's別のアプローチでは、独自のスレッドでGUIを起動してから別のコードを実行します。

+0

ありがとう、私はあなたの助けに感謝します。私は、主な問題は、実際には、関数を実行していることによると思います.ALotOfStull()も実際にGUIを更新しています...私はここにスマートな解決策はないと思います。私はマルチスレッドを研究しなければならないし、結局はGUIを避けなければならない... – decadenza

関連する問題