Advertisement
Guest User

PySide exception/object lifetime MVCE

a guest
Sep 28th, 2014
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.41 KB | None | 0 0
  1. import logging
  2. import sys
  3. import weakref
  4.  
  5. from PySide import QtGui
  6.  
  7.  
  8. class InnerPresenter:
  9.     def __init__(self, view):
  10.         self._view = weakref.ref(view)
  11.         self.logger = logging.getLogger('InnerPresenter')
  12.         self.logger.debug('Initializing InnerPresenter (id:%s)' % id(self))
  13.    
  14.     def __del__(self):
  15.         self.logger.debug('Deleting InnerPresenter (id:%s)' % id(self))
  16.    
  17.     @property
  18.     def view(self):
  19.         return self._view()
  20.    
  21.     def on_alert(self):
  22.         self.view.show_alert()
  23.        
  24.     def on_raise_exception(self):
  25.         raise Exception('From InnerPresenter (id:%s)' % id(self))
  26.        
  27.  
  28. class OuterView(QtGui.QMainWindow):
  29.     def __init__(self, *args, **kwargs):
  30.         super(OuterView, self).__init__(*args, **kwargs)
  31.         self.logger = logging.getLogger('OuterView')
  32.         # Menus
  33.         menu_bar = self.menuBar()
  34.         test_menu = menu_bar.addMenu('&Test')
  35.         self.open_action = QtGui.QAction('&Open inner', self, triggered=self.on_open, enabled=True)
  36.         test_menu.addAction(self.open_action)
  37.         self.close_action = QtGui.QAction('&Close inner', self, triggered=self.on_close, enabled=False)
  38.         test_menu.addAction(self.close_action)
  39.    
  40.     def closeEvent(self, event, *args, **kwargs):
  41.         self.logger.debug('Exiting application')
  42.         event.accept()
  43.    
  44.     def on_open(self):
  45.         self.setCentralWidget(InnerView(self))
  46.         self.open_action.setEnabled(False)
  47.         self.close_action.setEnabled(True)
  48.        
  49.     def on_close(self):
  50.         self.setCentralWidget(None)
  51.         self.open_action.setEnabled(True)
  52.         self.close_action.setEnabled(False)
  53.        
  54.  
  55. class InnerView(QtGui.QWidget):
  56.     def __init__(self, *args, **kwargs):
  57.         super(InnerView, self).__init__(*args, **kwargs)
  58.         self.logger = logging.getLogger('InnerView')
  59.         self.logger.debug('Initializing InnerView (id:%s)' % id(self))
  60.         self.presenter = InnerPresenter(self)
  61.         # Layout
  62.         layout = QtGui.QHBoxLayout(self)
  63.         alert_button = QtGui.QPushButton('Alert!', self, clicked=self.presenter.on_alert)
  64.         layout.addWidget(alert_button)
  65.         raise_button = QtGui.QPushButton('Raise exception!', self, clicked=self.presenter.on_raise_exception)
  66.         layout.addWidget(raise_button)
  67.         self.setLayout(layout)
  68.    
  69.     def __del__(self):
  70.         self.logger.debug('Deleting InnerView (id:%s)' % id(self))
  71.    
  72.     def show_alert(self):
  73.         QtGui.QMessageBox(text='Here is an alert').exec_()
  74.        
  75.  
  76. if __name__ == '__main__':
  77.     logging.basicConfig(level=logging.DEBUG)
  78.     app = QtGui.QApplication(sys.argv)
  79.     view = OuterView()
  80.     view.show()
  81.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement