Как обновить объект родительского класса (self.progress) внутри дочернего потока? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь запустить строку состояния выполнения, чтобы сообщить пользователю, что задача выполняется. Я безуспешно пробовал разные стратегии.

В этом коде проблема в том, что я не могу обновить из дочернего потока значение индикатора выполнения. Я что-то делаю не так.

import time
import threading
from tkinter import Tk, Button
from tkinter.ttk import Progressbar

class App():
    def __init__(self, root):
        self.button = Button(root)
        self.button.grid(row=1,column=0, padx=2,pady=2);
        self._resetbutton()
        self.progress = Progressbar(root, length=330, mode = 'determinate') 
        self.progress.grid(  row=2,column=0, columnspan=4,padx=2,pady=2);    

    def _resetbutton(self):
        self.running = False
        self.button.config(text="Start", command=self.startthread)
    def startthread(self):
        self.running = True
        newthread = threading.Thread(target=self.status_bar)
        newthread.start()
        self.button.config(text="Stop", command=self._resetbutton)

        for  x in range(12):
                time.sleep(.75)
                print(".");

    def status_bar( self ): 
        value = 0;
        print("started thread");

        while self.running:           
            value = ( value + 10 ) % 100;    
            #self.progress['value'] = value;   # <-- failure
            
            time.sleep(0.5); 
            print( value );

        print("done thread");

ventana_principal=Tk()
calculadora=App(ventana_principal)
ventana_principal.mainloop()

1 Ответ

0 голосов
/ 07 августа 2020

Здесь вы можете увидеть изменения в функции startthread, чтобы этот индикатор выполнения работал.

def startthread(self):
    def status_bar( ): 
        value = 0;
        print("started thread");

        while self.running:           
            value = ( value + 10 ) % 100;    
            self.progress['value'] = value;   # <-- failure
            
            time.sleep(0.5); 
            print( value );

        print("done thread");


    def aux_func( ): 
        while self.running:           
                time.sleep(.75)
                print(".");
   

    self.running = True
    newthread = threading.Thread(target=status_bar)
    newthread.start()
    newthread2 = threading.Thread(target=aux_func)
    newthread2.start()
    self.button.config(text="Stop", command=self._resetbutton)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...