2012-03-12 35 views
6

Tôi sử dụng Qt + PyQt để phát triển. Ứng dụng của tôi rất lớn (20 MB mã nguồn). Nó bao gồm nhiều menu và widget khác nhau. Rất tôi chỉ thay đổi 1 chuỗi trên phương pháp trong một số tiện ích. Nhưng để kiểm tra các thay đổi, tôi tắt ứng dụng của mình, khởi động lại ứng dụng, vào menu1 -> menu2…. và chỉ sau bước này tôi mới có thể kiểm tra các thay đổi.Làm thế nào để gỡ lỗi các ứng dụng PyQt mà không cần khởi chạy lại?

Làm cách nào để tải lại các phương thức chỉ cho một lớp/tiện ích? Không đóng/mở toàn bộ ứng dụng?

+2

Câu hỏi hay. Tôi hỏi một cái gì đó tương tự, mặc dù tổng quát hơn nhiều: http://stackoverflow.com/questions/9519384/editing-programs-while-they-are-running-how. – gdw2

+0

Một thời gian trước, tôi đã cố gắng sử dụng mô-đun ['reimport'] (http://code.google.com/p/reimport/) bằng cách viết một số cách giải quyết cho PySide http://pastebin.com/VN0JPDfC (PyQt nên làm việc quá). Nó làm việc, nhưng đôi khi nó làm tăng ngoại lệ không thể đoán trước. Tôi đồng ý với @jdi, thử nghiệm đó là cách tốt hơn. – reclosedev

Trả lời

3

Câu trả lời chung của tôi về điều này sẽ là không, không thể thực hiện theo cách thẳng thắn. Vấn đề chính là khi bạn khởi động ứng dụng, nó tải mọi thứ vào bộ nhớ, và các lớp của bạn có các phương thức của chúng bị ràng buộc, vv ... Vì vậy, để cập nhật, các giá trị bạn đã thay đổi của một lớp, bạn sẽ phải phá hủy lớp đó (hoặc widget) và tạo lại nó dưới nguồn cập nhật (cũng sẽ giết chết trẻ em).

xấu của nó tìm kiếm, nhưng nó sẽ giống như thế này:

## 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" 

Một lần nữa, tôi nghĩ rằng phương pháp này là có vấn đề và khó khăn để đối phó với kể từ khi bạn có để tiêu diệt và tái tạo widget của bạn. Các sự cố khác xảy ra khi các phần của ứng dụng của bạn có các tín hiệu bị ràng buộc với các vị trí của tiện ích này đang được cập nhật. Sau đó, bạn cũng phải tải lại các mô-đun của họ và liên kết lại các tín hiệu của họ. Nó trở thành một tình trạng cây phụ thuộc lớn. Nó đủ cứng để làm với kịch bản python chuẩn, hãy để một mình cố gắng làm điều đó với một thứ gì đó bền vững hơn và năng động hơn như khung PyQt.

Về cơ bản, không dựa vào khả năng này. Bạn tốt hơn có thể là setting up something with QTest để mô phỏng các tác vụ lặp đi lặp lại của bạn.

Các vấn đề liên quan