2016-07-15 41 views
1

私はTkinterとしばらくの間戦っており、これを参照するためのリソースをほとんど使い果たしました。私はここにいくつかの似たようなトピックを見つけましたが、誰も私が必要な場所に私を連れて来ません。Python Tkinterは、応答のないGUIを避けるために別のスレッドでサブプロセスを実行します

私は、CLIからサブプロセスを使ってアプリケーションをサイレントインストールする長い実行時間(実際には10-12秒しかかかりません)のpythonスクリプトを持っています。サブプロセスが正常に動作し、アプリケーションを正常にインストールしましたが、実行後にGUIがロック(つまりハング/フリーズ)します(プログラムは後続のコードを実行しません)。私はここでスレッドを使用する必要があることを知っていますが、私はすでに無駄にそれを使用してみました。

学習プロセスの一環として、私はGithubからレポをクローンし、Windows上で実行するように修正し(MACプラットフォームでのみ実行されるため)、これを拡張する予定です。これが私が突っ込んだ部分です。これは初めてのTKinterの使用です。愚かなことを逃した場合や正しい方法で質問しなかった場合はお詫びします。あなたが私を助け、援助のために事前に感謝したいと思います。

コードはlinkにあります。

答えて

0

あなたはコマンドハンドラ

def on_install_thread(): 
    ... 
    loop_thread = threading.Thread(target=on_install_button_active, 
            args=['button', 'model', itemSelectCount]) 

とスレッドon_install_button_activeのターゲットとボタン

installButton = Button(bottomFrame, text=installButtonTxt, 
         command=on_install_thread, width=9) 

を定義しています。

その後

def on_install_button_active(button, model, selectcount): 
    ... 
    # Reset install status 
    installStatus = 'complete' 
    # Remove Cancel Button 
    cancelButton.destroy() 
    # Activate Install/Done button and menus 
    installButton.configure(state=NORMAL) 
    # menuControl('normal') 
    refreshGui(mainWindow) 

ウィジェットTkinterを必要とするon_install_button_activeの末尾にコードがあるように見えます。他のスレッドからtkinterメソッドを呼び出すことは信頼できないようです。たとえば、1です。

Tkinterのウィジェットを伴うそのスレッド内の他のコールがある場合、それらを削除する方が良いかもしれません仮想イベント

def renderMainWindow(): 
    ... 
    mainWindow.bind('<<InstallComplete>>', on_install_complete) 

def on_install_complete(): 
    cancelButton.destroy() 
    installButton.configure(state=NORMAL) 

def on_install_button_active(button, model, selectcount): 
    ... 
    # Reset install status 
    installStatus = 'complete' 

    mainWindow.event_generate('<<InstallComplete>>', when='tail') 

を定義することが可能です。

+0

こんにちはJ.J。、ありがとう、私は家に帰ったときにこのアプローチを試みます。 しかし、私が提供したコードはMACプラットフォームから作業していましたが、これはまだ試してみる価値があります。サブプロセス機能はどうですか?実行には10〜15秒かかりますが(正しく動作しましたが)、GUIが凍結するような何かがあると思いますか? – Maynard

+0

こんにちはJ.J.非常にありがとうございました。私は、この方法を使用してキャンセルボタンとインストールボタンを正常に更新でき、GUIはハングしません。エラーが発生したので、イベント・パラメータをon_install_complete(event)に追加しました。 Tkinterウィジェットを含む他の呼び出しを削除し、別の仮想イベントを作成しましたが、何らかの理由で機能しません(GUIがフリーズする)。ここに私が追加した[コード](http://pastebin.com/u28UqLHg)があります。私はこれについての回避策を得ることはできません、あなたの援助をもう一度期待し、前もって感謝します。 – Maynard

+0

@マナーナード完全なコードを見ることなく何が間違っているのかを推測するのはかなり難しいです。 –

0

mtTkinterを使用して、このpostを参照することで、私のGUIの問題を解決できました。

関連する問題