2015-11-19 10 views
9

मेरे पास एक सॉकेट क्लाइंट है जो हर बार एक संदेश प्राप्त करते समय View() कक्षा को कॉल करता है। मैंने अपना कोड इस तरह से विभाजित कर दिया है कि इस वर्ग में बस print() या किसी अन्य डिस्प्ले विधि का उपयोग कर सकते हैं, जैसा मुझे पसंद है। हालांकि, ऐसा लगता है कि किवी इस विधि का शौक नहीं है। मैंने अपने दृश्य के लिए Kivy की BoxLayout कक्षा बढ़ा दी है और message() फ़ंक्शन को कॉल कर सकते हैं। वर्ग इस तरह दिखता है:मैं थ्रेड से Kivy तत्वों को कैसे अपडेट करूं?

class View(BoxLayout): 
    def __init__(self, **kwargs): 
     super(View, self).__init__(**kwargs) 
     self.btn = Button(text='Default') 
     # Bind button press method 
     self.btn.bind(on_press=self.message) 
     self.add_widget(self.btn) 
    def message(self, message): 
     self.btn.text = 'Meow' 
     self.add_widget(Button(text='Meow')) 
     print(str(message)) 

संदेश समारोह वास्तव में कहा जाता है और यह प्रिंट लेकिन इंटरफ़ेस अपडेट नहीं होता। जब मैं बटन दबाता हूं, तो यह इंटरफ़ेस के साथ-साथ प्रिंट को अपडेट करता है।

मैंने बटन टेक्स्ट को संशोधित करने के लिए StringProperty का उपयोग करने में देखा है लेकिन यह भी विफल रहा है। एक नोट के रूप में, यदि मैं जो कर रहा हूं वह पूरी तरह से अक्षम है, तो मैं बोर्ड के रूप में width * height बटनों सहित एक संपूर्ण इंटरफ़ेस खींचने की कोशिश कर रहा हूं।

किसी भी इनपुट की बहुत सराहना की जाती है, यह मुझे पागल कर रही है।


संपादित करें 1 * मैं कुछ टिप्पणियों पर पीछा किया और कुछ चीजें बाहर की कोशिश की है। मैंने Clock क्लास जोड़ा है और इसे से update() विधि शेड्यूल किया है। अद्यतन विधि बस कुछ तत्वों के पाठ को बदल देती है। मैंने देखा है यह काम करता है जब मैं इसे करने के लिए निर्धारित करते हैं, जैसा कि नीचे दिखाया:

def update(self, *args, **kwargs): 
    self.btn.text = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for i in range(32)) 
def message(self, message): 
    try: 
     print(message) 
     self.text = 'sending' 
    except Exception as e: 
     print(e) 

धागा अब बस पाठ संपत्ति message() के रूप में देखा प्रदान करती है। समय-समय पर ट्रिगर update() विधियां भी काम करती हैं, यादृच्छिक पाठ असाइन करती हैं। अब मुद्दा यह है कि यह पाठ सेट नहीं कर सकता है। यह काम नहीं करता:

def update(self, *args, **kwargs): 
    self.btn.text = self.text 

मैं गलत कहीं और कर रही होगी, किसी भी सुझाव?


संपादित 2 * त्रुटि मैं डिबग करने के लिए कोशिश कर रहा हूँ here है।

+0

आप मुख्यधारा के अलावा किसी थ्रेड से UI तत्व या गुणों को संशोधित नहीं कर सकते हैं। मुख्यधारा पर चलने के लिए फ़ंक्शंस शेड्यूल करने के लिए किवी '' क्लॉक'' क्लास को देखें। – bj0

+0

@ bj0 के उत्तर के आगे, आप इस विधि को स्वचालित रूप से फ़ंक्शन पर लागू करने के लिए '@ मेनथ्रेड 'सजावट का उपयोग कर सकते हैं। – inclement

+0

अरे, मैंने पोस्ट को और निष्कर्षों के साथ संपादित किया है।मैं मदद की सराहना करता हूं, और 'क्लॉक()' का उपयोग करने का सुझाव, जैसा ऊपर बताया गया है, यह अभी भी पूरी तरह कार्यात्मक नहीं है। – timur

उत्तर

3

चूंकि आप एक पूर्ण कार्य उदाहरण पोस्ट नहीं करते हैं, इसलिए मैं केवल यह कर सकता हूं कि आप क्या कर रहे हैं। ऐसा लगता है कि आपके पास थ्रेड पर एक ईवेंट (आने वाला संदेश) है, और जब ऐसा होता है तो आप कुछ टेक्स्ट प्रदर्शित करना चाहते हैं। आपको मुख्य थ्रेड पर UI अद्यतनों को 'पुश' करने की आवश्यकता है, लेकिन आपको आवधिकClock के साथ अपडेट करने की आवश्यकता नहीं है, तो आप Clock.schedule_once के साथ एक बार कॉल शेड्यूल कर सकते हैं।

from functools import partial 

def update(self, text, *a): 
    self.btn.text = text 

def message(self, message): 
    Clock.schedule_once(partial(self.update, message), 0) 

खराब उल्लेख किया है, तो आप इस 'पुश मुख्य थ्रेड पर' स्वचालित रूप से @mainthread डेकोरेटर के साथ क्या कर सकते हैं:

@mainthread 
def update(self, text): 
    self.btn.text = text 

def message(self, message): 
    update(message) 

इस तरह, जब भी आप फोन update यह मुख्य थ्रेड पर निष्पादित किया जाएगा।

+0

मेरा इरादा एक पूर्ण कामकाजी उदाहरण पोस्ट नहीं करना था क्योंकि यह एक असाइनमेंट का हिस्सा है और मुझे अपने काम को चोरी करने से नफरत है। मैंने अब गिटहब जनता पर रेपो बनाया है, उपलब्ध [यहां] (https://github.com/TimurKiyivinski/falampous-coconut-appreciator)। मैंने बाद में घड़ी विधियों को हटा दिया है और '@ mainthread' का उपयोग करने के लिए वापस चला गया है। जिस फ़ाइल को आप ढूंढ रहे हैं वह 'client.py' है। – timur

+0

आमतौर पर जब आप उस कोड को पोस्ट नहीं करना चाहते (या नहीं कर सकते) जिस पर आप काम कर रहे हैं, तो बस एक न्यूनतम नंगे-हड्डियों का ऐप बनाएं जिसमें समस्या हल हो रही है। यह आपकी मदद करता है जब लोग आपकी समस्या का पुनरुत्पादन कर सकते हैं। – bj0

+2

ठीक है, आपके कोड पर चमकने के बाद, यह एक किवी समस्या की तरह नहीं दिखता है बल्कि '' 'मल्टीप्रोसेसिंग 'समस्या है। अलग प्रक्रियाएं स्मृति साझा नहीं करती हैं इसलिए ऑब्जेक्ट्स के बीच आपके कई संदर्भ सही काम नहीं करेंगे। इसके बजाए थ्रेडिंग का प्रयोग करें और इसे जिस तरह से आप सोच रहे हैं उसका काम करना चाहिए – bj0

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