#!/usr/bin/env python # -*- coding: utf-8 -*- """ @author: hannes.rotzinger@kit.edu / 2015,2016,2017 marco.pfirrmann@kit.edu / 2016, 2017 @license: GPL """ import sys # support both PyQt4 and 5 in_pyqt5 = False in_pyqt4 = False try: from PyQt5.QtCore import Qt, QObject from PyQt5.QtWidgets import QApplication in_pyqt5 = True except ImportError as e: print("import of PyQt5 failed, trying PyQt4 (error: {})".format(e)) if not in_pyqt5: try: from PyQt4.QtCore import Qt, QObject from PyQt4.QtGui import QApplication in_pyqt4 = True except ImportError: print("import of PyQt5 and PyQt4 failed. Install one of those.") sys.exit(-1) import argparse import qkit from qkit.gui.qviewkit.PlotWindow import PlotWindow from threading import Lock class DATA(QObject): """Class for housekeeping the different windows in qviewkit. This class handles the relationship; opening and closing of different PlotWindow objects. """ open_plots = {} open_ds = {} dataset_info = {} ds_tree_items= {} ds_cmd_open = {} toBe_deleted = [] lock = Lock() info_thread_continue = True "a set of housekeeping functions..." def append_plot(self,parent,window_id,ds): # self, item, dataset window = PlotWindow(parent,self,ds) #print(window, window_id) self.open_plots[str(window_id)]=window self.open_ds[ds] = window_id window.show() # non-modal return window def _toBe_deleted(self,ds): if ds in self.open_ds: self.toBe_deleted.append(ds) def _remove_plot_widgets(self, closeAll = False): # helper func to close widgets def close_ds(ds): if ds in self.open_ds: window_id = self.open_ds[ds] window_id.setCheckState(0,Qt.Unchecked) # make sure data is consitent if str(window_id) in self.open_plots: self.open_plots[str(window_id)].deleteLater() self.open_plots.pop(str(window_id)) if ds in self.open_ds: self.open_ds.pop(ds) if closeAll: for ds in list(self.open_ds.keys()): close_ds(ds) else: for ds in self.toBe_deleted: close_ds(ds) self.toBe_deleted = [] def remove_plot(self,window_id,ds): if window_id in self.open_plots: win = self.open_plots.pop(window_id) win.deleteLater() if ds in self.open_ds: self.open_ds.pop(ds) def plot_is_open(self,ds): return ds in self.open_ds def has_dataset(self,ds): return ds in self.dataset_info def set_info_thread_continue(self,On): with self.lock: self.info_thread_continue = On def close_all(self): QApplication.quit() # Main entry to program. def main(argv): """Main function to open a h5 file with qviewkit. This function is called via command line. It opens the optional parsed h5 file and the optional parsed datasets automatically. The DatasetsWindow object creates a Qt based window with some UI buttons for file handling and a populated tree of the datasets. Args: '-f','--file', type=str, help='hdf filename to open' '-ds','--datasets', type=str, help='(optional) datasets opened by default' '-rt','--refresh_time', type=float, help='(optional) refresh time' '-sp','--save_plot', default=False,action='store_true', help='(optional) save default plots' '-live','--live_plot',default=False,action='store_true', help='(optional) if set, plots are reloaded' '-qinfo','--qkit_info',default=False,action='store_true', help='(optional) if set, listen to qkit infos' """ # some configuration boilerplate data = DATA() parser = argparse.ArgumentParser( description="Qviewkit / qkit tool to visualize qkit-hdf files // HR@KIT 2015") parser.add_argument('-f','--file', type=str, help='hdf filename to open') parser.add_argument('-ds','--datasets', type=str, help='(optional) datasets opened by default') parser.add_argument('-rt','--refresh_time', type=float, help='(optional) refresh time') parser.add_argument('-sp','--save_plot', default=False,action='store_true', help='(optional) save default plots') parser.add_argument('-live','--live_plot',default=False,action='store_true', help='(optional) if set, plots are reloaded') parser.add_argument('-qinfo','--qkit_info',default=False,action='store_true', help='(optional) if set, listen to qkit infos') args=parser.parse_args() data.args = args # create Qt application if in_pyqt5: app = QApplication(argv) if in_pyqt4: app = QApplication(argv,True) # if activated, start info thread if data.args.qkit_info: from qkit.gui.qviewkit.info_subsys import info_thread it = info_thread(data) it.start() # create main window from qkit.gui.qviewkit.DatasetsWindow import DatasetsWindow # dsw = DatasetsWindow(data) dsw.show() dsw.raise_() # Connect signal for app quit app.lastWindowClosed.connect(quit) app.exec_() if __name__ == "__main__": main(sys.argv)