2010-08-25 10 views
7

बनाते समय थ्रेड किए गए टिंकर स्क्रिप्ट क्रैश होते हैं मेरे पास एक पायथन स्क्रिप्ट है जो जीयूआई के लिए टिंकर का उपयोग करती है। मेरी छोटी लिपि प्रत्येक एक्स सेकंड में एक टोपवेल विजेट बनाना चाहिए। जब मैं अपना कोड चलाता हूं, तो पहला टोपवेल विजेट सफलतापूर्वक बनाया जाता है, लेकिन जब यह दूसरा बनाता है तो प्रोग्राम क्रैश हो जाता है।दूसरे टोपवेल विजेट

मैं जो कर रहा हूं वह कार्य शुरू करने के लिए बाद की विधि का उपयोग कर रहा है, रूट के मेनलोप के साथ हर 5 सेकंड काउंट करना। हर बार जब इस समारोह को बुलाया जाता है, तो मैं एक सूची में एक टोपवेल विजेट ऑब्जेक्ट जोड़ता हूं और एक नया धागा शुरू करता हूं जो आशा करता है कि नया मेनलोप चल रहा है।

यदि कोई इस समस्या को समझ सकता है तो मैं बहुत आभारी रहूंगा। वैसे, यह एक छोटी सी लिपि है जिसे मैं वर्तमान में अपनी समस्या का समाधान करने के लिए उपयोग कर रहा हूं, जो मुझे अपने असली स्कूल प्रोजेक्ट के साथ जाने से रोक रहा है।

कोड:

import threading,thread 
from Tkinter import * 


def startCounting(): 
    global root 
    global topLevelList 
    global classInstance 

    topLevelList.append (Toplevel()) 
    topLevelList[len(topLevelList)-1].title("Child") 
    classInstance.append(mainLoopThread(topLevelList[len(topLevelList)-1])) 

    root.after(5000,startCounting) 


class mainLoopThread(threading.Thread): 
    def __init__(self,toplevelW): 
     self.toplevelW = toplevelW 
     threading.Thread.__init__(self) 
     self.start() 
    def run(self): 
     self.toplevelW.mainloop() 



global classInstance 
classInstance = [] 
global topLevelList 
topLevelList = [] 
global root 

root = Tk() 
root.title("Main") 
startCounting() 
root.mainloop() 

उत्तर

22

Tkinter केवल मुख्य थ्रेड से चलाने के लिए डिज़ाइन किया गया है,। the docs देखें:

बस मुख्य थ्रेड में सभी यूआई कोड चलाने के लिए, और लेखकों एक कतार वस्तु को लिखने करते हैं; जैसे

... और एक महत्वपूर्ण उदाहरण निम्नानुसार होता है, जिसमें माध्यमिक धागे कतार में अनुरोध लिखते हैं, और मुख्य लूप टी के साथ सभी प्रत्यक्ष बातचीत के लिए विशेष रूप से जिम्मेदार होता है।

कई वस्तुओं और उप कई विभिन्न धागे से अनुरोध प्राप्त पसंद नहीं है, और जीयूआई टूलकिट के मामले में यह केवल मुख्य धागा उपयोग करने के लिए specfically की जरूरत के लिए दुर्लभ नहीं है।

इस मुद्दे के लिए सही पायथन आर्किटेक्चर हमेशा एक धागा (मुख्य एक, अगर किसी को चाहिए) को परिष्कृत वस्तु या उपप्रणाली की सेवा करने के लिए समर्पित है; हर दूसरे धागे को उपप्रणाली या ऑब्जेक्ट के साथ बातचीत की आवश्यकता होती है, उन्हें समर्पित थ्रेड (और संभवतः परिणामों के लिए "वापसी कतार" पर प्रतीक्षा करने के लिए अनुरोध करना चाहिए, यदि कुछ अनुरोध के परिणामस्वरूप परिणाम आवश्यक हैं)। यह सामान्य उद्देश्य के थ्रेडिंग के लिए एक बहुत ही अच्छा पायथन वास्तुकला भी है (और मैं इसे "पायथन में संक्षेप में" लंबाई में फैलाता हूं, लेकिन यह एक और विषय है ;-)।

+0

त्वरित जवाब के लिए धन्यवाद। मैं दस्तावेज़ों की जांच करूंगा। – user430825

+0

@user, आपका स्वागत है! –

+9

मुझे इस प्रतिबंध का सामना करना पड़ा है और यह वास्तव में उपयोग की जाने वाली रणनीति है। मेरे पास एक तरीका है जो सभी कतारों की जांच करता है। मैं फिर रूट को कॉल करके Tkinter के मुख्य पाश के साथ उस विधि को पंजीकृत करता हूं। बाद में (ms, my_method)।My_method में अंतिम कॉल रूट करने के लिए एक और कॉल है। इसके बाद my_method लगातार मुख्य लूप के साथ खुद को पुनः पंजीकृत करता है। यह महत्वपूर्ण है कि my_method में अपवाद आपको मेनलोप के साथ पंजीकरण करने से चूकने का कारण नहीं बनाते हैं। आप कोशिश कर सकते हैं/अंत में अंत में अपने कॉल रूट पर रखना चाहते हैं। –

0

क्या कोई कारण है जो आप चाहते हैं (या आपको लगता है) एक घटना लूप प्रति अपूर्ण खिड़की? एक एकल घटना लूप दर्जन खिड़कियों के दर्जनों (अगर सैकड़ों या हजारों) नहीं हैं। और, जैसा कि किसी अन्य उत्तर में बताया गया है, आप इस घटना लूप को एक अलग थ्रेड में नहीं चला सकते हैं।

तो, अपने कोड को ठीक करने के लिए आपको केवल एक ईवेंट लूप का उपयोग करने की आवश्यकता है, और इसे मुख्य थ्रेड में चलाया जाना चाहिए।

+0

उत्तर के लिए आपको बहुत बहुत धन्यवाद, मैं समस्या को हल करने में सक्षम हूं, धन्यवाद दोस्तों, मैंने कभी इस तरह की जगह में पोस्ट नहीं किया था और मैं बहुत मदद से सुखद आश्चर्यचकित हूं। – user430825

6

टिंकर के पास कई धागे से इनपुट से निपटने में समस्याएं हैं, मैं इसके बजाय mtTkinter का उपयोग करता हूं, आपको किसी भी कोड को बदलने की आवश्यकता नहीं होगी और सब कुछ ठीक काम करेगा। बस Tkinter के बजाय mtTkinter आयात करें।

आप इसे यहाँ प्राप्त कर सकते हैं:

http://tkinter.unpythonic.net/wiki/mtTkinter

+0

यह पाइथन 3 के साथ काम करता है? –

संबंधित मुद्दे