2013-08-29 8 views
5

Ich habe ein Programm, das einen langen Prozess ausführt, nachdem Sie auf eine Aktionsschaltfläche klicken. Während der Prozess läuft, sagt das Hauptfenster, dass es nicht antwortet, obwohl ich weiß, dass das Programm im Hintergrund läuft. Dieses Programm wird für einige Leute, mit denen ich arbeite, veröffentlicht und ich möchte sicherstellen, dass sie nicht ausflippen und das Fenster schließen, wenn sie das sehen. Die Lösung, die ich habe, sitzt ein root.update in der Schleife des laufenden Prozesses, aber ich bin mir nicht sicher, dass dies die beste Lösung war.Tkinter Fenster sagt (reagiert nicht) aber Code läuft

die Python 3.3

Hier verwenden ist eine Probe des Codes, so dass Sie eine Vorstellung davon, was ich tue, das von der Hauptschleife aufgerufen wird:

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

Sie sollten den Hintergrundprozess in einem anderen Thread ausführen. Ihr single-threaded Programm kann immer nur eine Sache gleichzeitig tun. Wenn Ihr lang andauernder Prozess ausgeführt wird, kann die Benutzeroberfläche nicht mithalten. – korylprince

Antwort

6

Während Sie root aufrufen .update() in Ihrer Schleife erzeugt dies immer noch (potentiell) unerwünschte Nebenwirkungen.

  1. Das Programm kann verzögert arbeiten, was bedeutet, dass die Benutzereingaben lange dauern.
  2. Sie können nur diese eine Aktion ausführen. Jede andere Aktion muss warten, bis dies abgeschlossen ist.

Als Alternative würde ich vorschlagen, dass Sie einfache Multithreading implementieren. Python multithreading ist ziemlich einfach und wird beide dieser Nachteile verhindern. Sie können Ihren Code mit langer Laufzeit ausführen und gleichzeitig eine saubere und reaktionsfähige Benutzeroberfläche bereitstellen.

Wenn Ihre Anwendung trivial parallelisierbar ist, könnten Sie mehrere Threads verwenden, um die Laufzeit zu verringern. Ex. Thread 1 behandelt Einträge 1-100, während Thread 2 Einträge 101-200 behandelt.

Verwandte Themen