2011-11-21 17 views
13

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

लेकिन मुझे इसे सही काम करने के लिए काफी कुछ नहीं मिल सकता है। मेरे सभी प्रयासों के परिणामस्वरूप या तो कोई त्रुटि हुई है या इसका कोई प्रभाव नहीं पड़ा है। और मैं कर्सरशैप्स को गलत तरीके से कॉल कर रहा हूं PyQt4.Qt.WaitCursor एक त्रुटि देता है जिसमें मॉड्यूल में यह शामिल नहीं है।

प्रक्रिया को चलने वाले उपयोगकर्ता को इंगित करने का सही तरीका क्या है?

उत्तर

34

मुझे लगता है कि QApplication.setOverrideCursor आप जो खोज रहे हैं:

from PyQt4.QtCore import Qt 
from PyQt4.QtGui import QApplication 
... 
QApplication.setOverrideCursor(Qt.WaitCursor) 
# do lengthy process 
QApplication.restoreOverrideCursor() 
+0

धन्यवाद, यह पूरी तरह से काम करता है। – TimothyAWiseman

+0

नोट: यह PyQt4 में काम करता है। हालांकि लिनक्स के तहत पायसाइड 1.2.2 (उबंटू 16.10) कहता है "एक्स त्रुटि: खराब कर्सर (अमान्य कर्सर पैरामीटर) 6" "मेजर ऑपोडोड: 2 (एक्स_Cएचेंजविंडो एट्रिब्यूट्स)" "संसाधन आईडी: 0xa"। QOursor() की आवश्यकता है कि दस्तावेज के बावजूद - सेटऑवर्राइड कर्सर (QCursor (Qt.WaitCursor)) के बजाय PySide के सेट ओवरराइड कर्सर (Qt.WaitCursor) को खिलााना - काम करता है। कुछ परिस्थितियों में, पुनर्स्थापित करने के लिए एक ही त्रुटि है। यह एक ज्ञात पायसाइड बग प्रतीत होता है। – Ubuntourist

+0

@Ubuntourist। धन्यवाद - मैं PySide में बग की पुष्टि कर सकता हूं। 'क्यू कर्सॉर' श्रेणी में एक प्रतिलिपि बनाने वाला है जो 'Qt.CursorShape' enum मान लेता है, इसलिए वास्तव में 'QCursor' का उपयोग करना आवश्यक नहीं है। मुझे लगता है कि QT पक्ष पर 'QCursor' बनाना पियसाइड मुद्दे को ठीक करता है। – ekhumoro

9

ekhumoro के समाधान सही है। यह समाधान शैली के लिए एक संशोधन है। मैंने एखुमोर का क्या इस्तेमाल किया लेकिन एक अजगर सजावट का इस्तेमाल किया।

from PyQt4.QtCore import Qt 
from PyQt4.QtGui import QApplication, QCursor, QMainWidget 

def waiting_effects(function): 
    def new_function(self): 
     QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) 
     try: 
      function(self) 
     except Exception as e: 
      raise e 
      print("Error {}".format(e.args[0])) 
     finally: 
      QApplication.restoreOverrideCursor() 
    return new_function 

मैं सिर्फ सजावटी को किसी भी विधि पर रख सकता हूं जिसे मैं स्पिनर को सक्रिय करना चाहता हूं।

class MyWigdet(QMainWidget): 

    # ... 

    @waiting_effects 
    def doLengthyProcess(self): 
     # do lengthy process 
     pass 
+1

सजावट एक अच्छा विचार है, धन्यवाद। मैं 'फ़ंक्शन (* args, ** kwargs) 'को कॉल करने की अनुशंसा करता हूं,' फ़ंक्शन' के रिटर्न वैल्यू को वापस कर रहा हूं, और 'कॉल ... अंत में' और अधिक भलाई के लिए ब्लॉक में अपनी कॉल लपेट रहा हूं। मुझे लगता है कि इस टिप्पणी में, इसलिए मैं आपके समाधान को संपादित करने का प्रयास करूंगा। –

+1

'रिटर्न फ़ंक्शन (* args, ** kwargs)' पर प्रयास ब्लॉक को बदलने से भी उपयोगी हो सकता है, या कम से कम मेरे मामले में था। –

0

बेहतर इस तरह से:

def waiting_effects(function): 
    def new_function(*args, **kwargs): 
     QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) 
     try: 
      return function(*args, **kwargs) 
     except Exception as e: 
      raise e 
      print("Error {}".format(e.args[0])) 
     finally: 
      QApplication.restoreOverrideCursor() 
    return new_function 
7

कैमरून और डेविड की जवाब एक पूरे समारोह की प्रतीक्षा कर्सर की स्थापना के लिए महान हैं, मुझे लगता है कि एक संदर्भ प्रबंधक के टुकड़े के लिए प्रतीक्षा कर्सर की स्थापना के लिए सबसे अच्छा काम करता कोड की:

from contextlib import contextmanager 
from PyQt4 import QtCore 
from PyQt4.QtGui import QApplication, QCursor 

@contextmanager 
def wait_cursor(): 
    try: 
     QApplication.setOverrideCursor(QCursor(QtCore.Qt.WaitCursor)) 
     yield 
    finally: 
     QApplication.restoreOverrideCursor() 

तो ब्लॉक के साथ एक लंबी प्रक्रिया में कोड डाल:

with wait_cursor(): 
    # do lengthy process 
    pass 
+0

यह सबसे सरल, सबसे सुरुचिपूर्ण और बहुमुखी है – Schollii

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