2016-09-28 22 views
0

TKinterでボタンが押されたときに実行されるメソッドがあります。このメソッドは、外部アプリケーション(Excel、Powerpointなど)を開きます。私のプログラムを開くにはもう少し時間がかかり、読み込みダイアログが必要です。GUIをフリーズせずにTKinterからメソッドを実行するにはどうすればよいですか?

私はちょっとしたカスタムを開こうとしていますtk.toplevelダイアログが表示され、外部アプリケーションがロードされている間にtakefocusが表示されます。

しかし、TKinterがアプリケーションを開くためのメソッドを実行すると、アプリケーションが最後に開くと、すべてのものがフリーズし、読み込みダイアログが表示されます。

同時にアプリケーションをバックグラウンドで開くと同時に読み込みダイアログを表示する方法はありますか?

答えて

1

同時にはありません。代わりに最初にダイアログを開いてから、他のアプリケーションを開くメソッドを呼び出します。 GUIをフリーズするメソッドの前にupdate_idletasksを呼び出すことによって、ダイアログの描画を強制する必要があります。そうしないと、プログラムがアイドル状態になり、それが遅くなるまでダイアログは描画されません。

この例では、time.sleepを使用して、アプリケーションをビジー状態に保ち、GUIをフリーズするタスクをシミュレートしました。

import time 
import tkinter as tk 


class App(): 
    def __init__(self): 
     self._root = tk.Tk() 
     b = tk.Button(self._root, text='Click me', command=self.onclick) 
     b.pack() 

    def run(self): 
     self._root.mainloop() 

    def onclick(self): 
     dialog = tk.Toplevel(self._root) 
     tk.Label(dialog, text='Loading...').pack() 
     dialog.update_idletasks() 
     self.this_takes_a_long_time() 
     dialog.destroy() 

    def this_takes_a_long_time(self): 
     time.sleep(5) 


App().run() 
+0

私はこれを試しましたが、アプリケーションが開いた後も読み込みダイアログが表示されます。おそらく両方のメソッドが 'try:'ステートメントの下にあるからでしょうか?わからない。 – RBuntu

+0

'try:open_external_application()'ステートメントの外側で呼び出された 'tk.toplevel'で再試行されます。まだ動作しません。 – RBuntu

+0

@RBuntu GUIの再描画を強制する必要があります(この例を参照)。 – Goyo

関連する問題