2015-06-02 13 views
6

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

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

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

+0

देखें [यह उदाहरण] (https://groups.google.com/forum/#!topic/kivy-users/QM0e_bmtlbU)। शायद आप इसे अपने ऐप में इस्तेमाल कर सकते हैं। – doru

उत्तर

6

मैं हाल ही में समस्या आप वर्णित निपटने गया था:

मेरे main.py:

display doesn't update until the process finishes

यहां एक संपूर्ण उदाहरण है कि मैं #Kivy आईआरसी चैनल में @andy_s की मदद से काम कर गया है

from kivy.app import App 
from kivy.uix.popup import Popup 
from kivy.factory import Factory 
from kivy.properties import ObjectProperty 
from kivy.clock import Clock 

import time, threading 

class PopupBox(Popup): 
    pop_up_text = ObjectProperty() 
    def update_pop_up_text(self, p_message): 
     self.pop_up_text.text = p_message 

class ExampleApp(App): 
    def show_popup(self): 
     self.pop_up = Factory.PopupBox() 
     self.pop_up.update_pop_up_text('Running some task...') 
     self.pop_up.open() 

    def process_button_click(self): 
     # Open the pop up 
     self.show_popup() 

     # Call some method that may take a while to run. 
     # I'm using a thread to simulate this 
     mythread = threading.Thread(target=self.something_that_takes_5_seconds_to_run) 
     mythread.start() 

    def something_that_takes_5_seconds_to_run(self): 
     thistime = time.time() 
     while thistime + 5 > time.time(): # 5 seconds 
      time.sleep(1) 

     # Once the long running task is done, close the pop up. 
     self.pop_up.dismiss() 

if __name__ == "__main__": 
    ExampleApp().run() 

मेरे example.kv:

AnchorLayout: 
    anchor_x: 'center' 
    anchor_y: 'center' 
    Button: 
     height: 40 
     width: 100 
     size_hint: (None, None) 
     text: 'Click Me' 
     on_press: app.process_button_click() 

<PopupBox>: 
    pop_up_text: _pop_up_text 
    size_hint: .5, .5 
    auto_dismiss: True 
    title: 'Status' 

    BoxLayout: 
     orientation: "vertical" 
     Label: 
      id: _pop_up_text 
      text: '' 

यदि आप इस उदाहरण को चलाते हैं, तो आप Click Me बटन पर क्लिक कर सकते हैं, जिसे एक मोडल/पॉप-अप के रूप में "प्रगति पट्टी" खोलना चाहिए। यह पॉप अप मुख्य विंडो को अवरुद्ध किए बिना 5 सेकंड के लिए खुला रहेगा। 5 सेकंड के बाद, पॉप अप स्वचालित रूप से खारिज कर दिया जाएगा।

+0

सलाह @ डर्टी पेंगुइन के लिए धन्यवाद। मैं इसके साथ खेल रहा हूं, थ्रेडिंग से शुरू कर रहा हूं और एक बहुत ही अजीब मुद्दा है। जब मैं अपना इन-ऐप रन बटन दबाता हूं तो मेरे फ़ंक्शन को कॉल करने के बजाय, मैं स्टार्टर को कॉल करता हूं जो 'रनिंग' पॉपअप उत्पन्न करता है और मेरे फ़ंक्शन के साथ थ्रेड शुरू करता है। मुद्दा यह है कि जब धागे के रूप में चलाया जाता है, तो समारोह अजीब चीजें करता है। असल में, मेरा फ़ंक्शन एक सीएसवी के आधार पर बटनों की एक तालिका उत्पन्न करता है, और जब थ्रेड के रूप में चलाया जाता है, तो इनमें से कुछ बटन सफेद और अनजान होते हैं। यह हर बार अलग-अलग बटन होता है, और अगर मैं इसे अलग थ्रेड के रूप में नहीं चलाता तो यह दूर हो जाता है। विचार? –

+0

इन अजीब बटनों को क्लिक करने योग्य बनाता है, वे मेरे ग्रिड के बाकी बटनों से बिल्कुल अलग दिखते हैं। यह आम तौर पर या तो 1 या 4 बटन (एप्रोक्स 60 से बाहर) होता है जो यह करता है। अन्य सभी बटनों में डिफ़ॉल्ट भरने का रंग होता है, लेकिन इन अजीब बटनों में एक सफेद भरना होता है और क्लिक करते समय हाइलाइट नहीं किया जाता है। एकमात्र तरीका जिसे मैं यह बताने में सक्षम था कि वे क्लिक करने योग्य थे उन्हें प्रिंट प्रिंट करना था। –

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