Как заставить работать прогрессбар, зависает окно - PullRequest
0 голосов
/ 19 февраля 2020

Я попытался сделать индикатор выполнения, но вместо того, чтобы работать, он зависает в окне tkinter, я также попытался закрыть его, но он заморозил окно

from tkinter import *
from tkinter.ttk import *
import time

root = Tk()


pbar = Progressbar(root, orient = HORIZONTAL,
                       length = 100, mode = 'determinate')


def bar():
    pbar['value'] = 20
    time.sleep(0.5)

    pbar['value'] = 40
    time.sleep(0.5)

    pbar['value'] = 60
    time.sleep(0.5)

    pbar['value'] = 80
    time.sleep(0.5)

    pbar['value'] = 100

pbar.pack()

Button(root, text = 'Start Bar', command = bar).pack()

root.mainloop()

Как заставить его работать!

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Хотя ответ, кажется, работает, он блокирует ваш GUI в течение 0,5 секунд time.sleep интервалов.

Более простой способ - использовать root.after:

...

def bar():
    pbar['value']+=20
    if pbar["value"]!=100:
        root.after(500, bar)

pbar.pack()

...
0 голосов
/ 20 февраля 2020

Правильный подход заключается в использовании root.after, при этом гарантируется, что несколько нажатий кнопок сбрасываются, когда индикатор выполнения активен:

Здесь мы используем аргумент ключевого слова со значением по умолчанию, чтобы определить, является ли звонок исходил от кнопки или от обратного вызова. Мы также храним идентификатор обратного вызова в замыкании, которое реализуется через изменяемый аргумент ключевого слова value по умолчанию; это позволяет нам полностью отменить дальнейшие обратные вызовы, когда работа будет завершена.

import tkinter as tk
import tkinter.ttk as ttk


def bar(btn=True, status=[None]):
    """activates and updates the progress bar status
    while making sure that multiple button presses only 
    start it once.
    """

    if btn and status[0] is not None:
        return 'break'
    elif pbar['value'] < 100:
        pbar['value'], status[0] = pbar['value'] + 1, root.after(10, bar, False)
    else:
        root.after_cancel(status[0])
        pbar['value'], status[0] = 0, None


root = tk.Tk()
pbar = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=100, mode='determinate') 
pbar.pack()
tk.Button(root, text='Start Bar', command=bar).pack()
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...