19

アクション ボタンをクリックした後に長いプロセスを実行するプログラムがあります。プロセスが実行されているため、プログラムがバックグラウンドで実行されていることを知っていても、ルート ウィンドウは応答していないと表示します。このプログラムは、私が一緒に働いている何人かの人々にリリースされる予定です。彼らがこれを見たときにびっくりしてウィンドウを閉じないようにしたいと思います。私が持っている解決策は、実行中のプロセスのループに root.update を配置することですが、これが最善の修正であったかどうかはわかりません。

Python 3.3 の使用

コードのサンプルを次に示します。これにより、私が何をしているかがわかります。これは、メイン ループから呼び出されます。

def combine(boxes_to, boxes_from, frame):
        to_value,to_pos = gui.checkBoxes(boxes_to)
        from_value,from_pos = gui.checkBoxes(boxes_from)
        frame.destroy()

        running = Label(root,text="Running please do not close..",font = (16))
        running.pack()
        root.update()
        map_to = open("map_to",'r')
        for line in map_to:
            root.update()
            process(line)


        running.destroy()
        map_to.close()
        finish = Button(root, text="Done",command=gui.stop)
        finish.pack()
4

2 に答える 2

14

ループ内で root.update() を呼び出すことはできますが、それでも(潜在的に)望ましくない副作用が発生します。

  1. プログラムの動作が遅くなる場合があります。つまり、ユーザーの入力に応答するのに時間がかかります。
  2. この 1 つのアクションしか実行できません。他のアクションは、これが完了するまで待機する必要があります。

別の方法として、単純なマルチスレッドを実装することをお勧めします。 Python のマルチスレッド化は非常に単純で、これらの欠点の両方を防ぐことができます。クリーンでレスポンシブな UI を提供しながら、長時間実行されるコードを実行できます。

アプリケーションが簡単に並列化できる場合は、複数のスレッドを使用して実行時間を短縮できます。元。スレッド 1 はエントリ 1 ~ 100 を処理し、スレッド 2 はエントリ 101 ~ 200 を処理します。

于 2013-08-29T23:04:03.650 に答える