सारांश: मैं "noob oddy's example code" का उपयोग नहीं करता - एक मूलभूत रूप से त्रुटिपूर्ण दृष्टिकोण है।
मैं एक अजगर गुरु नहीं हूं, लेकिन "noob oddy" द्वारा प्रदान किया गया उदाहरण कोड (जो पृष्ठभूमि थ्रेड के भीतर root.event_generate (...) को कॉल करता है) एक "मौलिक रूप से त्रुटिपूर्ण दृष्टिकोण" प्रतीत होता है। यानी, इंटरनेट पर कई लेख हैं जो "जीयूआई थ्रेड" (जो आमतौर पर मुख्य धागा है) के संदर्भ में टिंकर कार्यों/ऑब्जेक्ट विधियों को कभी भी नहीं बुलाते हैं। उनका उदाहरण "अधिकांश समय" काम करता है, लेकिन यदि आप घटना उत्पादन दर में वृद्धि करते हैं, तो उदाहरण की "क्रैश दर" बढ़ेगी - हालांकि, विशिष्ट व्यवहार घटना उत्पादन दर और प्लेटफॉर्म की प्रदर्शन विशेषताओं पर निर्भर है।
उदाहरण के लिए
,, अजगर 2.7.3 के साथ अपने कोड का उपयोग करता है, तो आप बदलना:
time.sleep(1)
रहे हैं:
time.sleep(0.01)
तो स्क्रिप्ट/एप्लिकेशन आम तौर पर की 'एक्स' संख्या के बाद दुर्घटना होगा पुनरावृत्तियों।
अधिक खोज के बाद, यदि आपको "टिंकर का उपयोग करना चाहिए", तो यह पृष्ठभूमि थ्रेड से जीयूआई थ्रेड से जानकारी प्राप्त करने का सबसे अधिक "बुलेट प्रूफ विधि" दिखाई देता है, जो कि मतदान के बाद 'बाद()' विजेट विधि का उपयोग करना है थ्रेड-सुरक्षित ऑब्जेक्ट (जैसे 'कतार')। उदाहरण के लिए,
################################################################################
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 #################################################################
स्रोत
2013-02-11 09:29:40
जाहिर है आप अपने जीयूआई में वर्चुअल इवेंट को फायर करने के लिए पृष्ठभूमि थ्रेड से event_generate का उपयोग कर सकते हैं। शायद यह आपकी कतार की स्थिति के बारे में एक तरह की अधिसूचना के रूप में इस्तेमाल किया जा सकता है। http://groups.google.com/group/comp.lang.python/browse_thread/thread/3476fd30bec12367/853bb6f6dd216960?lnk=gst&q=brunel+%2Bevent_generate#853bb6f6dd216960 –
काम करने लगता है। इसे वास्तविक उत्तर के रूप में जोड़ने के लिए स्वतंत्र महसूस करें। – Debilski