2010-09-30 36 views
5

Tôi đang thu thập số liệu thống kê sử dụng cho các ứng dụng của mình bao gồm số lượng mỗi phiên kéo dài. Tuy nhiên, tôi dường như không thể lưu thông tin này vì Không có tín hiệu nào tôi đã thử thực sự thành công để gọi hàm report_session của tôi.Có cách nào để gọi một hàm ngay trước khi ứng dụng PyQt kết thúc không?

Đây là những tín hiệu tôi đã cố gắng:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. phá hủy()

Hoặc những tín hiệu không bao giờ được phát ra hoặc ứng dụng không không sống đủ lâu sau đó để chạy bất cứ thứ gì khác. Đây là của tôi chính:

app = QtGui.QApplication(sys.argv) 

ui = MainWindow() 
ui.app = app 
QtCore.QObject.connect(ui, QtCore.SIGNAL("destroyed()"), ui.report_session) 
ui.show() 
logger.info('Started!') 
splash.finish(ui) 

sys.exit(app.exec_()) 

Trả lời

1

Tìm thấy this answer liên quan đến quá tải closeEvent().

nó hoạt động hoàn hảo cho tôi.

2

Đặt mã giữa app.exec_sys.exit:

ret = app.exec_() 
# Your code that must run when the application closes goes here 
sys.exit(ret) 
4

Để đảm bảo rằng một hàm Python được gọi tại thời điểm thôi quá trình, nói chung (có hoặc không có Qt tham gia ;-) , bạn có thể sử dụng mô-đun atexit của thư viện Python chuẩn:

import atexit 

def whatever(): ... 

atexit.register(whatever) 

Hết sức thận trọng Tôi khuyên bạn nên sử dụng phương pháp ràng buộc thay vì một chức năng cho mục đích này - nó "nên" làm việc, nhưng giai đoạn phá hủy của một quá trình luôn luôn là một phần tinh tế, và đơn giản hơn bạn giữ nó, thì tốt hơn.

atexit sẽ không kích hoạt cho một vụ tai nạn đủ cứng của một quá trình, tất nhiên (ví dụ, nếu quá trình này là giết chết với một kill -9, sau đó theo định nghĩa nó không có cơ hội để chạy bất kỳ mã kết thúc) - - Hệ điều hành sẽ thấy điều đó ;-). Nếu bạn cần xử lý bất kỳ sự cố nào dù bạn có khó khăn như thế nào từ một quá trình "cơ quan giám sát" riêng biệt, một vấn đề phụ đáng kể.

+0

Tôi chưa thử điều đó, mặc dù tôi đã biết về mô-đun ngoại tuyến. Cuối cùng tôi đã muốn thực hiện lại phương thức closeEvent của QApplication. – fccoelho

3

Phương thức Mark Byers được đăng sẽ chạy sau khi tiện ích chính đã bị đóng, nghĩa là các điều khiển của nó sẽ không còn khả dụng nữa.

Nếu bạn cần phải làm việc với bất kỳ giá trị từ điều khiển trên biểu mẫu, bạn sẽ muốn nắm bắt những sự kiện gần gũi và làm việc của bạn có:

class MainWidget(QtGui.QWidget): 

    #... 

    def closeEvent(self, event): 
     print "closing PyQtTest" 
     self.SaveSettings() 
     # report_session() 

Ngoài ra, xem ví dụ nhắn Box trong hướng dẫn ZetCode First programs in PyQt4 toolkit (gần cuối trang). Điều này cho thấy cách chấp nhận hoặc hủy yêu cầu đóng.

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