2012-03-12 10 views
6

मैं विकास के लिए क्यूटी + पायक्यूटी का उपयोग करता हूं। मेरा आवेदन बहुत बड़ा है (स्रोत कोड का 20 एमबी)। इसमें कई अलग-अलग मेनू और विजेट शामिल हैं। बहुत कुछ मैं कुछ विजेट में विधि पर केवल 1 स्ट्रिंग बदलता हूं। लेकिन परिवर्तनों की जांच के लिए मैं अपना आवेदन बंद कर देता हूं, इसे फिर से लॉन्च करता हूं, मेनू 1 -> मेनू 2 पर जाता हूं ...। और केवल इस चरण के बाद मैं परिवर्तनों की जांच कर सकता हूं।पुन: लॉन्च किए बिना पीईक्यूटी अनुप्रयोगों को डीबग कैसे करें?

मैं केवल एक वर्ग/विजेट के लिए विधियों को फिर से लोड कैसे कर सकता हूं? बंद/खुले पूरे आवेदन के बिना?

+2

अच्छा सवाल। मैंने कुछ ऐसा ही पूछा, हालांकि अधिक सामान्य: http://stackoverflow.com/questions/9519384/editing-programs-while-they-are-running-how। – gdw2

+0

कुछ समय पहले मैंने ['reimport'] (http://code.google.com/p/reimport/) मॉड्यूल का उपयोग करने की कोशिश की है जिसमें PySide http://pastebin.com/VN0JPDfC के लिए कुछ वर्कअराउंड लिख रहे हैं (PyQt चाहिए काम भी)। यह काम करता है, लेकिन कभी-कभी यह अप्रत्याशित अपवाद उठाता है। मैं @jdi से सहमत हूं, परीक्षण बेहतर तरीका है। – reclosedev

उत्तर

3

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

इसका बुरा लग रही है, लेकिन यह कुछ इस तरह दिखेगा:

## main.py ## 

class MainWindow(QtGui.QMainWindow): 

    def __init__(self, *args, **kwargs): 
     super(MainWindow, self).__init__(*args, **kwargs) 
     self.resize(640,480) 
     self.central = widget.Widget() 
     self.setCentralWidget(self.central) 

     self.toolbar = QtGui.QToolBar() 
     self.toolbar.addAction("Reload Entire Widget", self._reloadWidget) 
     self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolbar) 

    def _reloadWidget(self): 
     print "Reloading", widget 
     reload(widget) 
     self.central.deleteLater() 
     self.central = widget.Widget() 
     self.setCentralWidget(self.central) 

## widget.py ## 

class Widget(QtGui.QWidget): 

    def __init__(self, *args, **kwargs): 
     super(Widget, self).__init__(*args, **kwargs) 
     self.layout = QtGui.QVBoxLayout(self) 
     self.button = QtGui.QPushButton("Click") 
     self.layout.addWidget(self.button) 

     self.button.clicked.connect(self.testMethod) 

    def testMethod(self): 
     print "testmethod(): FOO" 

फिर से, मुझे लगता है कि इस दृष्टिकोण समस्याग्रस्त और साथ के बाद से आप को नष्ट करने और अपने विजेट से बनाना निपटने के लिए मुश्किल है। अधिक समस्या तब होती है जब आपके ऐप के कुछ हिस्सों में इस विजेट के स्लॉट्स को अपडेट किया जा रहा संकेत मिलता है। फिर आपको अपने मॉड्यूल को फिर से लोड करना होगा और उनके संकेतों को फिर से जोड़ना होगा। यह एक बड़ी निर्भरता पेड़ की स्थिति बन जाता है। मानक पायथन लिपि के साथ काफी मुश्किल है, अकेले इसे पीईक्यूटी फ्रेमवर्क की तरह कुछ और लगातार और गतिशील के साथ करने की कोशिश करें।

असल में, इस क्षमता पर भरोसा न करें। अपने दोहराव वाले कार्यों को अनुकरण करने के लिए आप setting up something with QTest से बेहतर हो सकते हैं।