TÓM TẮT: Tôi sẽ không sử dụng "noob oddy's example code" - là một cách tiếp cận cơ bản không hoàn thiện.
Tôi không phải là guru trăn, nhưng mã ví dụ được cung cấp bởi "noob oddy" (gọi là root.event_generate (...) trong chuỗi nền) dường như là "phương pháp cơ bản không hoàn thiện". tức là, có một số bài viết trên internet có trạng thái "không bao giờ gọi các hàm Tkinter/các phương thức đối tượng bên ngoài ngữ cảnh của 'GUI thread'" (thường là luồng chính). Ví dụ của ông hoạt động "hầu hết thời gian", nhưng nếu bạn tăng tỷ lệ tạo sự kiện, thì "tỷ lệ lỗi" của ví dụ sẽ tăng - tuy nhiên, hành vi cụ thể phụ thuộc vào tốc độ tạo sự kiện và đặc điểm hiệu suất của nền tảng.
Ví dụ, sử dụng mã của mình với Python 2.7.3, nếu bạn thay đổi:
time.sleep(1)
tới:
time.sleep(0.01)
sau đó kịch bản/app thường sẽ sụp đổ sau khi 'x' số lặp lại. Sau khi tìm kiếm nhiều, nếu bạn "phải sử dụng Tkinter", thì nó xuất hiện "phương pháp chống đạn" nhất để nhận thông tin từ một chuỗi nền tới luồng GUI là sử dụng phương thức widget 'after()' để thăm dò ý kiến đối tượng an toàn chủ đề (chẳng hạn như 'Hàng đợi'). ví dụ:
################################################################################
import threading
import time
import Queue
import Tkinter as Tk
import Tkconstants as TkConst
from ScrolledText import ScrolledText
from tkFont import Font
global top
global dataQ
global scrText
def thread_proc():
x = -1
dataQ.put(x)
x = 0
for i in xrange(5):
for j in xrange(20):
dataQ.put(x)
time.sleep(0.1)
x += 1
time.sleep(0.5)
dataQ.put(x)
def on_after_elapsed():
while True:
try:
v = dataQ.get(timeout=0.1)
except:
break
scrText.insert(TkConst.END, "value=%d\n" % v)
scrText.see(TkConst.END)
scrText.update()
top.after(100, on_after_elapsed)
top = Tk.Tk()
dataQ = Queue.Queue(maxsize=0)
f = Font(family='Courier New', size=12)
scrText = ScrolledText(master=top, height=20, width=120, font=f)
scrText.pack(fill=TkConst.BOTH, side=TkConst.LEFT, padx=15, pady=15, expand=True)
th = threading.Thread(target=thread_proc)
th.start()
top.after(100, on_after_elapsed)
top.mainloop()
th.join()
## end of file #################################################################
Nguồn
2013-02-11 09:29:40
Dường như bạn có thể sử dụng event_generate từ chuỗi nền để kích hoạt sự kiện ảo trong GUI của mình. Có thể điều này có thể được sử dụng như một loại thông báo về trạng thái hàng đợi của bạn. http://groups.google.com/group/comp.lang.python/browse_thread/thread/3476fd30bec12367/853bb6f6dd216960?lnk=gst&q=brunel+%2Bevent_generate#853bb6f6dd216960 –
Dường như đang hoạt động. Cảm thấy tự do để thêm nó như là một câu trả lời thực sự. – Debilski