Функция остановки не работает при использовании индикатора выполнения - PullRequest
0 голосов
/ 14 июля 2020

Я пишу программу на tkinter, используя Progressbar. Но есть проблема, когда я добавил функцию остановки, она не работает. Когда я нажимаю кнопку «стоп», ничего не происходит, она должна прекратить загрузку индикатора выполнения. Я использую Python версии 3.8. Код ниже:

from tkinter import *
from tkinter import ttk
import time
root = Tk()
def run():
    pb['maximum']=100
    for i in range(101):
        time.sleep(0.05)
        pb['value']=i
        pb.update()
def stop():
    pb.stop()
runbutt = Button(root,text="Runprogr",command=run)
runbutt.pack()
stopbutt = Button(root,text="Stopbut",command=stop)
stopbutt.pack()
pb = ttk.Progressbar(root,length=300,orient="horizontal")
pb.pack()
root.geometry("300x300")
root.mainloop()   

1 Ответ

1 голос
/ 14 июля 2020

Причина в том, что pb.stop не смог остановить функцию в run. Он также будет увеличиваться сам по себе.

Вы можете использовать .after(ms, callback) для добавления значения (тогда вам больше не нужно использовать time.sleep()).

Если вы хотите остановить его, используйте .after_cancel():

from tkinter import *
from tkinter import ttk
import time

root = Tk()
root.add_value = None

def run():
    def add():
        if pb['value'] >= 100:
            return
        pb['value'] += 1
        root.add_value = root.after(50, add)
    if root.add_value: # to prevent increasing the speed when user pressed "Runprogr" many times.
        return

    root.add_value = root.after(50, add)


def stop():
    if not root.add_value: # to prevent raising Exception when user pressed "Stopbut" button many times.
        return
    root.after_cancel(root.add_value)
    root.add_value = None


runbutt = Button(root, text="Runprogr", command=run)
runbutt.pack()
stopbutt = Button(root, text="Stopbut", command=stop)
stopbutt.pack()
pb = ttk.Progressbar(root, length=300, orient="horizontal")
pb.pack()
root.geometry("300x300")
root.mainloop()
...