2015-11-17 2 views
4

У меня есть простой TK gui и длительный процесс в мастере настройки на кнопку, и я хочу, чтобы индикатор выполнения пошел, кликнув по кнопке и начал def traitement. Я сделал простое приложение с той же проблемой. Я хочу, чтобы индикатор выполнения пошел на клик по кнопке traitingment, точно так же, как он начал долгую проку с множеством кодов кодаtk gui с индикатором выполнения

как я могу это сделать? вот код:

я попробовать многие вещи, но я не нашел, как ...

from tkinter import Button, Tk, HORIZONTAL 

from tkinter.ttk import Progressbar 
import time 


class MonApp(Tk): 
    def __init__(self): 
     super().__init__() 


     bt1 = Button(self, text='Traitement', command=self.traitement) 
     bt1.grid() 
     self.progress = Progressbar(self, orient=HORIZONTAL,length=100, mode='indeterminate') 
     self.progress.grid() 
     self.progress.grid_forget() 


    def traitement(self): 
     self.progress.grid() 
     self.progress.start() 
     time.sleep(15) 
     ## Just like you have many, many code lines... 

     self.progress.stop() 

if __name__ == '__main__': 

    app = MonApp() 
    app.mainloop() 

Как я положил индикатор в этом приложении?

+0

'ttk' включает' класс ttk.Progressbar' –

+1

рабочий пример с прогрессбар http://stackoverflow.com/a/24770800/1832058 – furas

ответ

8

Вы можете найти ttk.Progressbar на tkdocs

from tkinter import * 
from tkinter.ttk import * 

tk=Tk() 
progress=Progressbar(tk,orient=HORIZONTAL,length=100,mode='determinate') 

def bar(): 
    import time 
    progress['value']=20 
    tk.update_idletasks() 
    time.sleep(1) 
    progress['value']=50 
    tk.update_idletasks() 
    time.sleep(1) 
    progress['value']=80 
    tk.update_idletasks() 
    time.sleep(1) 
    progress['value']=100 

progress.pack() 
Button(tk,text='foo',command=bar).pack() 
mainloop() 

Это лучше использовать threading и запустить свой код в другом потоке.

Как это:

from tkinter import Button, Tk, HORIZONTAL 

from tkinter.ttk import Progressbar 
import time 
import threading 

class MonApp(Tk): 
    def __init__(self): 
     super().__init__() 


     self.btn = Button(self, text='Traitement', command=self.traitement) 
     self.btn.grid(row=0,column=0) 
     self.progress = Progressbar(self, orient=HORIZONTAL,length=100, mode='indeterminate') 


    def traitement(self): 
     def real_traitement(): 
      self.progress.grid(row=1,column=0) 
      self.progress.start() 
      time.sleep(5) 
      self.progress.stop() 
      self.progress.grid_forget() 

      self.btn['state']='normal' 

     self.btn['state']='disabled' 
     threading.Thread(target=real_traitement).start() 

if __name__ == '__main__': 

    app = MonApp() 
    app.mainloop() 
+0

спасибо за ответ. Я не хочу показывать полосу progress перед тем, как пользователь нажимает кнопку EXE ... Я не понимаю, как показать прогресс, когда вы находитесь, -> def sous_ens ... Я попытался поставить индикатор выполнения в коде fonction sous_ens, он появляется только после того, как я вышел из fonction ... – j666

+0

Просто 'pack' (или' grid') экземпляр индикатора выполнения, когда вы хотите его показать, и используйте 'pack_forget' (или 'grid_forget'), чтобы скрыть это. – xmcp

+0

Большое спасибо. Положите, я не поймаю, как ... я ставлю какой-то простой код ... Как я могу поместить индикатор выполнения, я запустил fatection traitingment ... – j666

Смежные вопросы