0

長時間実行するための GUI を作成しようとしていますが、GUI スレッドのロックを回避する方法がわかりません。ttk.Progressbar を使用したいのですが、バーの値を更新できず、ウィンドウに GUI を更新させることができません。更新処理を独自の関数に入れて直接更新しようとしましたが、どちらも機能しませんでした。ハンドラーの値を更新することをお勧めします。このスクリプトは、ダウンロード、処理、アップロードを行うため、3 つの別々のバーが見栄えがよくなります。

from Tkinter import *
import time, ttk

class SampleApp(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.pack()
        self.prog = ttk.Progressbar(self, orient = 'horizontal', length = 200, mode = 'determinate')
        self.prog.pack()
        self.button = Button(self,text='start',command=self.start)
        self.button.pack()

    def start(self):
        self.current = 0
        self.prog["value"] = 0
        self.max = 10
        self.prog["maximum"] = self.max
        self.main_prog()

    def handler(self):
        self.prog['value'] += 1

    def main_prog(self):
        for x in range(10):
            time.sleep(2)
            self.handler()

root = Tk()
app = SampleApp(master = root)
app.mainloop()
4

1 に答える 1

2

ロックアップを引き起こしているのはプログレスバーではなく、あなたの呼び出しtime.sleep()

GUI ツールキットは、イベント ループを使用してユーザー入力を処理します。sleep 呼び出しでイベント処理を中断しています。

イベント ドリブン プログラムで実行時間の長いジョブを処理するには、いくつかの方法があります。

  1. afterルート ウィンドウのメソッドを使用して、ジョブを細かく切り刻み、各小さな断片をタイムアウトで処理します。
  2. 処理は別のスレッドで処理します。このスレッドはtkinter 関数を呼び出さないことに注意してください! また、cpython では、GIL のために一度に 1 つのスレッドしかバイトコードを処理できないことに注意してください。
  3. を使用して別のプロセスで処理を処理しmultiprocessingます。データは、キューを使用してそのプロセスとの間で送受信されます。GUI プログラムはキューから読み取り、タイムアウトで GUI を更新します。
于 2013-09-09T20:58:17.480 に答える