2013-08-29 21 views
5

Tôi có một chương trình chạy một quy trình dài sau khi bạn nhấp vào nút tác vụ. Khi quá trình đang chạy cửa sổ gốc sẽ nói rằng nó không phản hồi mặc dù tôi biết chương trình đang chạy trong nền. Chương trình này sẽ được phát hành cho một vài người mà tôi làm việc cùng và tôi muốn đảm bảo rằng họ không phải lo lắng và đóng cửa sổ khi họ thấy điều này. Các giải pháp tôi có đang ngồi một root.update trong vòng lặp của quá trình đang chạy nhưng tôi không chắc chắn đây là sửa chữa tốt nhất.Cửa sổ Tkinter nói (không phản hồi) nhưng mã đang chạy

Sử dụng python 3.3

Dưới đây là một mẫu mã để bạn có được một ý tưởng về những gì tôi đang làm, điều này được gọi từ các vòng lặp chính:

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

Bạn nên chạy quá trình nền trong một chuỗi khác. Chương trình đơn luồng của bạn chỉ có thể thực hiện một việc tại một thời điểm. Khi quá trình chạy dài của bạn đang chạy giao diện người dùng không thể theo kịp. – korylprince

Trả lời

6

Trong khi bạn có thể gọi gốc .update() trong vòng lặp của bạn, điều này sẽ vẫn tạo ra một số (có khả năng) tác dụng phụ không mong muốn.

  1. Chương trình có thể hoạt động chậm, có nghĩa là phải mất một thời gian dài để phản hồi ý kiến ​​của người dùng.
  2. Bạn sẽ chỉ có thể chạy một hành động này. Bất kỳ hành động nào khác đều phải chờ điều này kết thúc.

Thay vào đó, tôi khuyên bạn nên triển khai đa luồng đơn giản. Python multithreading khá đơn giản và sẽ ngăn chặn cả hai nhược điểm này. Bạn sẽ có thể thực thi mã chạy dài của mình, trong khi vẫn cung cấp giao diện người dùng sạch và đáp ứng.

Nếu ứng dụng của bạn là song song có thể song song, bạn có thể sử dụng nhiều luồng để giảm thời gian chạy. Ví dụ Chủ đề 1 xử lý các mục 1-100, trong khi luồng 2 xử lý các mục 101-200.

Các vấn đề liên quan