2013-08-29 11 views
5

Mam program, który uruchamia długi proces po kliknięciu przycisku akcji. Ponieważ proces jest uruchomiony, okno główne powie, że nie odpowiada, mimo że wiem, że program działa w tle. Ten program zostanie wydany kilku osobom, z którymi pracuję i chcę się upewnić, że nie zwariują i nie zamkną okna, kiedy to zobaczą. Rozwiązaniem, które mam, jest umieszczenie root.update w pętli uruchomionego procesu, ale nie jestem pewien, czy to najlepsza poprawka.Okno Tkintera mówi (nie odpowiada), ale kod jest uruchomiony

Używanie Pythona 3.3

Oto przykład kodu więc zorientować się, co robię, to jest wywoływana z pętli głównej:

def combine(boxes_to, boxes_from, frame): 
     to_value,to_pos = gui.checkBoxes(boxes_to) 
     from_value,from_pos = gui.checkBoxes(boxes_from) 
     frame.destroy() 

     running = Label(root,text="Running please do not close..",font = (16)) 
     running.pack() 
     root.update() 
     map_to = open("map_to",'r') 
     for line in map_to: 
      root.update() 
      process(line) 


     running.destroy() 
     map_to.close() 
     finish = Button(root, text="Done",command=gui.stop) 
     finish.pack() 
+2

Powinieneś uruchomić proces w tle w innym wątku. Twój program z jednym gwintem może wykonać tylko jedną rzecz na raz. Kiedy Twój długotrwały proces działa, interfejs użytkownika nie może nadążyć. – korylprince

Odpowiedz

6

Chociaż można nazwać korzeń .update() w twojej pętli, to wciąż wywoła pewne (potencjalnie) niepożądane efekty uboczne.

  1. Program może działać z opóźnieniem, co oznacza, że ​​reakcja na dane wprowadzone przez użytkownika jest długotrwała.
  2. Będzie można uruchomić tylko jedną akcję. Każda inna akcja musi poczekać, aż to się skończy.

Jako alternatywę sugerowałbym wdrożenie prostego wielowątkowości. Python multithreading jest dość prosty i zapobiegnie obu tym niedogodnościom. Będziesz mógł wykonywać długo działający kod, zapewniając jednocześnie czysty i responsywny interfejs użytkownika.

Jeśli twoja aplikacja jest łatwa do zrównoleglenia, możesz użyć wielu wątków, by skrócić czas pracy. Dawny. Wątek 1 obsługuje wpisy 1-100, podczas gdy wątek 2 obsługuje wpisy 101-200.

Powiązane problemy