import os
from PyQt5 import uic
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtWidgets import QMainWindow, QHBoxLayout, QPushButton, QSplitter
from pynta.view.GUI import resources # This is what allows the icons to show up even if not explicitly used in the code
from pynta.util.log import get_logger
from pynta.view.GUI.camera_viewer_widget import CameraViewerWidget
from pynta.view.GUI.config_tracking_widget import ConfigTrackingWidget
from pynta.view.GUI.config_widget import ConfigWidget
from pynta.view.GUI.histogram_tracks_widget import HistogramTracksWidget
[docs]class MainWindowGUI(QMainWindow):
def __init__(self, refresh_time=30):
super().__init__()
uic.loadUi(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'designer', 'MainWindow.ui'), self)
self.logger = get_logger(name=__name__)
self.central_layout = QHBoxLayout(self.centralwidget)
self.widget_splitter = QSplitter()
self.camera_viewer_widget = CameraViewerWidget()
self.histogram_tracks_widget = HistogramTracksWidget(self)
self.widget_splitter.addWidget(self.camera_viewer_widget)
self.widget_splitter.addWidget(self.histogram_tracks_widget)
self.widget_splitter.setSizes((750, 750))
self.central_layout.addWidget(self.widget_splitter)
self.config_widget = ConfigWidget()
self.config_tracking_widget = ConfigTrackingWidget()
self.refresh_timer = QTimer()
self.refresh_timer.timeout.connect(self.update_gui)
self.refresh_timer.start(refresh_time)
self.showMaximized()
self.connect_actions()
self.connect_buttons()
self.connect_signals()
[docs] def update_gui(self):
self.logger.error('Update gui not defined')
[docs] def connect_signals(self):
self.config_tracking_widget.apply_config.connect(self.update_tracking_config)
self.config_widget.apply_config.connect(self.update_config)
[docs] def connect_buttons(self):
self.histogram_tracks_widget.button_histogram.clicked.connect(self.calculate_histogram)
self.histogram_tracks_widget.button_tracks.clicked.connect(self.update_tracks)
[docs] def connect_actions(self):
self.actionClose.triggered.connect(self.safe_close)
self.actionLoad_Config.triggered.connect(self.load_config)
self.actionSave_Image.triggered.connect(self.save_image)
self.actionLoad_Data.triggered.connect(self.load_data)
self.actionSnap_Photo.triggered.connect(self.snap)
self.actionStart_Movie.triggered.connect(self.start_movie)
self.actionStop_Movie.triggered.connect(self.stop_movie)
self.actionStart_Continuous_Saves.triggered.connect(self.start_continuous_saves)
self.actionStop_Continuous_Saves.triggered.connect(self.stop_continuous_saves)
self.actionSet_ROI.triggered.connect(self.set_roi)
self.actionClear_ROI.triggered.connect(self.clear_roi)
self.actionConfiguration.triggered.connect(self.configure)
self.actionToggle_bg_reduction.triggered.connect(self.background_reduction)
self.actionStart_Tracking.triggered.connect(self.start_tracking)
self.actionStop_Tracking.triggered.connect(self.stop_tracking)
self.actionStart_Linking.triggered.connect(self.start_linking)
self.actionStop_Linking.triggered.connect(self.stop_linking)
self.actionSave_Tracks.triggered.connect(self.start_saving_tracks)
self.actionShow_Cheatsheet.triggered.connect(self.show_cheat_sheet)
self.actionAbout.triggered.connect(self.show_about)
self.actionInitialize_Camera.triggered.connect(self.initialize_camera)
self.actionUpdate_Histogram.triggered.connect(self.calculate_histogram)
self.actionTracking_Config.triggered.connect(self.config_tracking_widget.show)
self.actionConfiguration.triggered.connect(self.config_widget.show)
[docs] def initialize_camera(self):
self.logger.debug('Initialize Camera')
[docs] def show_about(self):
self.logger.debug('Showing About')
[docs] def load_config(self):
self.logger.debug('Loading config')
[docs] def snap(self):
self.logger.debug('Snapped a photo')
[docs] def save_image(self):
self.logger.debug('Saved an image')
[docs] def start_movie(self):
self.logger.debug('Start a movie')
[docs] def stop_movie(self):
self.logger.error('Stop movie not defined')
[docs] def start_continuous_saves(self):
self.logger.debug('Started continuous saves')
[docs] def stop_continuous_saves(self):
self.logger.error('Stop continuous Saves not implemented')
[docs] def start_tracking(self):
self.logger.debug('Started tracking particles')
[docs] def stop_tracking(self):
self.logger.debug('Stopped tracking particles')
[docs] def start_saving_tracks(self):
self.logger.debug('Started saving tracks')
[docs] def stop_saving_tracks(self):
self.logger.debug('Stopped saving tracks')
[docs] def start_linking(self):
self.logger.debug('Started linking particles')
[docs] def stop_linking(self):
self.logger.debug('Stopped linking')
[docs] def configure(self):
self.logger.debug('Showed the config window')
[docs] def set_roi(self):
self.logger.debug('Setting the ROI')
[docs] def clear_roi(self):
self.logger.debug('Resetting the ROI')
[docs] def background_reduction(self):
self.logger.debug('Setting background reduction')
[docs] def show_cheat_sheet(self):
self.logger.debug('Showing the cheat sheet')
[docs] def load_data(self):
self.logger.debug('Loading data')
[docs] def safe_close(self):
self.logger.debug('Closing the program')
self.close()
[docs] def calculate_histogram(self):
self.logger.error('Update Histogram method not defiend')
[docs] def update_tracks(self):
self.logger.error('Update tracks method not defined')
[docs] def update_tracking_config(self, config):
self.logger.error('Update Tracking config method not defined')
[docs] def update_config(self, config):
self.logger.error('Update Config method not defined')
[docs] def closeEvent(self, *args, **kwargs):
self.config_widget.close()
self.config_tracking_widget.close()
super(MainWindowGUI, self).closeEvent(*args, **kwargs)
if __name__ == "__main__":
import sys
import logging
from PyQt5.QtWidgets import QApplication
logger = get_logger(name=__name__)
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
app = QApplication([])
win = MainWindowGUI()
win.show()
sys.exit(app.exec_())