Проблема с темой индикатора выполнения - PullRequest
0 голосов
/ 02 мая 2019

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

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

В приведенной ниже функции Main я инициализировал индикатор выполнения в другом потоке, но хочу обновить текущее значение задачи в функции Start.

Из-за этой строки:

progressbar.Start()

он просто постоянно работает без какого-либо отношения к текущему прогрессу.

def Start():
    x = 0
    progressbar["value"] = x
    for idx, val in enumerate(rows):
      region_url = val[1]

      if (model_url != '-'):
        url = 'http://testurl/' + region_url 

        x = x + 1
        if (x > 4):
            break

# Main          
if __name__ == '__main__': 
    window = Tk()
    new = progress(window)

    # Add a grid
    mainframe = Frame(window)
    mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
    mainframe.columnconfigure(0, weight = 1)
    mainframe.rowconfigure(0, weight = 1)
    mainframe.pack(pady = 100 , padx = 150)

    # DropDown
    popupMenu = OptionMenu(mainframe, tkvar, *regionList)
    Label(mainframe, text="Region").grid(row = 1, column = 0)

    # Button
    btnSubmit = Button(mainframe, text= "Execute",command=StartScrap).grid(row = 2, column = 18)
    popupMenu.grid(row = 2, column =0)

    # Progress Bar
    progressbar = ttk.Progressbar(window, orient = HORIZONTAL,length=300, mode = 'indeterminate')
    progressbar.pack()
    t = threading.Thread()
    progressbar["maximum"] = 4
    progressbar.start()
    window.mainloop()

1 Ответ

1 голос
/ 02 мая 2019

В вашем коде есть пара вещей, которые нужно исправить.

Сначала вы определили функцию Start, которая контролирует, как обновляется ваш индикатор выполнения, но вы никогда не вызываете ее.

Во-вторых, вы определяете режим индикатора выполнения как indeterminate и это просто start индикатор выполнения - он работает, но он просто периодически перемещает индикатор выполнения.

В-третьих, вы определили потокt но никогда не ставьте целевую функцию.

Вот как переместить ваш индикатор в потоке:

from tkinter import *
from tkinter import ttk
import threading
import time

def Start():
    def update_pbar():
        for i in range(5): #replace this with your method to update your progressbar
            time.sleep(1)
            progressbar["value"] = i
    t = threading.Thread(target=update_pbar)
    t.start()

# Main
if __name__ == '__main__':
    window = Tk()

    progressbar = ttk.Progressbar(window, orient = HORIZONTAL,length=300, mode = 'determinate')
    progressbar.pack()
    progressbar["maximum"] = 4
    btnSubmit = Button(window, text="Execute", command=Start).pack()
    window.mainloop()
...