def addROI(self,roi = None): if self.roiwidget is None: self.roiwidget = ROIPlotWidget(roi_target = self.p1, view = self.view, parent = self) roiTab = QDockWidget("roi cam {0}".format(self.iCam), self) roiTab.setWidget(self.roiwidget) roiTab.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.BottomDockWidgetArea | Qt.TopDockWidgetArea) roiTab.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetClosable) self.parent.addDockWidget(Qt.BottomDockWidgetArea ,roiTab) roiTab.setFloating(True) roiTab.resize(600,150) def closetab(ev): # This probably does not clean up memory... if not self.roiwidget is None: [self.p1.removeItem(r) for r in self.roiwidget.items()] del self.roiwidget self.roiwidget = None ev.accept() roiTab.closeEvent = closetab self.roiwidget.add_roi(roi)
def create_dockTabAcciones(self): dock = QDockWidget('Tabla de Acciones') self.tab_acc = QTableWidget(dock) dock.setWidget(self.tab_acc) dock.resize(QSize(800, 400)) self.addDockWidget(Qt.NoDockWidgetArea, dock) self.view_menu.addAction(dock.toggleViewAction()) table = ActionTable() table.load('./core/Utils/tbAs.csv') ##Inicializa tabla self.tab_acc.setColumnCount(table.length) self.tab_acc.setHorizontalHeaderLabels(table.column_names) ##Inserta datos self.tab_acc.setRowCount(len(table.elements)) c = 0 for n in table.elements: a = 0 for p in table.column_names: self.tab_acc.setItem(c, a, QTableWidgetItem(n[p])) a = a + 1 c = c + 1 self.tab_acc.resizeColumnsToContents()
def create_dockAnalisis(self): dock = QDockWidget('Tabla Analisis Sintactico') self.tab_ans = QTableWidget(dock) dock.setWidget(self.tab_ans) dock.resize(QSize(800, 400)) self.addDockWidget(Qt.NoDockWidgetArea, dock) self.view_menu.addAction(dock.toggleViewAction()) ##Inicializa la tabla. headerLabels = ('Pila Acciones', 'Cadena Entrada', 'Analisis Sintactico', 'Analisis Semantico') self.tab_ans.setColumnCount(4) self.tab_ans.setHorizontalHeaderLabels(headerLabels) self.tab_ans.resizeColumnsToContents()
def histogramWin(self): if self.hist is None: histTab = QDockWidget("histogram cam {0}".format(self.iCam), self) widget = QWidget() layout = QGridLayout() widget.setLayout(layout) win = pg.GraphicsLayoutWidget() p1 = win.addPlot() p1.getViewBox().invertY(True) p1.hideAxis('left') p1.hideAxis('bottom') self.hist = pg.HistogramLUTItem() self.hist.axis.setPen('k') p1.addItem(self.hist) self.hist.setImageItem(self.view) layout.addWidget(win,0,0) histTab.setWidget(widget) histTab.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea | Qt.BottomDockWidgetArea | Qt.TopDockWidgetArea) histTab.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetClosable) self.parent.addDockWidget(Qt.BottomDockWidgetArea ,histTab) histTab.setFloating(True) histTab.resize(200,200) try: histstate = self.hist.saveState() except Exception as err: display('[ERROR] - could not save histogram state. "pip install pyqtgraph --upgrade" might solve it.') print(err) def closefun(ev): try: self.hist.restoreState(histstate) except Exception as err: print(err) pass self.hist = None ev.accept() histTab.closeEvent = closefun
def add_menulist(window, menu_name, button_name, categories, onlaunch, dockarea): """ Add a menu list with action button :param menu_name: displayed name of the list (displayed) :param button_name: the name of the button :param categories: categories available for selection :param onlaunch: action to trigger on click to button """ root = window panel = QWidget() hbox = QHBoxLayout(panel) class MenuList(QtWidgets.QListWidget): def __init__(self, categories): QtWidgets.QListWidget.__init__(self) self.add_items(categories) self.itemClicked.connect(self.item_click) self.selected = categories def add_items(self, categories): for category in categories: item = QtWidgets.QListWidgetItem(category) self.addItem(item) def item_click(self, item): self.selected = str(item.text()) menulist = MenuList(categories) hbox.addWidget(menulist) launchButton = QtWidgets.QPushButton(button_name) launchButton.clicked.connect(lambda: onlaunch(menulist.selected)) hbox.addWidget(launchButton) panel.setLayout(hbox) dock = QDockWidget(menu_name, root) root.addDockWidget(dockarea, dock) dock.setWidget(panel) dock.resize(QtCore.QSize(dock.width(), dock.minimumHeight())) return menulist
class DockDemo(QWidget): def __init__(self): QWidget.__init__(self) def init(self): self.setGeometry(300, 300, 300, 250) self.setStyleSheet('background-color:white;') self.btn1 = QPushButton('Button', self) self.dock1 = QDockWidget('My First Dock', self) self.dock1.move(20, 20) self.dock1.resize(200, 100) self.dock1.setWidget(self.btn1) self.dock1.setFloating(False) self.dock1.setFeatures(self.dock1.DockWidgetClosable | self.dock1.DockWidgetMovable) self.dock1.setFeatures(self.dock1.NoDockWidgetFeatures) self.show()
class App(QMainWindow): def __init__(self): super().__init__() self.title = 'QTMatPlot - [email protected]' self.left = 10 self.top = 10 self.width = 1280 self.height = 800 self.mpl_dict = {} self.load_yaml() self.mpl_dict['FigDefaults']['data'] = {} self.mpl_dict['Active'] = str((0,0)) self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # Widgets are movable. self.main_widget = QWidget(self) self.layout = QVBoxLayout(self.main_widget) #kinetics = h5py.File('direct.h5', 'r') self.updateFromDict(True, firstrun=True) self.dataLoader = dataLoader(self, []) self.dc = mplCanvas(self.main_widget, data_parent=self, width=10, height=8, dpi=100, data=self.dataLoader.dataStructure, notify_func=self.notify) self.save_button = newButton(self, "Save", "Saves the YAML", (250,self.height-30), self.save_yaml, click_args=None) self.render_button = newButton(self, "Render!", "Renders the PDF", (250,self.height-30), self.save_figure, click_args=None) self.load_button = newButton(self, "Load Yaml", "Loads the Config", (250,self.height-30), self.dataLoader.loadNewYaml, click_args=None) self.text = newTextBox(self, size=(0,30), pos=(self.save_button.button.width()+250, self.height-30), init_text="Welcome!") self.text.textBox.setGeometry(self.save_button.button.width()+self.load_button.button.width(), self.height-30, self.width-self.save_button.button.width(), 15) self.mplTree = newTree(self, self.mpl_dict, pos=(self.width-250,0), size=(250,self.height-30-100), col=1, function=self.updateFromDict, rows=True, notify_func=self.notify) self.dsetTree = newTree(self, self.mpl_dict['Figures'].get(str(self.dc.activeAxes)), pos=(self.width-250,0), size=(250,50), col=1, function=self.updateFromDict, rows=True, dset=str(self.dc.activeAxes)) self.dataTree = newTree(self, self.dataLoader.dataStructure, pos=(0, 0), size=(250,self.height-30), col=3, clickable=True, editable=False, function=self.text.showText, function2=self.updateFromDict, get_figures=self.mplTree.getFigures, mpl=self.mpl_dict, notify_func=self.notify) self.dataTree.tree.setDragEnabled(True) self.dataTree.tree.expandToDepth(0) self.mplTree.tree.header().resizeSection(0, 175) self.dataTree.tree.header().resizeSection(0, 200) # Do up some docks for everything! self.setCentralWidget(self.main_widget) self.mpldock = QDockWidget("Plotting Dictionary", self) self.mpllayout = QVBoxLayout(self.mpldock) self.mplwidget = QWidget(self) # Create buttons... self.addValue = newButton(self, "+", "Adds a new key: value", (0,0), self.addToDict, click_args=None) self.delValue = newButton(self, "-", "Deletes key: value pair", (0,0), self.delFromDict, click_args=None) # Add a new layout for them. self.mplButtonlayout = QHBoxLayout(self.mplwidget) self.mplButtonwidget = QWidget(self) self.mplButtonwidget.setLayout(self.mplButtonlayout) self.mplButtonlayout.addWidget(self.addValue.button) self.mplButtonlayout.addWidget(self.delValue.button) self.mpllayout.addWidget(self.mplTree.tree) self.mpllayout.addWidget(self.dsetTree.tree) self.mpllayout.addWidget(self.mplButtonwidget) self.mplwidget.setLayout(self.mpllayout) self.mpldock.setWidget(self.mplwidget) # Now the data dock... self.datadock = QDockWidget("Dataset", self) self.datalayout = QVBoxLayout(self.datadock) self.datawidget = QWidget(self) # Create buttons self.loadData = newButton(self, "Load Data", "Adds a new key: value", (640,0), self.loadNewFile, click_args=None) self.sendData = newButton(self, "Plot", "Plot Active Dataset", (640,0), self.dataTree.reassignMplFromHighlightedData, click_args=None) # Label and Combobox self.dsetBox = newComboBox(self, items=range(0, self.mpl_dict['Datasets']), function=None) self.dsetLabel = QLabel() self.dsetLabel.setText("DSet: ") cboxLayout = QHBoxLayout(self.datadock) cboxWidget = QWidget(self) cboxLayout.addWidget(self.dsetLabel) cboxLayout.addWidget(self.dsetBox.comboBox) cboxLayout.addWidget(self.sendData.button) cboxWidget.setLayout(cboxLayout) #self.dataButtonlayout = QHBoxLayout(self.datawidget) #self.dataButtonwidget = QWidget(self) #self.dataButtonwidget.setLayout(self.dataButtonlayout) #self.dataButtonlayout.addWidget(self.loadData.button) #self.dataButtonlayout.addWidget(self.delValue.button) self.datalayout.addWidget(self.dataTree.tree) #self.datalayout.addWidget(self.dataButtonwidget) #self.datalayout.addWidget(self.sendData.button) self.datalayout.addWidget(cboxWidget) self.datalayout.addWidget(self.loadData.button) self.datawidget.setLayout(self.datalayout) self.datadock.setWidget(self.datawidget) # Create the dock, create a new widget, create a layout for that widget, then add all the widgets into that widget, then add that widget to th dock. Ha self.textdock = QDockWidget("", self) self.bwidget = QWidget(self) #self.toolbar = NavigationToolbar(self.dc, self.bwidget) #self.dc.mpl_connect('key_press_event', self.on_key_press) self.blayout = QHBoxLayout(self.textdock) self.blayout.addWidget(self.text.textBox) self.blayout.addWidget(self.save_button.button) self.blayout.addWidget(self.render_button.button) self.blayout.addWidget(self.load_button.button) #self.blayout.addWidget(self.toolbar) #self.bwidget.setMinimumHeight((self.width-self.save_button.button.width(), 30)) #self.text.textBox.setMinimumHeight((10)) self.text.textBox.setMaximumHeight((100)) self.bwidget.resize(400, 30) self.bwidget.setLayout(self.blayout) # Remove title bar. self.textdock.setTitleBarWidget(QWidget()) self.textdock.setWidget(self.bwidget) self.textdock.resize(self.width-self.save_button.button.width(), 30) self.addDockWidget(Qt.LeftDockWidgetArea, self.mpldock) self.addDockWidget(Qt.RightDockWidgetArea, self.datadock) self.addDockWidget(Qt.BottomDockWidgetArea, self.textdock) # Try the scroll! self.scroll = QScrollArea(self.main_widget) #self.scroll.setWidgetResizable(False) self.scroll.setWidgetResizable(True) scrollContent = QWidget(self.scroll) scrollLayout = QVBoxLayout(scrollContent) scrollContent.setLayout(scrollLayout) scrollLayout.addWidget(self.dc) self.scroll.setWidget(scrollContent) self.layout.addWidget(self.scroll) '''self.main_widget.move(250,0) self.main_widget.setGeometry(250, 0, self.width-500, (self.height-25))''' self.main_widget.setLayout(self.layout) #button = self.newButton(self, "Button!", "Nothing", (100,70), self.button_test, click_args=None) testDict = {'0': ['0', '1'], '1': {'A': ['2'], 'B': ['3', '4']}} #def __init__(self, parent, size, pos, init_text=""): #layout.addChildWidget(self.dataTree) self.show() self.dc.update_figure() self.updateFromDict(True) def loadNewFile(self, filename=None): # First, load in the new file. # Then, refresh the widget. self.dataLoader.loadNewFile(filename) self.mpl_dict['FilesToLoad'] = str(self.dataLoader.fileList) self.dataTree.updateTree() self.dataTree.tree.expandToDepth(0) self.mplTree.updateTree() def addToDict(self): try: for i in range(0,99): if 'New: {}'.format(i) not in self.mpl_dict: self.mplTree.addItem(self.mplTree.tree.selectedItems()[0].parent(), ddict=['New: {}'.format(i), None]) break except: for i in range(0,99): if 'New: {}'.format(i) not in self.mpl_dict: self.mplTree.addItem(self.mplTree.tree.topLevelItem(0), ddict=['New: {}'.format(i), None]) break self.mplTree.updateTree() def delFromDict(self): self.mplTree.removeItem(self.mplTree.tree.selectedItems()[0]) def save_figure(self): filename, _ = QFileDialog.getSaveFileName(self, 'Save PDF', os.getcwd()) if filename != '': self.mpl_dict['Active'] = None self.dc.update_figure() self.dc.update_figure() self.dc.fig.savefig(filename) def save_yaml(self): filename, _ = QFileDialog.getSaveFileName(self, 'Save YAML', os.getcwd()) if filename != '': save_dict = remove_trees(self.mpl_dict) save_dict['FilesToLoad'] = ast.literal_eval(save_dict['FilesToLoad']) with open(filename, 'w') as outfile: yaml.dump(save_dict, outfile, default_flow_style=False) def load_yaml(self, default='src/default.yaml'): test = yaml.load(open(default, 'r')) #if test != None: # We want to push a lot of this to later. self.mpl_dict.update(copy.deepcopy(test)) self.mpl_dict['Update'] = True self.mpl_dict['Active'] = (0,0) #print(ast.literal_eval(self.mpl_dict['FilesToLoad'])) for f in self.mpl_dict['FilesToLoad']: print(f) try: # Does seem to work. self.loadNewFile(f) # Remove the item, as it automatically loads it right now. self.mpl_dict['FilesToLoad'] = self.mpl_dict['FilesToLoad'] except: # We failed. pass #self.mplTree.tree.clear() #self.dataTree.tree.clear() #self.mplTree.data = self.mpl_dict #self.dataTree.parent.mpl_dict = self.mpl_dict #self.dc.parent.mpl_dict = self.mpl_dict #self.refreshWidgets(new=True) def notify(self, text): self.text.showText(str(text)) def refreshWidgets(self, new=False): self.mplTree.parent.mpl_dict = self.mpl_dict self.dataTree.parent.mpl_dict = self.mpl_dict self.dc.parent.mpl_dict = self.mpl_dict self.dsetTree.tree.clear() #if 'keyTree' not in self.mpl_dict['Figures'][str(self.mpl_dict['Active'])]: # Actually, we basically always need to blow this away. self.mpl_dict['Figures'][str(self.mpl_dict['Active'])]['keyTree'] = {} self.dsetTree.data = self.mpl_dict['Figures'].get(str(self.mpl_dict['Active'])) self.dsetTree.activeDset = str(self.mpl_dict['Active']) self.dsetBox.reInit(range(0, int(self.mpl_dict['Datasets']))) if self.mpl_dict['Active'] is not None: self.dc.setOpenDSet(self.mpl_dict['Active']) self.dsetBox.comboBox.setCurrentIndex(self.dsetBox.comboBox.findText(str(self.mpl_dict['ActiveDSet']))) self.mplTree.updateTree(new) #self.dataTree.updateTree(new) # It does need to be cleared, but we should try and open the parent item. self.dsetTree.updateTree(new) # Neat bit of kit that expands stuff out to the first level. # Useful for this tree. #self.dsetTree.tree.expandToDepth(0) # Well, it no longer seems to die, but. # If we want to update this, we're going to have to call a clear function. #self.dataTree.updateTree(new) self.dc.update_figure() #pass def updateFromDict(self, defaults=False, firstrun=False, updatedKeys=None): d = self.mpl_dict # Update the comboBox for rows in range(0, int(self.mpl_dict['Rows'])): for cols in range(0, int(self.mpl_dict['Columns'])): if not defaults: # If we haven't changed the defaults, don't upstate the state. if str((rows, cols)) not in self.mpl_dict['Figures']: new_dict = {} for key, val in self.mpl_dict['FigDefaults'].items(): new_dict[key] = val self.mpl_dict['Figures'][str((rows,cols))] = copy.deepcopy(new_dict) for dset in range(0, int(self.mpl_dict['Datasets'])): if str(dset) not in self.mpl_dict['Figures'][str((rows,cols))]['data']: new_dict = {} for key, val in self.mpl_dict['DSetDefaults'].items(): new_dict[key] = val self.mpl_dict['Figures'][str((rows,cols))]['data'][str(dset)] = copy.deepcopy(new_dict) # Here, we're updating the defaults. else: # Here, we're updating from the defaults. Necessary for the first time. new_dict = {} for key, val in self.mpl_dict['FigDefaults'].items(): if updatedKeys == None: new_dict[key] = copy.deepcopy(val) else: for uKey in updatedKeys: if key == uKey: new_dict[key] = copy.deepcopy(val) else: new_dict[key] = copy.deepcopy(self.mpl_dict['Figures'][str((rows,cols))][key]) self.mpl_dict['Figures'][str((rows,cols))] = new_dict self.mpl_dict['Figures'][str((rows,cols))]['Update'] = True for dset in range(0, int(self.mpl_dict['Datasets'])): new_dict = {} for key, val in self.mpl_dict['DSetDefaults'].items(): if updatedKeys == None: new_dict[key] = copy.deepcopy(val) else: for uKey in updatedKeys: if key == uKey: new_dict[key] = copy.deepcopy(val) else: new_dict[key] = copy.deepcopy(self.mpl_dict['Figures'][str((rows,cols))]['data'][str(dset)][key]) # We don't really want to create new keys, so. tree_dict = {} self.mpl_dict['Figures'][str((rows,cols))]['data'][str(dset)] = copy.deepcopy(new_dict) # Throw in the axes object. #self.dc.update_figure(defaults) if not firstrun: self.refreshWidgets(new=defaults) def keyPressEvent(self, e): # This is our key press handler. It's mostly just a stub right now. if e.key() == QtCore.Qt.Key_Escape: self.close()
class FROG(QMainWindow) : isrunning=QtCore.pyqtSignal(bool) def __init__(self,parent=None): super().__init__(parent) self.confFrog=QtCore.QSettings('confFrog.ini', QtCore.QSettings.IniFormat) p = pathlib.Path(__file__) sepa=os.sep self.icon=str(p.parent) + sepa+'icons'+sepa self.setWindowIcon(QIcon(self.icon+'LOA.png')) self.left=30 self.top=30 self.width=1200 self.height=750 self.setGeometry(self.left,self.top,self.width,self.height) self.iconPlay=self.icon+'Play.png' self.iconSnap=self.icon+'Snap.png' self.iconStop=self.icon+'Stop.png' self.iconBg=self.icon+'coin.png' self.iconPlay=pathlib.Path(self.iconPlay) self.iconPlay=pathlib.PurePosixPath(self.iconPlay) self.iconStop=pathlib.Path(self.iconStop) self.iconStop=pathlib.PurePosixPath(self.iconStop) self.iconSnap=pathlib.Path(self.iconSnap) self.iconSnap=pathlib.PurePosixPath(self.iconSnap) self.iconBg=pathlib.Path(self.iconBg) self.iconBg=pathlib.PurePosixPath(self.iconBg) self.setWindowIcon(QIcon(self.icon+'LOA.png')) self.setWindowTitle('FROG ') self.motorName="moteurTest"#"Moteur0A" self.motorType='MotorTest'#"A2V" self.configPath="./fichiersConfig/" self.configMotName='configMoteurTest.ini'#'configMoteurA2V.ini' self.confpath=str(p.parent) + sepa # print('confpath',self.confpath) self.bg=0 self.motor=ONEMOTOR(mot0=self.motorName,motorTypeName0=self.motorType,unit=3,jogValue=1) self.motor.startThread2() MOT=self.motor.MOT self.scanWidget=SCAN(MOT=MOT,motor=self.motorName,configMotName=self.configPath+self.configMotName) # for the scan) listdevice=list_devices() ## open device flame spectrometer try : self.spectrometer=Spectrometer(listdevice[0]) sh=int(self.confFrog.value('VISU'+'/shutter')) try: self.spectrometer.integration_time_micros(sh*1000) # en micro except: self.spectrometer.integration_time_micros(100*1000) except : self.spectrometer=[] msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setText("Error connexion Spectrometer") msg.setInformativeText("Try to reconnect the USB or resart the program") msg.setWindowTitle("Spectrometer not connected...") msg.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) msg.exec_() pass print('__________ F R O G __________') print('') print(' Version : ',version) print(" Spectrometer connected @ ",self.spectrometer) self.wavelengths=self.spectrometer.wavelengths() # array Wavelengths of the spectrometer print(" Wavelength : " ,self.wavelengths.min(),self.wavelengths.max()) print(' Motor name: ',self.motorName,' Type: ',self.motorType) print('') self.MatData=[] self.MatFs=[] self.position=0 self.moyenne=1 self.nbShot=1 self.row=0 self.setup() self.actionButton() def setup(self): hbox1=QHBoxLayout() # horizontal layout pour run snap stop self.sizebuttonMax=30 self.sizebuttonMin=30 self.runButton=QToolButton(self) self.runButton.setMaximumWidth(self.sizebuttonMax) self.runButton.setMinimumWidth(self.sizebuttonMax) self.runButton.setMaximumHeight(self.sizebuttonMax) self.runButton.setMinimumHeight(self.sizebuttonMax) self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconPlay,self.iconPlay) ) self.runButton.setToolTip("Free Run") self.snapButton=QToolButton(self) self.snapButton.setPopupMode(0) menu=QMenu() # menu.addAction('acq',self.oneImage) menu.addAction('set nb of shot',self.nbShotAction) self.snapButton.setMenu(menu) self.snapButton.setMaximumWidth(self.sizebuttonMax) self.snapButton.setMinimumWidth(self.sizebuttonMax) self.snapButton.setMaximumHeight(self.sizebuttonMax) self.snapButton.setMinimumHeight(self.sizebuttonMax) self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconSnap,self.iconSnap) ) self.snapButton.setToolTip("Snap") self.stopButton=QToolButton(self) self.stopButton.setMaximumWidth(self.sizebuttonMax) self.stopButton.setMinimumWidth(self.sizebuttonMax) self.stopButton.setMaximumHeight(self.sizebuttonMax) self.stopButton.setMinimumHeight(self.sizebuttonMax) self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconStop,self.iconStop) ) self.stopButton.setEnabled(False) self.stopButton.setToolTip("Stop Acquisition") self.bgButton=QToolButton(self) self.bgButton.setMaximumWidth(self.sizebuttonMax) self.bgButton.setMinimumWidth(self.sizebuttonMax) self.bgButton.setMaximumHeight(self.sizebuttonMax) self.bgButton.setMinimumHeight(self.sizebuttonMax) self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"% (self.iconBg,self.iconBg) ) self.bgButton.setToolTip("Take a Background") self.bgLayout=QHBoxLayout() self.bgLayout.setContentsMargins(0,0,0,0) self.bgLabel=QLabel('Background :') self.bgLabel.setStyleSheet('font :bold 8pt') self.bgSoustract=QCheckBox() self.bgSoustract.setToolTip("Background Soustraction (On/Off)") self.bgLayout.addWidget(self.bgLabel) self.bgLayout.addWidget(self.bgSoustract) hbox1.addWidget(self.runButton) hbox1.addWidget(self.snapButton) hbox1.addWidget(self.stopButton) hbox1.addWidget(self.bgButton) hbox1.addLayout(self.bgLayout) hbox1.setSizeConstraint(QtGui.QLayout.SetFixedSize) hbox1.setContentsMargins(5, 24, 0, 10) self.widgetControl=QWidget(self) self.widgetControl.setLayout(hbox1) self.dockControl=QDockWidget(self) self.dockControl.setWidget(self.widgetControl) self.dockControl.resize(80,80) self.trigg=QComboBox() self.trigg.setMaximumWidth(80) self.trigg.addItem('OFF') self.trigg.addItem('ON') self.trigg.setStyleSheet('font :bold 8pt;color: white') self.labelTrigger=QLabel('Trig') self.labelTrigger.setMaximumWidth(80) self.labelTrigger.setStyleSheet('font :bold 12pt') self.itrig=self.trigg.currentIndex() hbox2=QHBoxLayout() hbox2.setSizeConstraint(QtGui.QLayout.SetFixedSize) hbox2.setContentsMargins(5, 26, 0, 0) hbox2.addWidget(self.labelTrigger) hbox2.addWidget(self.trigg) self.widgetTrig=QWidget(self) self.widgetTrig.setLayout(hbox2) self.dockTrig=QDockWidget(self) self.dockTrig.setWidget(self.widgetTrig) self.labelExp=QLabel('Exposure (ms)') self.labelExp.setStyleSheet('font :bold 10pt') self.labelExp.setMaximumWidth(500) self.labelExp.setAlignment(Qt.AlignCenter) self.hSliderShutter=QSlider(Qt.Horizontal) self.hSliderShutter.setMaximumWidth(80) self.hSliderShutter.setValue(int(self.confFrog.value('VISU'+'/shutter'))) self.shutterBox=QSpinBox() self.shutterBox.setStyleSheet('font :bold 8pt') self.shutterBox.setMaximumWidth(200) self.hSliderShutter.setMaximum(1100) self.shutterBox.setMaximum(1100) self.shutterBox.setValue(int(self.confFrog.value('VISU'+'/shutter'))) hboxShutter=QHBoxLayout() hboxShutter.setContentsMargins(5, 0, 0, 0) hboxShutter.setSpacing(10) vboxShutter=QVBoxLayout() vboxShutter.setSpacing(0) vboxShutter.addWidget(self.labelExp)#,Qt.AlignLef) hboxShutter.addWidget(self.hSliderShutter) hboxShutter.addWidget(self.shutterBox) vboxShutter.addLayout(hboxShutter) vboxShutter.setSizeConstraint(QtGui.QLayout.SetFixedSize) vboxShutter.setContentsMargins(5, 5, 0, 0) self.widgetShutter=QWidget(self) self.widgetShutter.setLayout(vboxShutter) self.dockShutter=QDockWidget(self) self.dockShutter.setWidget(self.widgetShutter) self.labelMoy=QLabel('Average') self.labelMoy.setStyleSheet('font :bold 10pt') self.labelMoy.setMaximumWidth(120) self.labelMoy.setAlignment(Qt.AlignCenter) self.moyBox=QSpinBox() self.moyBox.setMaximumWidth(60) self.moyBox.setStyleSheet('font :bold 8pt') self.moyBox.setMaximum(100) self.moyBox.setValue(1) hboxMoy=QHBoxLayout() hboxMoy.addWidget(self.labelMoy) hboxMoy.addWidget(self.moyBox) hboxMoy.setSpacing(1) hboxMoy.setContentsMargins(5, 17, 200, 0) hbox2Moy=QHBoxLayout() hbox2Moy.addLayout(hboxMoy) hbox2Moy.setSizeConstraint(QtGui.QLayout.SetFixedSize) self.widgetMoy=QWidget(self) self.widgetMoy.setLayout(hbox2Moy) self.dockMoy=QDockWidget(self) self.dockMoy.setWidget(self.widgetMoy) self.graph=GRAPHCUT(symbol=None,title='Spectra',pen='w',label='Wavelenght (nm)',labelY='int') self.widgetRange=self.graph.widgetRange self.widgetRange.labelXmin.setText("Wavelenght(nm) Min ") self.widgetRange.labelXmax.setText("Wavelenght(nm) Max ") self.dockControl.setTitleBarWidget(QWidget()) # to ovoid title self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockControl) self.dockTrig.setTitleBarWidget(QWidget()) self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockTrig) self.dockShutter.setTitleBarWidget(QWidget()) self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockShutter) self.dockMoy.setTitleBarWidget(QWidget()) self.graph.addDockWidget(Qt.TopDockWidgetArea,self.dockMoy) self.hbox=QHBoxLayout() self.hbox.addWidget(self.graph) self.vLatBox=QVBoxLayout() # hboxRange=QHBoxLayout() # hboxRange.setAlignment(Qt.AlignCenter) # labelRange=QLabel('Range') # labelRange.setStyleSheet("font: bold 20pt;color:white") # hboxRange.addWidget(labelRange) # self.vLatBox.addLayout(hboxRange) self.vLatBox.addWidget(self.widgetRange) self.vLatBox.addStretch(0) self.vLatBox.addWidget(self.motor) self.vLatBox.addStretch(0) self.vLatBox.addWidget(self.scanWidget) # self.vLatBox.setContentsMargins(0,0,0,0) # self.vLatBox.setStretch(5,0) self.hbox.addLayout(self.vLatBox) self.hbox.setStretch(0, 3) #self.scanWidget.setStyleSheet('border-color:w') WidgetSpectro=QWidget() WidgetSpectro.setLayout(self.hbox) self.tabs=QTabWidget() self.tab0=WidgetSpectro self.tabs.addTab(self.tab0,' Spectro & Motors ') self.WidgetResult=SEERESULT(confpath=self.confpath+'confFrog.ini') # graph 2D data vs motor position # self.hresultLayout=QHBoxLayout() # # self.hresultLayout.addWidget(self.visualisation) # WidgetResult.setLayout(self.hresultLayout) self.tab1=self.WidgetResult self.tabs.addTab(self.tab1,' Results ') self.setCentralWidget(self.tabs) self.threadOneAcq=ThreadOneAcq(self) self.threadOneAcq.newDataRun.connect(self.newImageReceived)#,QtCore.Qt.DirectConnection) self.threadOneAcq.newStateCam.connect(self.stateCam) self.threadRunAcq=ThreadRunAcq(self) self.threadRunAcq.newDataRun.connect(self.newImageReceived) self.threadBgAcq=THREADBGACQ(self) self.threadBgAcq.newDataRun.connect(self.newBgReceived) self.threadBgAcq.newStateCam.connect(self.stateCam) def actionButton(self): '''action when button are pressed ''' self.runButton.clicked.connect(self.acquireMultiImage) self.snapButton.clicked.connect(self.acquireOneImage) self.stopButton.clicked.connect(self.stopAcq) self.bgButton.clicked.connect(self.bgAcq) self.shutterBox.editingFinished.connect(self.shutter) self.hSliderShutter.sliderReleased.connect(self.mSliderShutter) self.moyBox.editingFinished.connect(self.MoyenneAct) self.scanWidget.acqMain.connect(self.acquireScan) self.scanWidget.scanStop.connect(self.endScan) self.scanWidget.startOn.connect(self.ResetData) # self.trigg.currentIndexChanged.connect(self.trigger) def MoyenneAct(self): self.moyenne=(self.moyBox.value()) self.scanWidget.val_time.setValue(0.2+self.moyenne*self.shutterBox.value()/1000) #print(self.moyenne) def ResetData(self): ##◙ reset data when scan start self.MatData=[] self.MatFs=[] # print('reset DATMAT') def shutter (self): ''' set exposure time ''' sh=self.shutterBox.value() # self.hSliderShutter.setValue(sh) # set value of slider time.sleep(0.1) self.spectrometer.integration_time_micros(sh*1000) # en micro # print(sh) self.confFrog.setValue('VISU'+'/shutter',sh) self.MoyenneAct() def mSliderShutter(self): # for shutter slider sh=self.hSliderShutter.value() self.shutterBox.setValue(sh) # self.spectrometer.integration_time_micros(sh*1000) self.confFrog.setValue('VISU'+'/shutter',sh) def acquireMultiImage(self): ''' start the acquisition thread ''' self.runButton.setEnabled(False) self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconSnap,self.iconSnap)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) ) self.trigg.setEnabled(False) self.bgButton.setEnabled(False) self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg)) self.threadRunAcq.newRun() # to set stopRunAcq=False self.threadRunAcq.start() self.camIsRunnig=True def acquireScan(self,pos,nbShoot): #acquire on image with scan program self.scanWidget.AcqRunning(acqRunning=True) self.nbShoot=nbShoot # numero du shoot self.acquireOneImage() self.position=pos # on recupere la valeur de la postion moteur a chaque acquisition def acquireOneImage(self): '''Start on acquisition ''' # print('acquire on image spectro') self.imageReceived=False self.runButton.setEnabled(False) self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}"%(self.iconSnap,self.iconSnap)) self.bgButton.setEnabled(False) self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) ) self.trigg.setEnabled(False) self.camIsRunnig=True self.threadOneAcq.newRun() # to set stopRunAcq=False self.threadOneAcq.start() def bgAcq(self): self.runButton.setEnabled(False) self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}"%(self.iconSnap,self.iconSnap)) self.bgButton.setEnabled(False) self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) ) self.trigg.setEnabled(False) self.camIsRunnig=True self.threadBgAcq.newRun() self.threadBgAcq.start() def endScan (self): # at the end of the scan we plot MatData( 2d matrix of specta) vs MatFs (vector of the position of the motor) self.MatDataNumpy=np.array(self.MatData) self.MatFsNumpy=np.array(self.MatFs) self.wavelengths=np.array(self.wavelengths) self.WidgetResult.newDataReceived(self.MatDataNumpy,axisX=self.MatFsNumpy,axisY=self.wavelengths) print(' ') print(' ') print(' ___RESULTS___') print(' dim matrice result :',self.MatDataNumpy.shape) print(' dim matrice fs :',len(self.MatFsNumpy)) print(' dim matrice wavelengths : ',len(self.wavelengths)) print(' ') print(' ') #self.MatFs=[] self.tabs.setCurrentIndex(1) self.stopAcq() def stateCam(self,state): self.camIsRunnig=state def newBgReceived(self,data): self.bg=data self.bgSoustract.setChecked(True) if self.camIsRunnig is False: self.stopAcq() def newImageReceived(self,data): if self.bgSoustract.isChecked(): self.data=data-self.bg else : self.data=data self.graph.PLOT(self.data,axis=self.wavelengths) # self.MatData=np.append(self.MatData,self.data) self.MatData.append(self.data) # print(self.position) self.MatFs.append(self.position) self.scanWidget.AcqRunning(acqRunning=False) if self.camIsRunnig is False: self.stopAcq() def nbShotAction(self): ''' number of snapShot ''' nbShot, ok=QInputDialog.getInt(self,'Number of SnapShot ','Enter the number of snapShot ') if ok: self.nbShot=int(nbShot) if self.nbShot<=0: self.nbShot=1 def stopAcq(self): '''Stop acquisition ''' self.runButton.setEnabled(True) self.runButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconPlay,self.iconPlay)) self.snapButton.setEnabled(True) self.snapButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconSnap,self.iconSnap)) self.bgButton.setEnabled(True) self.bgButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconBg,self.iconBg)) self.stopButton.setEnabled(False) self.stopButton.setStyleSheet("QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}""QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}"%(self.iconStop,self.iconStop) ) self.trigg.setEnabled(True) self.threadRunAcq.stopThreadRunAcq() def closeEvent(self,event): # when the window is closed # to do close motor and spectro print('close')
class mainWindow(QMainWindow): def __init__(self): super(mainWindow, self).__init__() self.__image = None # SimpleITK.Image self.__grade = None # Numpy array with shape [num_slice, num_class] self.child_stat = statAnalyzeWidget() self.cls_SVC = clsABWidget(ifSVC=True) self.cls_Logi = clsABWidget(ifSVC=False) self.statusBar().showMessage('Initializing UI...') self.initUI() self.statusBar().showMessage('Initializing Core...') self.main = mainLogic() self.statusBar().showMessage('Initializing Signal...') self.initSignals() self.statusBar().showMessage('Ready') def initUI(self): self.setWindowTitle('Radiomics System') screenGeometry = QApplication.desktop().screenGeometry() aspectRatio = 4 / 3.0 blockLen = min(screenGeometry.width()/aspectRatio, \ screenGeometry.height()) self.resize(blockLen * aspectRatio, blockLen) #qr = self.frameGeometry() #cp = QDesktopWidget().availableGeometry().center() #qr.moveCenter(cp) #self.move(qr.topLeft()) self.initUI_Menubar() self.initUI_Toolbar() self.initUI_ContextMenu() self.initUI_Layout() self.show() def initUI_Menubar(self): menubar = self.menuBar() self.menuLoad = menubar.addMenu('Load') # self.menutools = QMenu(menubar) # self.menutools.setObjectName("menutools") self.menuImage = self.menuLoad.addMenu('Image') self.menuROI = self.menuLoad.addMenu('ROI') # self.menuload.setObjectName("menuload") self.actionimagedir = QAction('DICOM DIR', self) self.actionimagedir.triggered.connect(self.actLoadImgDir) self.actionimagefiles = QAction('NIfTI File', self) self.actionimagefiles.triggered.connect(self.actLoadStudy) self.actionROIdir = QAction('DICOM DIR', self) self.actionROIdir.triggered.connect(self.actLoadROIDir) self.actionROIfiles = QAction('NIfTI File', self) self.actionROIfiles.triggered.connect(self.actLoadROI) self.menuImage.addAction(self.actionimagedir) self.menuImage.addAction(self.actionimagefiles) self.menuROI.addAction(self.actionROIdir) self.menuROI.addAction(self.actionROIfiles) self.menuSave = menubar.addMenu('Save') self.actionSaveImg = QAction('Image', self) self.actionSaveImg.triggered.connect(self.actSaveImg) self.actionSaveSelROI = QAction('Selected ROI', self) self.actionSaveSelROI.triggered.connect(self.actSaveSelROI) self.actionSaveAllROI = QAction('All ROI', self) self.actionSaveAllROI.triggered.connect(self.actSaveAllROI) self.menuSave.addAction(self.actionSaveImg) self.menuSave.addAction(self.actionSaveSelROI) self.menuSave.addAction(self.actionSaveAllROI) self.menuRadiomics = menubar.addMenu('Radiomics') self.menuExt = self.menuRadiomics.addMenu('Feature Extraction') self.actionPyExt = QAction('PyRadiomics', self) self.actionPyExt.triggered.connect(self.actFeatureExt) self.actionCuExt = QAction('cuRadiomics(2D only)', self) self.actionCuExt.triggered.connect(self.actCuFeatureExt) self.menuExt.addAction(self.actionPyExt) self.menuExt.addAction(self.actionCuExt) self.actionFeatSel = QAction('Feature Selection', self) self.actionFeatSel.triggered.connect(self.child_stat.show) self.menuRadiomics.addAction(self.actionFeatSel) LogiRegAct = QAction('Logit Regression', self) LogiRegAct.triggered.connect(self.cls_Logi.show) SVCAct = QAction('Support Vector Classification', self) SVCAct.triggered.connect(self.cls_SVC.show) menubar = self.menuBar() fileMenu = menubar.addMenu('Classification') fileMenu.addAction(LogiRegAct) fileMenu.addAction(SVCAct) DenoiseAct = QAction('Wavelet Denoise', self) DenoiseAct.triggered.connect(self.actDenoise) ThredAct = QAction('Threshold Seg', self) ThredAct.triggered.connect(self.actThreshold) GasSmoothAct = QAction('Guassian Smooth', self) GasSmoothAct.triggered.connect(self.actGasSmooth) MeanSmoothAct = QAction('Mean Smooth', self) MeanSmoothAct.triggered.connect(self.actMeanSmooth) MedSmoothAct = QAction('Median Smooth', self) MedSmoothAct.triggered.connect(self.actMedSmooth) ResampleAct = QAction('Resample', self) ResampleAct.triggered.connect(self.actResample) menubar = self.menuBar() fileMenu = menubar.addMenu('Pre-processing') fileMenu.addAction(DenoiseAct) fileMenu.addAction(ThredAct) fileMenu.addAction(GasSmoothAct) fileMenu.addAction(MeanSmoothAct) fileMenu.addAction(MedSmoothAct) fileMenu.addAction(ResampleAct) SRAct = QAction('Super Resolution', self) SRAct.triggered.connect(self.actGetSR) DPSegAct = QAction('Segmentation', self) DPSegAct.triggered.connect(self.actDPSeg) segbar = self.menuBar() segMenu = segbar.addMenu('Deep Learning') segMenu.addAction(SRAct) segMenu.addAction(DPSegAct) #loadStudyAct = QAction('Load Dicom Study', self) #fileMenu.addAction(loadStudyAct) #exitAct = QAction('Quit', self) #exitAct.triggered.connect(qApp.quit) #fileMenu.addAction(exitAct) def initUI_Toolbar(self): pass def initUI_ContextMenu(self): pass def initUI_Layout(self): self.volumeViewer = volumeViewerWidget(self) self.FeatureDisp = featureDispWidget(self) self.dicomInfo = dicomInfoWidget(self) # self.controlPanel = controlPannelWidget(self) self.annotationPanel = annotationPannelWidget(self) #self.FeatureSel = featureSelWidget(self) #self.gradeDisp = gradeDispWidget(self) # self.refViewer = curveWidget(self) self.SRViewer = volumeViewerWidget(self) colormap = (plt.cm.bwr(np.array( \ list([x for x in range(256)]), dtype=np.uint8 \ ))*255).astype(np.uint8).reshape(256,1,4) #RGBA colormap[:, 0, 3] = list(range(255, 0, -2)) + list(range(1, 256, 2)) # dock and central widget # volumeViewer self.setCentralWidget(self.volumeViewer) # dicomInfo self.dockDicomInfo = QDockWidget("DICOM Info", self) self.dockDicomInfo.setObjectName("dockDicomInfo") self.addDockWidget(Qt.RightDockWidgetArea, self.dockDicomInfo) self.dockDicomInfo.setWidget(self.dicomInfo) # FeatureExtract self.dockFeatureDisp = QDockWidget("Extracted Feature", self) self.dockFeatureDisp.setObjectName("dockFeatureDisp") self.addDockWidget(Qt.RightDockWidgetArea, self.dockFeatureDisp) self.dockFeatureDisp.setWidget(self.FeatureDisp) self.tabifyDockWidget(self.dockDicomInfo, self.dockFeatureDisp) # Annoation self.dockAnnotation = QDockWidget("Annotation Tools", self) self.dockAnnotation.setObjectName("dockAnnotation") self.addDockWidget(Qt.RightDockWidgetArea, self.dockAnnotation) self.dockAnnotation.setWidget(self.annotationPanel) self.dockAnnotation.showMinimized() self.resizeDocks([self.dockAnnotation, self.dockFeatureDisp], \ [1,10], Qt.Vertical) # self.tabifyDockWidget(self.dockAnnotation, self.dockFeatureDisp) # controlPanel # self.dockControlPanel = QDockWidget("Control Panel", self) # self.dockControlPanel.setObjectName("dockControlPanel") # self.addDockWidget(Qt.RightDockWidgetArea, self.dockControlPanel) # self.dockControlPanel.setWidget(self.controlPanel) # self.dockControlPanel.showMinimized() # self.resizeDocks([self.dockControlPanel, self.dockFeatureDisp], \ # [1,10], Qt.Vertical) # FeatureSelection # self.dockFeatureSel = QDockWidget("Selected Feature", self) # self.dockFeatureSel.setObjectName("dockFeatureSel") # self.addDockWidget(Qt.RightDockWidgetArea, self.dockFeatureSel) # self.dockFeatureSel.setWidget(self.FeatureSel) # self.tabifyDockWidget(self.dockFeatureDisp, self.dockFeatureSel) # # gradeDisp # self.dockGradeDisp = QDockWidget("Grade (Prediction)", self) # self.dockGradeDisp.setObjectName("dockGradeDisp") # self.addDockWidget(Qt.RightDockWidgetArea, self.dockGradeDisp) # self.dockGradeDisp.setWidget(self.gradeDisp) # self.tabifyDockWidget(self.dockDicomInfo, self.dockGradeDisp) # reference image and SR image # self.dockRefViewer = QDockWidget("Reference", self) # self.dockRefViewer.setObjectName("dockRefViewer") # self.addDockWidget(Qt.LeftDockWidgetArea, self.dockRefViewer) # self.dockRefViewer.setWidget(self.refViewer) # self.dockRefViewer.setFloating(True) # self.dockRefViewer.setVisible(False) self.dockSRViewer = QDockWidget("Super-Resolution", self) self.dockSRViewer.setObjectName("dockSRViewer") self.addDockWidget(Qt.LeftDockWidgetArea, self.dockSRViewer) self.dockSRViewer.setWidget(self.SRViewer) self.dockSRViewer.setFloating(True) self.dockSRViewer.setVisible(False) def initSignals(self): # self.controlPanel.btnLoad.clicked.connect(self.actLoadStudy) # self.controlPanel.btnROI.clicked.connect(self.actLoadROI) # self.controlPanel.btnExt.clicked.connect(self.actFeatureExt) # self.controlPanel.btnSel.clicked.connect(self.child_stat.show) self.annotationPanel.btnDoAnn.clicked.connect(self.actDoAnn) self.annotationPanel.btnDoAnn.setIcon( QIcon("./qdarkstyle/polygon.png")) self.annotationPanel.btnPoly.clicked.connect(self.actSetPoly) self.annotationPanel.btnPoly.setIcon( (QIcon("./qdarkstyle/polygon.png"))) # self.annotationPanel.btnPoly.setStyleSheet("QPushButton{border-image: url(./qdarkstyle/polygon.png)}") self.annotationPanel.btnCircle.clicked.connect(self.actSetCircle) self.annotationPanel.btnCircle.setIcon( (QIcon("./qdarkstyle/circle.png"))) # self.annotationPanel.btnTri.clicked.connect(self.actSetTri) # self.annotationPanel.btnTri.setIcon((QIcon("./qdarkstyle/tri.png"))) self.annotationPanel.btnJux.clicked.connect(self.actSetJux) self.annotationPanel.btnJux.setIcon((QIcon("./qdarkstyle/juxing.png"))) # childBoxGeo.addWidget(self.btnPoly) # childBoxGeo.addWidget(self.btnCircle) # childBoxGeo.addWidget(self.btnTri) # childBoxGeo.addWidget(self.btnJux) self.annotationPanel.btnAccROI.clicked.connect(self.actAccROI) self.annotationPanel.btnClrSelROI.clicked.connect(self.actClrSelROI) self.annotationPanel.btnClrAllROI.clicked.connect(self.actClrAllROI) # self.annotationPanel.btnSaveSelROI.clicked.connect(self.actSaveSelROI) # self.annotationPanel.btnSaveAllROI.clicked.connect(self.actSaveAllROI) # self.controlPanel.btnCla.clicked.connect(self.actGetGrade) # self.controlPanel.btnSeg.clicked.connect(self.actGetSeg) # self.controlPanel.btnRef.clicked.connect(self.actGetReference) # self.controlPanel.btnSR.clicked.connect(self.actGetSR) #self.volumeViewer.sliderIndex.valueChanged.connect( \ # lambda x: self.refViewer.setIndex(x-1)) self.FeatureDisp.cellPressed.connect( \ lambda row, col: self.volumeViewer.sliderIndex.setValue(row+1)) def actSetPoly(self): self.__type = 'Poly' self.actDoAnn() return def actSetCircle(self): self.__type = 'Circle' self.actDoAnn() return # def actSetTri(self): # self.__type ='Tri' # self.actDoAnn() # return def actSetJux(self): self.__type = 'Jux' self.actDoAnn() return def actDoAnn(self): if self.annotationPanel.rbS.isChecked() == True: self.volumeViewer.setROI(ax='S', type=self.__type) if self.annotationPanel.rbA.isChecked() == True: self.volumeViewer.setROI(ax='A', type=self.__type) if self.annotationPanel.rbC.isChecked() == True: self.volumeViewer.setROI(ax='C', type=self.__type) return def actAccROI(self): # labelArr=self.volumeViewer.accROI() # print(np.unique(labelArr)) # print(labelArr.dtype) self.main.setROI(self.volumeViewer.accROI()) # self.volumeViewer.setLabel(ROI) return def actSaveSelROI(self): self.volumeViewer.saveSelROI() return def actSaveAllROI(self): self.volumeViewer.saveAllROI() return def actClrSelROI(self): self.volumeViewer.clrSelROI() return def actClrAllROI(self): self.volumeViewer.clrAllROI() return def actDenoise(self): self.volumeViewer.denoise() return def actGasSmooth(self): self.volumeViewer.setPreprocessMethod(method='Gaussian') return def actMeanSmooth(self): self.volumeViewer.setPreprocessMethod(method='Mean') return def actMedSmooth(self): self.volumeViewer.setPreprocessMethod(method='Median') return def actResample(self): self.volumeViewer.setPreprocessMethod(method='Resample') return def actThreshold(self): self.volumeViewer.setSegMethod(method='Threshold') return def actDPSeg(self): pass @pyqtSlot() def actLoadImgDir(self, directory=None): start = time.time() self.statusBar().showMessage('Loading Study...') if directory is None: dialog = QFileDialog(self) dialog.setFileMode(QFileDialog.DirectoryOnly) dialog.setViewMode(QFileDialog.List) dialog.setOption(QFileDialog.ShowDirsOnly, True) if dialog.exec_(): directory = str(dialog.selectedFiles()[0]) else: self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return try: images = ReadSagittalPDs(directory) except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return selectDialog = dicomSelectDialog(images) if selectDialog.exec_(): image = images[selectDialog.selectedIndex] else: self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return # get image data # image_out = sitk.GetImageFromArray(sitk.GetArrayFromImage(image)) # # # setup other image characteristics # image_out.SetOrigin(image.GetOrigin()) # image_out.SetSpacing(image.GetSpacing()) # # set to RAI # image_out.SetDirection(tuple(-0.0, 0.0, -1.0, 1.0, -0.0, 0.0, 0.0, -1.0, 0.0)) # # sitk.WriteImage(image_out, 'test.mha') # image = image_out self.main.setImage(image) self.volumeViewer.setImage(image) self.dicomInfo.setImage(image) self.dockDicomInfo.setVisible(True) # self.dockRefViewer.setVisible(False) self.dockSRViewer.setVisible(False) # self.gradeDisp.setGrade(None) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return def actLoadStudy(self, directory=None): start = time.time() self.statusBar().showMessage('Loading Study...') directory = QFileDialog.getOpenFileName(self, "Select one file to open", "./", "Files (*.nii *.dcm)") print(directory) directory = str(directory[0]) #if directory is None: #dialog = QFileDialog(self) # dialog.setFileMode(QFileDialog.DirectoryOnly) # dialog.setViewMode(QFileDialog.List) # dialog.setOption(QFileDialog.ShowDirsOnly, True) # if dialog.exec_(): # directory = str(dialog.selectedFiles()[0]) # else: # self.statusBar().showMessage( \ # 'Ready ({:.2f}s)'.format(time.time() - start)) # return try: #images = ReadSagittalPDs(directory) image = ReadImage(directory) except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return # selectDialog = dicomSelectDialog(images) # if selectDialog.exec_(): # image = images[selectDialog.selectedIndex] # else: # self.statusBar().showMessage( \ # 'Ready ({:.2f}s)'.format(time.time() - start)) # return self.main.setImage(image) self.volumeViewer.setImage(image) self.dicomInfo.setImage(image) self.dockDicomInfo.setVisible(True) # self.dockRefViewer.setVisible(False) self.dockSRViewer.setVisible(False) # self.gradeDisp.setGrade(None) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return def actLoadROIDir(self, directory=None): start = time.time() self.statusBar().showMessage('Loading Study...') if directory is None: dialog = QFileDialog(self) dialog.setFileMode(QFileDialog.DirectoryOnly) dialog.setViewMode(QFileDialog.List) dialog.setOption(QFileDialog.ShowDirsOnly, True) if dialog.exec_(): directory = str(dialog.selectedFiles()[0]) else: self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return try: ROIs = ReadSagittalPDs(directory) except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return selectDialog = dicomSelectDialog(images) if selectDialog.exec_(): ROI = ROIs[selectDialog.selectedIndex] else: self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.main.setROI(ROI) self.volumeViewer.setLabel(ROI) # self.dockRefViewer.setVisible(False) self.dockSRViewer.setVisible(False) # self.gradeDisp.setGrade(None) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return def actLoadROI(self, directory=None): start = time.time() self.statusBar().showMessage('Loading ROI...') directory = QFileDialog.getOpenFileName(self, "Select one file to open", "./", "Files (*.nii *.dcm)") print(directory) directory = str(directory[0]) try: ROI = ReadROI(directory) except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.main.setROI(ROI) self.volumeViewer.setLabel(ROI) self.dockSRViewer.setVisible(False) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return def actFeatureExt(self): start = time.time() self.statusBar().showMessage('Extracting Feature...') try: feature_extracted = self.main.getFeature() except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.FeatureDisp.setFeature(feature_extracted) self.dockFeatureDisp.setVisible(True) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return def actCuFeatureExt(self): start = time.time() self.statusBar().showMessage('Extracting Feature...') try: feature_extracted = self.main.getCuFeature() except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.FeatureDisp.setFeature(feature_extracted) self.dockFeatureDisp.setVisible(True) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return def actSaveImg(self): pass # def actFeatureSel(self): # start = time.time() # self.statusBar().showMessage('Statistical Analyzing...') # directory = QFileDialog.getOpenFileName(self, # "Select the feature folder", # "./", # "Files (*.nii *.dcm)") # print(directory) # directory = str(directory[0]) # try: # feature_selected = self.main.featureSel() # except Exception as err: # msgBox = QMessageBox(self) # msgBox.setText(str(type(err)) + str(err)) # msgBox.exec() # self.statusBar().showMessage( \ # 'Ready ({:.2f}s)'.format(time.time() - start)) # return # msgBox = QMessageBox(self) # if feature_selected is True: # msgBox.setText('Done! Please check the folder.') # return @pyqtSlot() def actGetGrade(self): start = time.time() self.statusBar().showMessage('Predicting Grade...') try: grade = self.main.getGrade() except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.gradeDisp.setGrade(grade) self.dockGradeDisp.setVisible(True) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) msgBox = QMessageBox(self) msgBox.setText('得出诊断意见:'+ '我们从四千多个膝关节测共振图层(健康人和患者)'+\ '与医生的诊断结果中,利用深度学习的方法,'+\ '提取图像的特征及其与诊断结果的关系。'+\ '利用训练出的模型,'+\ '计算机可以自动从图像中预测诊断意见。'+'\n'+\ '提示水肿区域:'+\ '我们从三百多层带有水肿区域的磁共振图像'+\ '与医生手工勾勒出的水肿区域中,'+\ '利用深度学习的方法提取特征。利用训练出的模型,'+\ '计算机可以自动从图像中预测图像是否有水肿,'+\ '以及水肿区域的位置。') #msgBox.exec() return @pyqtSlot() def actGetSeg(self): start = time.time() self.statusBar().showMessage('Predicting Segmentation...') try: seg = self.main.getSeg() except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.volumeViewer.setLabel(seg) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) msgBox = QMessageBox(self) msgBox.setText('生成分割结果:'+\ '我们从100多例患者膝关节磁共振的手工标记结果中,'+\ '利用深度学习的方法提取特征。利用训练出的模型,'+\ '计算机可以自动从图像中得到膝关节结构的分割结果。') #msgBox.exec() @pyqtSlot() def actGetSR(self): start = time.time() self.statusBar().showMessage('Enhancing Resolution...') try: SR = self.main.getSuperResolution() except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return self.SRViewer.setImage(SR) if not self.dockSRViewer.isVisible(): self.dockSRViewer.setVisible(True) if self.dockSRViewer.isFloating(): self.dockSRViewer.resize( \ self.SRViewer.viewerSlice.viewportSizeHint()*1.4) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) msgBox = QMessageBox(self) msgBox.setText('分辨率增强(层间距)') #msgBox.exec() @pyqtSlot() def actGetReference(self): start = time.time() self.statusBar().showMessage('Predicting Reference...') try: #'PatientAge': '0010|1010', \ img = self.main.getImage() self.refViewer.openCSV(os.path.join( \ os.path.dirname(__file__), 'plot.csv')) age = img.GetMetaData('0010|1010') age = int(age[0:3]) thickness = self.main.getThickness() except Exception as err: msgBox = QMessageBox(self) msgBox.setText(str(type(err)) + str(err)) msgBox.exec() self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) return #print(age, *thickness) self.refViewer.plotCurve(age, *thickness) if not self.dockRefViewer.isVisible(): self.dockRefViewer.setVisible(True) if self.dockRefViewer.isFloating(): self.dockRefViewer.resize( \ self.refViewer.sizeHint()*1.1) self.statusBar().showMessage( \ 'Ready ({:.2f}s)'.format(time.time() - start)) msgBox = QMessageBox(self) msgBox.setText('生成参考')
class CAMERA(QWidget): datareceived = QtCore.pyqtSignal(bool) # signal emited when receive image def __init__(self, cam='choose', confFile='confCamera.ini', **kwds): ''' Parameters ---------- cam : TYPE str, optional DESCRIPTION. cam='choose' : generate a input dialog box which the list of all the camera connected (allied,basler,imagingSource) cam='cam1' : open the camera by the ID and type save in the confFile.ini ncam='menu': generate a input dialog box with a menu with all the camera name present in the .ini file cam='firstGuppy' open the first allied vision camera cam='firstBasler' open the first Basler camera cam='firstImgSource' open the first ImagingSource camera The default is 'choose'. confFile : TYPE str, optional DESCRIPTION. confFile= path to file.initr The default is 'confCamera.ini'. **kwds: affLight : TYPE boolean, optional DESCRIPTION. affLight=False all the option are show for the visualisation affLight= True only few option (save open cross) The default is True. multi add time sleep to access QApplication.processEvents() + all kwds of VISU class ''' super(CAMERA, self).__init__() p = pathlib.Path(__file__) self.nbcam = cam self.kwds = kwds if "affLight" in kwds: self.light = kwds["affLight"] else: self.light = True if "multi" in kwds: self.multi = kwds["multi"] else: self.multi = False if "separate" in kwds: self.separate = kwds["separate"] else: self.separate = True if "aff" in kwds: # affi of Visu self.aff = kwds["aff"] else: self.aff = "right" # self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) # qdarkstyle : black windows style self.confPath = str(p.parent / confFile) # ini file path self.conf = QtCore.QSettings(str(p.parent / self.confPath), QtCore.QSettings.IniFormat) # ini file self.kwds["confpath"] = self.confPath sepa = os.sep self.icon = str(p.parent) + sepa + 'icons' + sepa self.setWindowIcon(QIcon(self.icon + 'LOA.png')) self.iconPlay = self.icon + 'Play.png' self.iconSnap = self.icon + 'Snap.png' self.iconStop = self.icon + 'Stop.png' self.iconPlay = pathlib.Path(self.iconPlay) self.iconPlay = pathlib.PurePosixPath(self.iconPlay) self.iconStop = pathlib.Path(self.iconStop) self.iconStop = pathlib.PurePosixPath(self.iconStop) self.iconSnap = pathlib.Path(self.iconSnap) self.iconSnap = pathlib.PurePosixPath(self.iconSnap) self.nbShot = 1 self.isConnected = False self.version = str(__version__) self.openCam() self.setup() self.setCamPara() #self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) def openID(self): ''' open a camera by id camera typ and ID must be known and saved in the ini file ''' self.ccdName = self.conf.value(self.nbcam + "/nameCDD") self.cameraType = self.conf.value(self.nbcam + "/camType") self.camID = self.conf.value(self.nbcam + "/camId") if self.cameraType == "guppy": try: import guppyCam print('ici') self.CAM = guppyCam.GUPPY(cam=self.nbcam, conf=self.conf) print('ici2') self.CAM.openCamByID(self.camID) print('ici3') self.isConnected = self.CAM.isConnected except: print( "no allied vision camera detected or vimba is not installed" ) pass elif self.cameraType == "basler": try: import baslerCam self.CAM = baslerCam.BASLER(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print("no basler camera detected or pypylon is not installed") pass elif self.cameraType == "imgSource": try: import ImgSourceCamCallBack self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) # print('openID',self.camID) self.isConnected = self.CAM.isConnected except: print( "no imaging source camera detected or Tisgrabber is not installed" ) pass elif self.cameraType == "pixelink": try: import pixelinkCam self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print( "no imaging source camera detected or Tisgrabber is not installed" ) pass else: print('no camera') self.isConnected = False self.ccdName = "no camera" self.cameraType = "" self.camID = "" self.nbcam = 'camDefault' def openCam(self): '''open a camera with different way ''' if self.nbcam == "choose": # create menu widget with all camera present self.nbcam = 'camDefault' try: import guppyCam self.itemsGuppy = guppyCam.camAvailable() # print(self.itemsGuppy) self.lenGuppy = len(self.itemsGuppy) except: print('No allied vision camera connected') self.itemsGuppy = [] self.lenGuppy = 0 pass try: import baslerCam self.itemsBasler = baslerCam.camAvailable() self.lenBasler = len(self.itemsBasler) except: print('No Basler camera connected') self.itemsBasler = [] self.lenBasler = 0 pass try: import ImgSourceCamCallBack self.itemsImgSource = ImgSourceCamCallBack.camAvailable() self.lenImgSource = len(self.itemsImgSource) except: print('No ImagingSource camera connected') self.itemsImgSource = [] self.lenImgSource = 0 pass try: import pixelinkCam self.itemsPixelink = pixelinkCam.PIXELINK.camAvailable() self.lenImgPixelink = len(self.itemsPixelink) except: print('No pixelink camera connected') self.itemsPixelink = [] self.lenPixelink = 0 pass items = self.itemsGuppy + list( self.itemsBasler) + self.itemsImgSource + self.itemsPixelink item, ok = QInputDialog.getItem( self, "Select a camera", "List of avaible camera", items, 0, False, flags=QtCore.Qt.WindowStaysOnTopHint) if ok and item: indexItem = items.index(item) if indexItem < self.lenGuppy: indexItem = indexItem self.cameraType = "guppy" self.camID = guppyCam.getCamID(indexItem) self.CAM = guppyCam.GUPPY(cam=self.nbcam, conf=self.conf) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID elif indexItem >= self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy: indexItem = indexItem - self.lenGuppy self.cameraType = "basler" self.camID = baslerCam.getCamID(indexItem) self.CAM = baslerCam.BASLER(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID elif indexItem >= self.lenBasler + self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource: indexItem = indexItem - self.lenGuppy - self.lenBasler self.cameraType = "imgSource" self.camID = ImgSourceCamCallBack.getCamID(indexItem) self.camID = self.camID.decode() self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID elif indexItem >= self.lenBasler + self.lenGuppy + self.lenImgSource and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource + self.lenPixelink: indexItem = indexItem - self.lenGuppy - self.lenBasler - self.lenImgSource self.cameraType = "pixelink" self.camID = pixelinkCam.getCamID(indexItem) self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID else: self.isconnected = False print('No camera choosen') self.ccdName = "no camera" self.nbcam = 'camDefault' else: self.isconnected = False print('No camera choosen') self.ccdName = "no camera" self.cameraType = "" self.camID = "" self.nbcam = 'camDefault' elif self.nbcam == None: self.isconnected = False print('No camera') self.ccdName = "no camera" self.cameraType = "" self.camID = "" self.nbcam = 'camDefault' elif self.nbcam == "firstGuppy": # open the first guppy cam in the list self.nbcam = 'camDefault' self.cameraType = "guppy" self.ccdName = 'First guppy Cam' import guppyCam self.CAM = guppyCam.GUPPY(cam=self.nbcam, conf=self.conf) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstBasler": # open the first basler cam in the list self.ccdName = 'First basler Cam' self.nbcam = 'camDefault' self.cameraType = "basler" import baslerCam self.CAM = baslerCam.BASLER(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstImgSource": # open the first imgSource cam in the list self.ccdName = 'First ImSource Cam' self.nbcam = 'camDefault' self.cameraType = "imgSource" import ImgSourceCamCallBack self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstPixelink": # open the first pixelink cam in the list self.ccdName = 'First Pixelink Cam' self.nbcam = 'camDefault' self.cameraType = "pixelink" import pixelinkCam self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == 'menu': # Qdialog with a menu with all the camera name present in the inifile self.groupsName = [] self.groups = self.conf.childGroups() for groups in self.groups: self.groupsName.append(self.conf.value(groups + "/nameCDD")) item, ok = QInputDialog.getItem( self, "Select a camera", "List of avaible camera", self.groupsName, 0, False, flags=QtCore.Qt.WindowStaysOnTopHint) if ok and item: indexItem = self.groupsName.index(item) self.nbcam = self.groups[indexItem] self.openID() else: #open the camera by ID : nbcam return ID of the ini file try: self.openID() except: self.isConnected = False def setCamPara(self): '''set min max gain and exp value of cam in the widget ''' if self.isConnected == True: # if camera is connected we address min and max value and value to the shutter and gain box # print('camshutter',self.CAM.camParameter["exposureTime"]) if self.CAM.camParameter[ "expMax"] > 1500: # we limit exposure time at 1500ms self.hSliderShutter.setMaximum(1500) self.shutterBox.setMaximum(1500) else: self.hSliderShutter.setMaximum(self.CAM.camParameter["expMax"]) self.shutterBox.setMaximum(self.CAM.camParameter["expMax"]) self.hSliderShutter.setValue( int(self.CAM.camParameter["exposureTime"])) self.shutterBox.setValue(int( self.CAM.camParameter["exposureTime"])) self.hSliderShutter.setMinimum( int(self.CAM.camParameter["expMin"] + 1)) self.shutterBox.setMinimum(int(self.CAM.camParameter["expMin"] + 1)) self.hSliderGain.setMinimum(int(self.CAM.camParameter["gainMin"])) self.hSliderGain.setMaximum(int(self.CAM.camParameter["gainMax"])) self.hSliderGain.setValue(int(self.CAM.camParameter["gain"])) self.gainBox.setMinimum(int(self.CAM.camParameter["gainMin"])) self.gainBox.setMaximum(int(self.CAM.camParameter["gainMax"])) self.gainBox.setValue(int(self.CAM.camParameter["gain"])) self.actionButton() if self.isConnected == False: self.setWindowTitle( 'Visualization No camera connected ' + 'v. ' + self.version) self.runButton.setEnabled(False) self.snapButton.setEnabled(False) self.trigg.setEnabled(False) self.hSliderShutter.setEnabled(False) self.shutterBox.setEnabled(False) self.gainBox.setEnabled(False) self.hSliderGain.setEnabled(False) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) def setup(self): """ user interface definition """ self.setWindowTitle('Visualization ' + self.cameraType + " " + self.ccdName + ' v.' + self.version) hbox1 = QHBoxLayout() # horizontal layout pour run snap stop self.sizebuttonMax = 30 self.sizebuttonMin = 30 self.runButton = QToolButton(self) self.runButton.setMaximumWidth(self.sizebuttonMax) self.runButton.setMinimumWidth(self.sizebuttonMax) self.runButton.setMaximumHeight(self.sizebuttonMax) self.runButton.setMinimumHeight(self.sizebuttonMax) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton = QToolButton(self) self.snapButton.setPopupMode(0) menu = QMenu() #menu.addAction('acq',self.oneImage) menu.addAction('set nb of shot', self.nbShotAction) self.snapButton.setMenu(menu) self.snapButton.setMaximumWidth(self.sizebuttonMax) self.snapButton.setMinimumWidth(self.sizebuttonMax) self.snapButton.setMaximumHeight(self.sizebuttonMax) self.snapButton.setMinimumHeight(self.sizebuttonMax) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) self.stopButton = QToolButton(self) self.stopButton.setMaximumWidth(self.sizebuttonMax) self.stopButton.setMinimumWidth(self.sizebuttonMax) self.stopButton.setMaximumHeight(self.sizebuttonMax) self.stopButton.setMinimumHeight(self.sizebuttonMax) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.stopButton.setEnabled(False) hbox1.addWidget(self.runButton) hbox1.addWidget(self.snapButton) hbox1.addWidget(self.stopButton) hbox1.setSizeConstraint(QtGui.QLayout.SetFixedSize) hbox1.setContentsMargins(0, 10, 0, 10) self.widgetControl = QWidget(self) self.widgetControl.setLayout(hbox1) self.dockControl = QDockWidget(self) self.dockControl.setWidget(self.widgetControl) self.dockControl.resize(80, 80) self.trigg = QComboBox() self.trigg.setMaximumWidth(80) self.trigg.addItem('OFF') self.trigg.addItem('ON') self.trigg.setStyleSheet('font :bold 10pt;color: white') self.labelTrigger = QLabel('Trigger') self.labelTrigger.setMaximumWidth(70) self.labelTrigger.setStyleSheet('font :bold 10pt') self.itrig = self.trigg.currentIndex() hbox2 = QHBoxLayout() hbox2.setSizeConstraint(QtGui.QLayout.SetFixedSize) hbox2.setContentsMargins(5, 15, 0, 0) hbox2.addWidget(self.labelTrigger) hbox2.addWidget(self.trigg) self.widgetTrig = QWidget(self) self.widgetTrig.setLayout(hbox2) self.dockTrig = QDockWidget(self) self.dockTrig.setWidget(self.widgetTrig) self.labelExp = QLabel('Exposure (ms)') self.labelExp.setStyleSheet('font :bold 10pt') self.labelExp.setMaximumWidth(140) self.labelExp.setAlignment(Qt.AlignCenter) self.hSliderShutter = QSlider(Qt.Horizontal) self.hSliderShutter.setMaximumWidth(80) self.shutterBox = QSpinBox() self.shutterBox.setStyleSheet('font :bold 8pt') self.shutterBox.setMaximumWidth(120) hboxShutter = QHBoxLayout() hboxShutter.setContentsMargins(5, 0, 0, 0) hboxShutter.setSpacing(10) vboxShutter = QVBoxLayout() vboxShutter.setSpacing(0) vboxShutter.addWidget(self.labelExp) #,Qt.AlignLef) hboxShutter.addWidget(self.hSliderShutter) hboxShutter.addWidget(self.shutterBox) vboxShutter.addLayout(hboxShutter) vboxShutter.setSizeConstraint(QtGui.QLayout.SetFixedSize) vboxShutter.setContentsMargins(5, 5, 0, 0) self.widgetShutter = QWidget(self) self.widgetShutter.setLayout(vboxShutter) self.dockShutter = QDockWidget(self) self.dockShutter.setWidget(self.widgetShutter) self.labelGain = QLabel('Gain') self.labelGain.setStyleSheet('font :bold 10pt') self.labelGain.setMaximumWidth(120) self.labelGain.setAlignment(Qt.AlignCenter) self.hSliderGain = QSlider(Qt.Horizontal) self.hSliderGain.setMaximumWidth(80) self.gainBox = QSpinBox() self.gainBox.setMaximumWidth(60) self.gainBox.setStyleSheet('font :bold 8pt') self.gainBox.setMaximumWidth(120) hboxGain = QHBoxLayout() hboxGain.setContentsMargins(5, 0, 0, 0) hboxGain.setSpacing(10) vboxGain = QVBoxLayout() vboxGain.setSpacing(0) vboxGain.addWidget(self.labelGain) hboxGain.addWidget(self.hSliderGain) hboxGain.addWidget(self.gainBox) vboxGain.addLayout(hboxGain) vboxGain.setSizeConstraint(QtGui.QLayout.SetFixedSize) vboxGain.setContentsMargins(5, 5, 0, 0) self.widgetGain = QWidget(self) self.widgetGain.setLayout(vboxGain) self.dockGain = QDockWidget(self) self.dockGain.setWidget(self.widgetGain) # self.TrigSoft=QPushButton('Trig Soft',self) # self.TrigSoft.setMaximumWidth(100) # self.vbox1.addWidget(self.TrigSoft) # self.vbox1.addStretch(1) # self.cameraWidget.setLayout(self.vbox1) # self.cameraWidget.setMinimumSize(150,200) # self.cameraWidget.setMaximumSize(200,900) hMainLayout = QHBoxLayout() if self.light == False: #from visu.visual2 import SEE from visu import SEE2 self.visualisation = SEE2( name=self.nbcam, **self.kwds ) ## Widget for visualisation and tools self.confVisu permet d'avoir plusieurs camera et donc plusieurs fichier ini de visualisation self.visualisation.setWindowTitle('Visualization ' + self.cameraType + " " + self.ccdName + ' v.' + self.version) if self.separate == True: print('ici') self.vbox2 = QVBoxLayout() self.vbox2.addWidget(self.visualisation) if self.aff == 'left': hMainLayout.addLayout(self.vbox2) hMainLayout.addWidget(self.cameraWidget) else: hMainLayout.addWidget(self.cameraWidget) hMainLayout.addLayout(self.vbox2) else: self.dockControl.setTitleBarWidget( QWidget()) # to avoid tittle #self.dockControl.setFeatures(QDockWidget.DockWidgetMovable) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockControl) self.dockTrig.setTitleBarWidget(QWidget()) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockTrig) self.dockShutter.setTitleBarWidget(QWidget()) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockShutter) self.dockGain.setTitleBarWidget(QWidget()) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockGain) hMainLayout.addWidget(self.visualisation) else: from visu import SEELIGHT self.visualisation = SEELIGHT(confpath=self.confPath, name=self.nbcam, **self.kwds) self.visualisation.hbox0.addWidget(self.cameraWidget) hMainLayout.addWidget(self.visualisation) self.setLayout(hMainLayout) self.setContentsMargins(0, 0, 0, 0) #self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # set window on the top #self.activateWindow() #self.raise_() #self.showNormal() def actionButton(self): '''action when button are pressed ''' self.runButton.clicked.connect(self.acquireMultiImage) self.snapButton.clicked.connect(self.acquireOneImage) self.stopButton.clicked.connect(self.stopAcq) self.shutterBox.editingFinished.connect(self.shutter) self.hSliderShutter.sliderReleased.connect(self.mSliderShutter) self.gainBox.editingFinished.connect(self.gain) self.hSliderGain.sliderReleased.connect(self.mSliderGain) self.trigg.currentIndexChanged.connect(self.trigger) self.CAM.newData.connect(self.Display) #,QtCore.Qt.DirectConnection) # self.TrigSoft.clicked.connect(self.softTrigger) def oneImage(self): #self.nbShot=1 self.acquireOneImage() def nbShotAction(self): ''' number of snapShot ''' nbShot, ok = QInputDialog.getInt(self, 'Number of SnapShot ', 'Enter the number of snapShot ') if ok: self.nbShot = int(nbShot) if self.nbShot <= 0: self.nbShot = 1 def wait(self, seconds): time_end = time.time() + seconds while time.time() < time_end: QtGui.QApplication.processEvents() def Display(self, data): '''Display data with visualisation module ''' if self.multi == True: self.wait(0.1) self.data = data #np.rot90(data,1) self.visualisation.newDataReceived(self.data) self.imageReceived = True self.datareceived.emit(True) if self.CAM.camIsRunnig == False: self.stopAcq() def shutter(self): ''' set exposure time ''' sh = self.shutterBox.value() # self.hSliderShutter.setValue(sh) # set value of slider time.sleep(0.1) self.CAM.setExposure(sh) # Set shutter CCD in ms self.conf.setValue(self.nbcam + "/shutter", float(sh)) self.CAM.camParameter["exposureTime"] = sh self.conf.sync() def mSliderShutter(self): # for shutter slider sh = self.hSliderShutter.value() self.shutterBox.setValue(sh) # self.CAM.setExposure(sh) # Set shutter CCD in ms self.conf.setValue(self.nbcam + "/shutter", float(sh)) self.CAM.camParameter["exposureTime"] = sh # self.conf.sync() def gain(self): ''' set gain ''' g = self.gainBox.value() # self.hSliderGain.setValue(g) # set slider value time.sleep(0.1) self.CAM.setGain(g) self.conf.setValue(self.nbcam + "/gain", float(g)) self.conf.sync() def mSliderGain(self): ''' set slider ''' g = self.hSliderGain.value() self.gainBox.setValue(g) # set valeur de la box time.sleep(0.1) self.CAM.setGain(g) self.conf.setValue(self.nbcam + "/gain", float(g)) self.conf.sync() def trigger(self): ''' select trigger mode trigger on trigger off ''' self.itrig = self.trigg.currentIndex() if self.itrig == 1: self.CAM.setTrigger("on") else: self.CAM.setTrigger("off") def acquireOneImage(self): '''Start on acquisition ''' self.imageReceived = False self.runButton.setEnabled(False) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}" % (self.iconSnap, self.iconSnap)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(False) self.CAM.startOneAcq(self.nbShot) def acquireMultiImage(self): ''' start the acquisition thread ''' self.runButton.setEnabled(False) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(False) self.CAM.startAcq() # start mutli image acquisition thread def stopAcq(self): '''Stop acquisition ''' if self.isConnected == True: self.CAM.stopAcq() self.runButton.setEnabled(True) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setEnabled(True) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) self.stopButton.setEnabled(False) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(True) def close(self): if self.isConnected == True: self.CAM.closeCamera() def closeEvent(self, event): ''' closing window event (cross button) ''' if self.isConnected == True: self.stopAcq() time.sleep(0.1) self.close()
class CAMERAMOTOR(QWidget): datareceived = QtCore.pyqtSignal(bool) # signal emited when receive image def __init__(self, cam=None, confFile='confCamera.ini', **kwds): ''' Parameters ---------- cam : TYPE str, optional DESCRIPTION. cam='choose' : generate a input dialog box which the list of all the camera connected (allied,basler,imagingSource) cam='cam1' : open the camera by the ID and type save in the confFile.ini ncam='menu': generate a input dialog box with a menu with all the camera name present in the .ini file cam='firstGuppy' open the first allied vision camera cam='firstBasler' open the first Basler camera cam='firstImgSource' open the first ImagingSource camera The default is 'choose'. confFile : TYPE str, optional DESCRIPTION. confFile= path to file.initr The default is 'confCamera.ini'. **kwds: affLight : TYPE boolean, optional DESCRIPTION. affLight=False all the option are show for the visualisation affLight= True only few option (save open cross) The default is True. multi add time sleep to access QApplication.processEvents() + all kwds of VISU class ''' super(CAMERAMOTOR, self).__init__() p = pathlib.Path(__file__) self.nbcam = cam self.maxMvtY = 500 self.maxMvtX = 500 self.nbImage = 0 self.kwds = kwds if "confPath" in kwds: self.conf = QtCore.QSettings(kwds["confPath"], QtCore.QSettings.IniFormat) else: print('path', str(p.parent / confFile)) self.conf = QtCore.QSettings(str( p.parent / confFile), QtCore.QSettings.IniFormat) # ini file # self.confPath=str(p.parent / confFile) # ini file path if "conf" in kwds: self.conf = kwds["conf"] self.kwds["conf"] = self.conf if "affLight" in kwds: self.light = kwds["affLight"] else: self.light = True if "multi" in kwds: self.multi = kwds["multi"] else: self.multi = False if "separate" in kwds: self.separate = kwds["separate"] else: self.separate = True if "aff" in kwds: # affi of Visu self.aff = kwds["aff"] else: self.aff = "right" if "loop" in kwds: # affi of Visu self.loop = kwds["loop"] self.kwds["roiCross"] = True # set circle on visu cross else: self.loop = False if "nbLoop" in kwds: self.nbImageMax = kwds["nbLoop"] else: self.nbImageMax = 3 # Si les moteurs ne sont pas renseignés on prend ceux renseigné dans le fichier ini de la cam if "motLat" in kwds: self.motLat = kwds["motLat"] else: self.motLat = (self.conf.value(self.nbcam + "/motLat")) if "motVert" in kwds: self.motVert = kwds["motVert"] else: self.motVert = (self.conf.value(self.nbcam + "/motVert")) if "motorTypeName0" in kwds: self.motorTypeName0 = kwds["motorTypeName0"] else: self.motorTypeName0 = (self.conf.value(self.nbcam + "/motorTypeName0")) if "motorTypeName1" in kwds: self.motorTypeName1 = kwds["motorTypeName1"] else: self.motorTypeName1 = (self.conf.value(self.nbcam + "/motorTypeName1")) self.motor = TILTMOTORGUI(motLat=self.motLat, motorTypeName0=self.motorTypeName0, motVert=self.motVert, motorTypeName1=self.motorTypeName1, nomWin='', nomTilt='', unit=1, jogValue=100) self.motor.startThread2() # self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) # qdarkstyle : black windows style sepa = os.sep self.icon = str(p.parent) + sepa + 'icons' + sepa self.setWindowIcon(QIcon(self.icon + 'LOA.png')) self.iconPlay = self.icon + 'Play.png' self.iconSnap = self.icon + 'Snap.png' self.iconStop = self.icon + 'Stop.png' self.iconPlay = pathlib.Path(self.iconPlay) self.iconPlay = pathlib.PurePosixPath(self.iconPlay) self.iconStop = pathlib.Path(self.iconStop) self.iconStop = pathlib.PurePosixPath(self.iconStop) self.iconSnap = pathlib.Path(self.iconSnap) self.iconSnap = pathlib.PurePosixPath(self.iconSnap) self.nbShot = 1 self.isConnected = False self.version = str(__version__) self.pasY = float(self.conf.value(self.nbcam + "/pasY")) self.pasX = float(self.conf.value(self.nbcam + "/pasX")) self.openCam() self.kwds["name"] = self.nbcam self.setup() self.setCamPara() self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) self.xr = int(self.conf.value(self.nbcam + "/xc")) self.yr = int(self.conf.value(self.nbcam + "/yc")) self.xlim = int(self.conf.value(self.nbcam + "/rx")) / 2 self.ylim = int(self.conf.value(self.nbcam + "/ry")) / 2 self.Xec = [] self.Yec = [] self.vLine = pg.InfiniteLine(angle=90, movable=True, pen='b') self.hLine = pg.InfiniteLine(angle=0, movable=True, pen='b') def openID(self): ''' open a camera by id camera typ and ID must be known and saved in the ini file ''' self.ccdName = self.conf.value(self.nbcam + "/nameCDD") self.cameraType = self.conf.value(self.nbcam + "/camType") self.camID = self.conf.value(self.nbcam + "/camId") if self.cameraType == "guppy": try: import guppyCam self.CAM = guppyCam.GUPPY(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print( "no allied vision camera detected or vimba is not installed" ) pass if self.cameraType == "allied": try: import alliedCam self.CAM = alliedCam.ALLIEDVISION(cam=self.nbcam, conf=self.conf) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print( "no allied vision camera detected or vimba is not installed" ) pass elif self.cameraType == "basler": try: import baslerCam self.CAM = baslerCam.BASLER(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print("no basler camera detected or pypylon is not installed") pass elif self.cameraType == "imgSource": try: import ImgSourceCamCallBack self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) # print('openID',self.camID) self.isConnected = self.CAM.isConnected except: print( "no imaging source camera detected or Tisgrabber is not installed" ) pass elif self.cameraType == "pixelink": try: import pixelinkCam self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print( "no pixellink camera detected or pillelink dll is not installed" ) pass elif self.cameraType == "ids": try: import idsCam self.CAM = idsCam.IDS(cam=self.nbcam, conf=self.conf, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected except: print( "no imaging source camera detected or Tisgrabber is not installed" ) pass else: print('no camera') self.isConnected = False self.ccdName = "no camera" self.cameraType = "" self.camID = "" self.nbcam = 'camDefault' def openCam(self): '''open a camera with different way ''' if self.nbcam == "choose": # create menu widget with all camera present self.nbcam = 'camDefault' try: import guppyCam self.itemsGuppy = guppyCam.camAvailable() # print(self.itemsGuppy) self.lenGuppy = len(self.itemsGuppy) except: print('No allied vision camera connected') self.itemsGuppy = [] self.lenGuppy = 0 pass try: import baslerCam self.itemsBasler = baslerCam.camAvailable() self.lenBasler = len(self.itemsBasler) except: print('No Basler camera connected') self.itemsBasler = [] self.lenBasler = 0 pass try: import ImgSourceCamCallBack self.itemsImgSource = ImgSourceCamCallBack.camAvailable() self.lenImgSource = len(self.itemsImgSource) except: print('No ImagingSource camera connected') self.itemsImgSource = [] self.lenImgSource = 0 pass try: import pixelinkCam self.itemsPixelink = pixelinkCam.PIXELINK.camAvailable() self.lenImgPixelink = len(self.itemsPixelink) except: print('No pixelink camera connected') self.itemsPixelink = [] self.lenPixelink = 0 pass items = self.itemsGuppy + list( self.itemsBasler) + self.itemsImgSource + self.itemsPixelink item, ok = QInputDialog.getItem( self, "Select a camera", "List of avaible camera", items, 0, False, flags=QtCore.Qt.WindowStaysOnTopHint) if ok and item: indexItem = items.index(item) if indexItem < self.lenGuppy: indexItem = indexItem self.cameraType = "guppy" self.camID = guppyCam.getCamID(indexItem) self.CAM = guppyCam.GUPPY(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID elif indexItem >= self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy: indexItem = indexItem - self.lenGuppy self.cameraType = "basler" self.camID = baslerCam.getCamID(indexItem) self.CAM = baslerCam.BASLER(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID elif indexItem >= self.lenBasler + self.lenGuppy and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource: indexItem = indexItem - self.lenGuppy - self.lenBasler self.cameraType = "imgSource" self.camID = ImgSourceCamCallBack.getCamID(indexItem) self.camID = self.camID.decode() self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID elif indexItem >= self.lenBasler + self.lenGuppy + self.lenImgSource and indexItem < self.lenBasler + self.lenGuppy + self.lenImgSource + self.lenPixelink: indexItem = indexItem - self.lenGuppy - self.lenBasler - self.lenImgSource self.cameraType = "pixelink" self.camID = pixelinkCam.getCamID(indexItem) self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, **self.kwds) self.CAM.openCamByID(self.camID) self.isConnected = self.CAM.isConnected self.ccdName = self.camID else: self.isconnected = False print('No camera choosen') self.ccdName = "no camera" self.nbcam = 'camDefault' else: self.isconnected = False print('No camera choosen') self.ccdName = "no camera" self.cameraType = "" self.camID = "" self.nbcam = 'camDefault' elif self.nbcam == None: self.isconnected = False print('No camera') self.ccdName = "no camera" self.cameraType = "" self.camID = "" self.nbcam = 'camDefault' elif self.nbcam == "firstGuppy": # open the first guppy cam in the list self.nbcam = 'camDefault' self.cameraType = "guppy" self.ccdName = 'First guppy Cam' import guppyCam self.CAM = guppyCam.GUPPY(cam=self.nbcam, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstAllied": # open the first guppy cam in the list self.nbcam = 'camDefault' self.cameraType = "allied" self.ccdName = 'First allied Cam' import alliedCam3 self.CAM = alliedCam3.ALLIEDVISION(cam=self.nbcam, conf=self.conf) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstBasler": # open the first basler cam in the list self.ccdName = 'First basler Cam' self.nbcam = 'camDefault' self.cameraType = "basler" import baslerCam self.CAM = baslerCam.BASLER(cam=self.nbcam, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstImgSource": # open the first imgSource cam in the list self.ccdName = 'First ImSource Cam' self.nbcam = 'camDefault' self.cameraType = "imgSource" import ImgSourceCamCallBack self.CAM = ImgSourceCamCallBack.IMGSOURCE(cam=self.nbcam, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstPixelink": # open the first pixelink cam in the list self.ccdName = 'First Pixelink Cam' self.nbcam = 'camDefault' self.cameraType = "pixelink" import pixelinkCam self.CAM = pixelinkCam.PIXELINK(cam=self.nbcam, **self.kwds) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == "firstIds": # open the first guppy cam in the list self.nbcam = 'camDefault' self.cameraType = "ids" self.ccdName = 'First ids Cam' import idsCam self.CAM = idsCam.IDS(cam=self.nbcam, conf=self.conf) self.CAM.openFirstCam() self.isConnected = self.CAM.isConnected elif self.nbcam == 'menu': # Qdialog with a menu with all the camera name present in the inifile self.groupsName = [] self.groups = self.conf.childGroups() for groups in self.groups: self.groupsName.append(self.conf.value(groups + "/nameCDD")) item, ok = QInputDialog.getItem( self, "Select a camera", "List of avaible camera", self.groupsName, 0, False, flags=QtCore.Qt.WindowStaysOnTopHint) if ok and item: indexItem = self.groupsName.index(item) self.nbcam = self.groups[indexItem] self.openID() else: #open the camera by ID : nbcam return ID of the ini file try: self.openID() except: self.isConnected = False def setCamPara(self): '''set min max gain and exp value of cam in the widget ''' # print("connected",self.isConnected) if self.isConnected == True: # if camera is connected we address min and max value and value to the shutter and gain box # print('camshutter',self.CAM.camParameter["exposureTime"]) if self.CAM.camParameter[ "expMax"] > 1500: # we limit exposure time at 1500ms self.hSliderShutter.setMaximum(1500) self.shutterBox.setMaximum(1500) else: self.hSliderShutter.setMaximum(self.CAM.camParameter["expMax"]) self.shutterBox.setMaximum(self.CAM.camParameter["expMax"]) self.hSliderShutter.setValue( int(self.CAM.camParameter["exposureTime"])) self.shutterBox.setValue(int( self.CAM.camParameter["exposureTime"])) self.hSliderShutter.setMinimum( int(self.CAM.camParameter["expMin"] + 1)) self.shutterBox.setMinimum(int(self.CAM.camParameter["expMin"] + 1)) self.hSliderGain.setMinimum(self.CAM.camParameter["gainMin"]) self.hSliderGain.setMaximum(self.CAM.camParameter["gainMax"]) self.hSliderGain.setValue(self.CAM.camParameter["gain"]) self.gainBox.setMinimum(self.CAM.camParameter["gainMin"]) self.gainBox.setMaximum(self.CAM.camParameter["gainMax"]) self.gainBox.setValue(self.CAM.camParameter["gain"]) self.actionButton() if self.isConnected == False: self.setWindowTitle( 'Visualization No camera connected ' + 'v. ' + self.version) self.runButton.setEnabled(False) self.snapButton.setEnabled(False) self.trigg.setEnabled(False) self.hSliderShutter.setEnabled(False) self.shutterBox.setEnabled(False) self.gainBox.setEnabled(False) self.hSliderGain.setEnabled(False) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) def setup(self): """ user interface definition """ self.setWindowTitle('Visualization ' + self.cameraType + " " + self.ccdName + ' v.' + self.version) hbox1 = QHBoxLayout() # horizontal layout pour run snap stop self.sizebuttonMax = 30 self.sizebuttonMin = 30 self.runButton = QToolButton(self) self.runButton.setMaximumWidth(self.sizebuttonMax) self.runButton.setMinimumWidth(self.sizebuttonMax) self.runButton.setMaximumHeight(self.sizebuttonMax) self.runButton.setMinimumHeight(self.sizebuttonMax) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton = QToolButton(self) self.snapButton.setPopupMode(0) menu = QMenu() #menu.addAction('acq',self.oneImage) menu.addAction('set nb of shot', self.nbShotAction) self.snapButton.setMenu(menu) self.snapButton.setMaximumWidth(self.sizebuttonMax) self.snapButton.setMinimumWidth(self.sizebuttonMax) self.snapButton.setMaximumHeight(self.sizebuttonMax) self.snapButton.setMinimumHeight(self.sizebuttonMax) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: green;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) self.stopButton = QToolButton(self) self.stopButton.setMaximumWidth(self.sizebuttonMax) self.stopButton.setMinimumWidth(self.sizebuttonMax) self.stopButton.setMaximumHeight(self.sizebuttonMax) self.stopButton.setMinimumHeight(self.sizebuttonMax) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.stopButton.setEnabled(False) hbox1.addWidget(self.runButton) hbox1.addWidget(self.snapButton) hbox1.addWidget(self.stopButton) hbox1.setSizeConstraint(QtGui.QLayout.SetFixedSize) hbox1.setContentsMargins(0, 10, 0, 10) self.widgetControl = QWidget(self) self.widgetControl.setLayout(hbox1) self.dockControl = QDockWidget(self) self.dockControl.setWidget(self.widgetControl) self.dockControl.resize(80, 80) self.trigg = QComboBox() self.trigg.setMaximumWidth(70) self.trigg.addItem('OFF') self.trigg.addItem('ON') self.trigg.setStyleSheet('font :bold 8pt;color: white') self.labelTrigger = QLabel('Trig') self.labelTrigger.setMaximumWidth(60) self.labelTrigger.setStyleSheet('font :bold 8pt') self.itrig = self.trigg.currentIndex() hbox2 = QHBoxLayout() hbox2.setSizeConstraint(QtGui.QLayout.SetFixedSize) hbox2.setContentsMargins(5, 10, 0, 0) hbox2.addWidget(self.labelTrigger) hbox2.addWidget(self.trigg) self.widgetTrig = QWidget(self) self.widgetTrig.setLayout(hbox2) self.dockTrig = QDockWidget(self) self.dockTrig.setWidget(self.widgetTrig) self.labelExp = QLabel('Exp(ms)') self.labelExp.setStyleSheet('font :bold 10pt') self.labelExp.setMaximumWidth(140) self.labelExp.setAlignment(Qt.AlignCenter) self.hSliderShutter = QSlider(Qt.Horizontal) self.hSliderShutter.setMaximumWidth(50) self.shutterBox = QSpinBox() self.shutterBox.setStyleSheet('font :bold 8pt') self.shutterBox.setMaximumWidth(120) hboxShutter = QHBoxLayout() hboxShutter.setContentsMargins(5, 0, 0, 0) hboxShutter.setSpacing(10) vboxShutter = QVBoxLayout() vboxShutter.setSpacing(0) vboxShutter.addWidget(self.labelExp) #,Qt.AlignLef) hboxShutter.addWidget(self.hSliderShutter) hboxShutter.addWidget(self.shutterBox) vboxShutter.addLayout(hboxShutter) vboxShutter.setSizeConstraint(QtGui.QLayout.SetFixedSize) vboxShutter.setContentsMargins(5, 0, 0, 0) self.widgetShutter = QWidget(self) self.widgetShutter.setLayout(vboxShutter) self.dockShutter = QDockWidget(self) self.dockShutter.setWidget(self.widgetShutter) self.labelGain = QLabel('Gain') self.labelGain.setStyleSheet('font :bold 10pt') self.labelGain.setMaximumWidth(100) self.labelGain.setAlignment(Qt.AlignCenter) self.hSliderGain = QSlider(Qt.Horizontal) self.hSliderGain.setMaximumWidth(50) self.gainBox = QSpinBox() self.gainBox.setMaximumWidth(60) self.gainBox.setStyleSheet('font :bold 8pt') self.gainBox.setMaximumWidth(60) hboxGain = QHBoxLayout() hboxGain.setContentsMargins(5, 0, 0, 0) hboxGain.setSpacing(10) vboxGain = QVBoxLayout() vboxGain.setSpacing(0) vboxGain.addWidget(self.labelGain) hboxGain.addWidget(self.hSliderGain) hboxGain.addWidget(self.gainBox) vboxGain.addLayout(hboxGain) vboxGain.setSizeConstraint(QtGui.QLayout.SetFixedSize) vboxGain.setContentsMargins(5, 5, 0, 0) self.widgetGain = QWidget(self) self.widgetGain.setLayout(vboxGain) self.dockGain = QDockWidget(self) self.dockGain.setWidget(self.widgetGain) # self.TrigSoft=QPushButton('Trig Soft',self) # self.TrigSoft.setMaximumWidth(100) # self.vbox1.addWidget(self.TrigSoft) # self.vbox1.addStretch(1) # self.cameraWidget.setLayout(self.vbox1) # self.cameraWidget.setMinimumSize(150,200) # self.cameraWidget.setMaximumSize(200,900) hMainLayout = QHBoxLayout() if self.light == False: #from visu.visual2 import SEE from visu import SEE2 self.visualisation = SEE2( **self.kwds ) ## Widget for visualisation and tools self.confVisu permet d'avoir plusieurs camera et donc plusieurs fichier ini de visualisation else: from visu import visualLight2 self.visualisation = visualLight2.SEELIGHT(**self.kwds) self.visualisation.setWindowTitle('Visualization ' + self.cameraType + " " + self.ccdName + ' v.' + self.version) self.dockControl.setTitleBarWidget(QWidget()) self.dockTrig.setTitleBarWidget(QWidget()) self.dockShutter.setTitleBarWidget(QWidget()) self.dockGain.setTitleBarWidget(QWidget()) MotorLayout = QVBoxLayout() MotorLayout.addStretch(1) MotorLayout.addWidget(self.motor) MotorLayout.addStretch(1) if self.separate == True: self.dockMotor = QDockWidget(self) self.dockMotor.setTitleBarWidget(QWidget()) self.WidgetMotor = QWidget() #self.WidgetMotor.setStyleSheet("border : blue ") self.WidgetMotor.setLayout(MotorLayout) self.dockMotor.setWidget(self.WidgetMotor) hbox1.setContentsMargins(0, 10, 0, 0) hbox2.setContentsMargins(0, 10, 0, 5) hboxShutter.setContentsMargins(0, 5, 0, 5) hboxGain.setContentsMargins(0, 5, 0, 5) if self.aff == 'left': # to avoid tittle #self.dockControl.setFeatures(QDockWidget.DockWidgetMovable) self.visualisation.addDockWidget(Qt.LeftDockWidgetArea, self.dockControl) self.visualisation.addDockWidget(Qt.LeftDockWidgetArea, self.dockTrig) self.visualisation.addDockWidget(Qt.LeftDockWidgetArea, self.dockShutter) self.visualisation.addDockWidget(Qt.LeftDockWidgetArea, self.dockGain) self.visualisation.addDockWidget(Qt.LeftDockWidgetArea, self.dockMotor) else: self.visualisation.addDockWidget(Qt.RightDockWidgetArea, self.dockControl) self.visualisation.addDockWidget(Qt.RightDockWidgetArea, self.dockTrig) self.visualisation.addDockWidget(Qt.RightDockWidgetArea, self.dockShutter) self.visualisation.addDockWidget(Qt.RightDockWidgetArea, self.dockGain) self.visualisation.addDockWidget(Qt.RightDockWidgetArea, self.dockMotor) hMainLayout.addWidget(self.visualisation) else: # to avoid tittle #self.dockControl.setFeatures(QDockWidget.DockWidgetMovable) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockControl) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockTrig) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockShutter) self.visualisation.addDockWidget(Qt.TopDockWidgetArea, self.dockGain) hMainLayout.addWidget(self.visualisation) hMainLayout.addLayout(MotorLayout) if self.loop == True: self.hloopLayout = QHBoxLayout() self.closeLoop = QCheckBox('Close Loop') self.hloopLayout.addWidget(self.closeLoop) self.closeLoopRadio = QRadioButton() self.closeLoopRadio.setStyleSheet( "QRadioButton::indicator:checked{background-color: red ;border-color: red }" ) self.hloopLayout.addWidget(self.closeLoopRadio) MotorLayout.addLayout(self.hloopLayout) MotorLayout.addStretch(1) MotorLayout.setContentsMargins(0, 0, 0, 0) hMainLayout.setContentsMargins(1, 0, 0, 0) self.setLayout(hMainLayout) self.setContentsMargins(0, 0, 2, 0) #self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) # set window on the top #self.activateWindow() #self.raise_() #self.showNormal() def actionButton(self): '''action when button are pressed ''' self.runButton.clicked.connect(self.acquireMultiImage) self.snapButton.clicked.connect(self.acquireOneImage) self.stopButton.clicked.connect(self.stopAcq) self.shutterBox.editingFinished.connect(self.shutter) self.hSliderShutter.sliderReleased.connect(self.mSliderShutter) self.gainBox.editingFinished.connect(self.gain) self.hSliderGain.sliderReleased.connect(self.mSliderGain) self.trigg.currentIndexChanged.connect(self.trigger) self.CAM.newData.connect(self.Display) #,QtCore.Qt.DirectConnection) # self.TrigSoft.clicked.connect(self.softTrigger) if self.loop == True: self.closeLoop.stateChanged.connect(self.closeLoopState) def closeLoopState(self): if self.closeLoop.isChecked(): self.visualisation.p1.addItem(self.vLine) self.visualisation.p1.addItem(self.hLine) else: self.visualisation.p1.removeItem(self.vLine) self.visualisation.p1.removeItem(self.hLine) def oneImage(self): #self.nbShot=1 self.acquireOneImage() def nbShotAction(self): ''' number of snapShot ''' nbShot, ok = QInputDialog.getInt(self, 'Number of SnapShot ', 'Enter the number of snapShot ') if ok: self.nbShot = int(nbShot) if self.nbShot <= 0: self.nbShot = 1 def wait(self, seconds): time_end = time.time() + seconds while time.time() < time_end: QtGui.QApplication.processEvents() @pyqtSlot(object) def Display(self, data): '''Display data with visualisation module ''' if self.multi == True: self.wait(0.1) self.data = data self.visualisation.newDataReceived(self.data) self.imageReceived = True self.datareceived.emit(True) time.sleep(0.01) if self.CAM.camIsRunnig == False: self.stopAcq() if self.loop == True: if self.closeLoop.isChecked(): # position de la croix de reference: self.xr = self.visualisation.xc #int(self.conf.value(self.CAM.nbcam+"/xc")) # point vise self.yr = self.visualisation.yc #int(self.conf.value(self.CAM.nbcam+"/yc")) #taille du cercle self.xlim = self.visualisation.rx / 2 #int(self.conf.value(self.nbcam+"/rx"))/2 # taille cercle self.ylim = self.visualisation.ry / 2 #int(self.conf.value(self.nbcam+"/ry"))/2 self.dimy = np.shape(self.data)[1] self.dimx = np.shape(self.data)[0] self.summ = round(data.sum(), 3) self.maxSum = self.dimy * self.dimx * 255 / 3 # si un trier de la camera sature self.maxx = round(self.data.max(), 3) dataF = gaussian_filter(self.data, 5) thresholded_image = np.copy(dataF) threshold = 0.1 # remove possible offset minn = thresholded_image.min() # remove any offset thresholded_image -= minn # remove all values less than threshold*max minn = int(self.maxx * threshold) np.place(thresholded_image, thresholded_image < minn, 0) #self.xec, self.yec= ndimage.center_of_mass(thresholded_image) (self.xec, self.yec) = pylab.unravel_index(thresholded_image.argmax(), self.data.shape) self.vLine.setPos(self.xec) self.hLine.setPos(self.yec) self.deltaX = int(self.xr) - int(self.xec) self.deltaY = int(self.yr) - int(self.yec) if self.maxx < 30 or self.summ > self.maxSum: print('signal too low or too high') self.nbImage = 0 else: self.closeLoopRadio.setChecked(True) if (abs(self.deltaX) >= self.xlim or abs(self.deltaY) > self.ylim) and self.nbImage == self.nbImageMax: # print('xec',self.xec,self.yec,self.xr,self.yr) self.deltaXMoy = int(self.xr) - int(np.mean(self.Xec)) if abs(self.deltaXMoy) >= self.xlim and (abs( self.deltaXMoy) < self.maxMvtX): print('X move the', time.strftime("%Y %m %d %H %M %S"), 'of ', self.deltaXMoy * self.pasX) if self.motor.inv[0] == True: self.motor.MOT[0].rmove(-self.deltaXMoy * self.pasX) else: self.motor.MOT[0].rmove(self.deltaXMoy * self.pasX) self.deltaYMoy = int(self.yr) - int(np.mean(self.Yec)) if abs(self.deltaYMoy) > self.ylim and (abs( self.deltaYMoy) < self.maxMvtY): print('Y move the', time.strftime("%Y %m %d %H %M %S"), 'of', self.deltaYMoy * self.pasY) if self.motor.inv[1] == True: self.motor.MOT[1].rmove(-self.deltaMoy * self.pasY) else: self.motor.MOT[1].rmove(self.deltaYMoy * self.pasY) self.nbImage = 0 self.Xec = [] self.Yec = [] elif (abs(self.deltaX) >= self.xlim or abs(self.deltaY) > self.ylim) and self.nbImage < self.nbImageMax: self.Xec.append(self.xec) self.Yec.append(self.yec) self.nbImage = self.nbImage + 1 else: self.nbImage = 0 self.Xec = [] self.Yec = [] self.closeLoopRadio.setChecked(False) else: self.closeLoopRadio.setChecked(False) def shutter(self): ''' set exposure time ''' sh = self.shutterBox.value() # self.hSliderShutter.setValue(sh) # set value of slider time.sleep(0.1) self.CAM.setExposure(sh) # Set shutter CCD in ms self.conf.setValue(self.nbcam + "/shutter", float(sh)) self.CAM.camParameter["exposureTime"] = sh self.conf.sync() def mSliderShutter(self): # for shutter slider sh = self.hSliderShutter.value() self.shutterBox.setValue(sh) # self.CAM.setExposure(sh) # Set shutter CCD in ms self.conf.setValue(self.nbcam + "/shutter", float(sh)) self.CAM.camParameter["exposureTime"] = sh # self.conf.sync() def gain(self): ''' set gain ''' g = self.gainBox.value() # self.hSliderGain.setValue(g) # set slider value time.sleep(0.1) self.CAM.setGain(g) self.conf.setValue(self.nbcam + "/gain", float(g)) self.conf.sync() def mSliderGain(self): ''' set slider ''' g = self.hSliderGain.value() self.gainBox.setValue(g) # set valeur de la box time.sleep(0.1) self.CAM.setGain(g) self.conf.setValue(self.nbcam + "/gain", float(g)) self.conf.sync() def trigger(self): ''' select trigger mode trigger on trigger off ''' self.itrig = self.trigg.currentIndex() if self.itrig == 1: self.CAM.setTrigger("on") else: self.CAM.setTrigger("off") def acquireOneImage(self): '''Start on acquisition ''' self.imageReceived = False self.runButton.setEnabled(False) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color:gray}" % (self.iconSnap, self.iconSnap)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(False) self.CAM.startOneAcq(self.nbShot) def acquireMultiImage(self): ''' start the acquisition thread ''' self.runButton.setEnabled(False) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setEnabled(False) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) self.stopButton.setEnabled(True) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(False) self.CAM.startAcq() # start mutli image acquisition thread def stopAcq(self): '''Stop acquisition ''' if self.isConnected == True: self.CAM.stopAcq() self.runButton.setEnabled(True) self.runButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconPlay, self.iconPlay)) self.snapButton.setEnabled(True) self.snapButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: transparent ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconSnap, self.iconSnap)) self.stopButton.setEnabled(False) self.stopButton.setStyleSheet( "QToolButton:!pressed{border-image: url(%s);background-color: gray ;border-color: gray;}" "QToolButton:pressed{image: url(%s);background-color: gray ;border-color: gray}" % (self.iconStop, self.iconStop)) self.trigg.setEnabled(True) def close(self): if self.isConnected == True: self.CAM.closeCamera() # self.motor.close() def closeEvent(self, event): ''' closing window event (cross button) ''' if self.isConnected == True: self.stopAcq() time.sleep(0.1) self.close()
class MainForm(QMainWindow): areas = [] toolBoxs = [] tab = 0 ui_ = None debugLevel = 100 mPAreas = {} # Almacena los nombre de submenus areas de menú pineboo mPModulos = {} # Almacena los nombre de submenus modulos de menú pineboo openTabs = [] favoritosW = None wid = None # widget principal def __init__(self, parent=None): super(MainForm, self).__init__(parent) self.ui_ = None @classmethod def setDebugLevel(self, q): MainForm.debugLevel = q def load(self): self.ui_ = pineboolib.project.conn.managerModules().createUI( filedir('plugins/mainform/pineboo/mainform.ui'), None, self) self.w_ = self frameGm = self.frameGeometry() screen = QApplication.desktop().screenNumber( QApplication.desktop().cursor().pos()) centerPoint = QApplication.desktop().screenGeometry(screen).center() frameGm.moveCenter(centerPoint) self.move(frameGm.topLeft()) self.areasTab = QTabWidget() self.areasTab.setTabPosition(QTabWidget.West) self.formTab = QTabWidget() try: self.areasTab.removeItem = self.areasTab.removeTab self.areasTab.addItem = self.areasTab.addTab except Exception: pass self.dockAreasTab = QDockWidget() self.dockAreasTab.setWindowTitle("Módulos") #self.dockAreas = QtWidgets.QDockWidget() self.dockFavoritos = QDockWidget() self.dockFavoritos.setWindowTitle("Favoritos") self.dockForm = QDockWidget() self.dockConsole = None self.dockAreasTab.setWidget(self.areasTab) self.dockAreasTab.setMaximumWidth(400) self.dockFavoritos.setMaximumWidth(400) self.dockFavoritos.setMaximumHeight(500) # self.dockAreasTab.setMinimumWidth(400) # self.dockAreasTab.setMaximumHeight(500) self.dockForm.setWidget(self.formTab) self.addDockWidget(Qt.RightDockWidgetArea, self.dockForm) # self.dockForm.setMaximumWidth(950) self.addDockWidget(Qt.LeftDockWidgetArea, self.dockFavoritos) self.addDockWidget(Qt.LeftDockWidgetArea, self.dockAreasTab) # self.dockAreasTab.show() # self.dockForm.show() # self.areasTab.removeItem(0) #Borramos tab de ejemplo. self.formTab.setTabsClosable(True) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.formTab.tabCloseRequested[int].connect(self.closeFormTab) self.formTab.removeTab(0) #app_icon = QtGui.QIcon('share/icons/pineboo-logo-16.png') # app_icon.addFile(filedir('share/icons/pineboo-logo-16.png'), # QtCore.QSize(16, 16)) # app_icon.addFile(filedir('share/icons/pineboo-logo-24.png'), # QtCore.QSize(24, 24)) # app_icon.addFile(filedir('share/icons/pineboo-logo-32.png'), # QtCore.QSize(32, 32)) # app_icon.addFile(filedir('share/icons/pineboo-logo-48.png'), # QtCore.QSize(48, 48)) # app_icon.addFile(filedir('share/icons/pineboo-logo-64.png'), # QtCore.QSize(64, 64)) # app_icon.addFile(filedir('share/icons/pineboo-logo-128.png'), # QtCore.QSize(128, 128)) # app_icon.addFile(filedir('share/icons/pineboo-logo-256.png'), # QtCore.QSize(256, 256)) # self.setWindowIcon(app_icon) self.setWindowIcon(QtGui.QIcon('share/icons/pineboo-logo-16.png')) self.actionAcercaQt.triggered.connect(pineboolib.project.aboutQt) self.actionAcercaPineboo.triggered.connect(pineboolib.project.aboutPineboo) self.actionFavoritos.triggered.connect(self.changeStateDockFavoritos) self.dockFavoritos.visibilityChanged.connect(self.changeStateActionFavoritos) self.actionModulos.triggered.connect(self.changeStateDockAreas) self.dockAreasTab.visibilityChanged.connect(self.changeStateActionAreas) self.actionTipografia.triggered.connect(pineboolib.project.chooseFont) self.menuPineboo.addSeparator() # self.actionEstilo.triggered.connect(pineboolib.main.styleDialog) # pineboolib.pnapplication.initStyle(self.configMenu) self.setWindowTitle("Pineboo") logger.info("Módulos y pestañas ...") for k, area in sorted(pineboolib.project.areas.items()): self.loadArea(area) for k, module in sorted(pineboolib.project.modules.items()): self.loadModule(module) # Cargando Area desarrollo si procede ... sett_ = FLSettings() if (sett_.readBoolEntry("application/isDebuggerMode", False)): areaDevelop = Struct(idarea="dvl", descripcion="Desarrollo") self.loadArea(areaDevelop) self.loadDevelop() self.restoreOpenedTabs() self.loadState() # Cargamos nombre de vertical util = FLUtil() verticalName = util.sqlSelect("flsettings", "valor", "flkey='verticalName'") cbPosInfo = util.sqlSelect("flsettings", "valor", "flkey='PosInfo'") statusText = "" if verticalName != None: statusText = verticalName if cbPosInfo == 'True': from pineboolib.pncontrolsfactory import SysType sys_ = SysType() statusText += "\t\t\t" + sys_.nameUser() + "@" + sys_.nameBD() self.statusBar().showMessage(statusText) def closeFormTab(self, numero): if isinstance(numero, str): i = 0 name = numero numero = None for n in self.openTabs: if name == n: numero = i break i = i + 1 if numero is not None: logger.debug("Cerrando pestaña número %s ", numero) self.formTab.removeTab(numero) i = 0 for name in self.openTabs: if i == numero: self.openTabs.remove(name) break i = i + 1 def addFormTab(self, action): widget = action.mainform_widget if action.name in self.openTabs: self.closeFormTab(action.name) logger.debug("Añadiendo Form a pestaña %s", action) icon = None try: icon = action.mod.mod.mainform.actions[action.name].icon self.formTab.addTab(widget, icon, widget.windowTitle()) except Exception as e: logger.warning("addFormTab: No pude localizar icono para %s: %s", action.name, e) self.formTab.addTab(widget, widget.windowTitle()) self.formTab.setCurrentWidget(widget) self.openTabs.append(action.name) def loadArea(self, area): assert area.idarea not in self.areas vl = QWidget() vl.layout = QVBoxLayout() # layout de la pestaña vl.layout.setSpacing(0) vl.layout.setContentsMargins(0, 0, 0, 0) vl.layout.setSizeConstraint(QLayout.SetMinAndMaxSize) moduleToolBox = QToolBox(self) # toolbox de cada módulo self.areas.append(area.idarea) self.toolBoxs.append(moduleToolBox) self.tab = self.tab + 1 vl.setLayout(vl.layout) vl.layout.addWidget(moduleToolBox) self.areasTab.addItem(vl, area.descripcion) def loadModule(self, module): logger.debug("loadModule: Procesando %s ", module.name) # Creamos pestañas de areas y un vBLayout por cada módulo. Despues ahí metemos los actions de cada módulo if module.areaid not in self.areas: self.loadArea(Struct(idarea=module.areaid, descripcion=module.areaid)) moduleToolBox = self.toolBoxs[self.areas.index(module.areaid)] vBLayout = QWidget() vBLayout.layout = QVBoxLayout() # layout de cada módulo. vBLayout.layout.setSizeConstraint(QLayout.SetMinAndMaxSize) vBLayout.layout.setSpacing(0) vBLayout.layout.setContentsMargins(0, 0, 0, 0) vBLayout.setLayout(vBLayout.layout) if module.icon[0] != "": pixmap = QtGui.QPixmap(module.icon) moduleToolBox.addItem(vBLayout, QtGui.QIcon(pixmap), module.description) else: moduleToolBox.addItem(vBLayout, module.description) try: self.moduleLoad(vBLayout.layout, module) except Exception: logger.exception("ERROR al procesar modulo %s", module.name) def moduleLoad(self, vBLayout, module): if not module.loaded: module.load() if not module.loaded: logger.warning("moduleLoad: Ignorando modulo %s por fallo al cargar", module.name) return False logger.trace("moduleLoad: Running module %s . . . ", module.name) iconsize = QtCore.QSize(22, 22) iconsize = QtCore.QSize(16, 16) vBLayout.setSpacing(0) vBLayout.setContentsMargins(0, 0, 0, 0) for key in module.mainform.toolbar: action = module.mainform.actions[key] button = QToolButton() button.setText(action.text) button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) button.setIconSize(iconsize) button.setAutoRaise(True) if action.icon: button.setIcon(action.icon) button.clicked.connect(action.run) vBLayout.addWidget(button) self.addToMenuPineboo(action, module) vBLayout.addStretch() def closeEvent(self, evnt): res = QMessageBox.information( QApplication.activeWindow(), "Salir de Pineboo", "¿ Desea salir ?", QMessageBox.Yes, QMessageBox.No) if res == QMessageBox.No: evnt.ignore() self.saveState() def saveState(self): if self: sett_ = FLSettings() sett_.writeEntryList("application/mainForm/tabsOpened", self.openTabs) sett_.writeEntry("application/mainForm/viewFavorites", self.dockFavoritos.isVisible()) sett_.writeEntry("application/mainForm/FavoritesSize", self.dockFavoritos.size()) sett_.writeEntry("application/mainForm/viewAreas", self.dockAreasTab.isVisible()) sett_.writeEntry("application/mainForm/AreasSize", self.dockFavoritos.size()) sett_.writeEntry("application/mainForm/mainFormSize", self.size()) def addToMenuPineboo(self, ac, mod): #print(mod.name, ac.name, pineboolib.project.areas[mod.areaid].descripcion) # Comprueba si el area ya se ha creado if mod.areaid not in self.mPAreas.keys(): areaM = self.menuPineboo.addMenu(QtGui.QIcon('share/icons/gtk-open.png'), pineboolib.project.areas[mod.areaid].descripcion) self.mPAreas[mod.areaid] = areaM else: areaM = self.mPAreas[mod.areaid] # Comprueba si el modulo ya se ha creado if mod.name not in self.mPModulos.keys(): pixmap = None if mod.icon[0] != "": pixmap = QtGui.QPixmap(mod.icon) if pixmap: moduloM = areaM.addMenu(QtGui.QIcon(pixmap), mod.description) else: moduloM = areaM.addMenu(mod.description) self.mPModulos[mod.name] = moduloM else: moduloM = self.mPModulos[mod.name] action_ = moduloM.addAction(ac.icon, ac.text) action_.triggered.connect(ac.run) def restoreOpenedTabs(self): # Cargamos pestañas abiertas sett_ = FLSettings() tabsOpened_ = sett_.readListEntry("application/mainForm/tabsOpened") if tabsOpened_: for t in tabsOpened_: for k, module in sorted(pineboolib.project.modules.items()): if hasattr(module, "mainform"): if t in module.mainform.actions: module.mainform.actions[t].run() break def loadState(self): sett_ = FLSettings() viewFavorites_ = sett_.readBoolEntry("application/mainForm/viewFavorites", True) viewAreas_ = sett_.readBoolEntry("application/mainForm/viewAreas", True) sizeF_ = sett_.readEntry("application/mainForm/FavoritesSize", None) sizeA_ = sett_.readEntry("application/mainForm/AreasSize", None) sizeMF_ = sett_.readEntry("application/mainForm/mainFormSize", None) if sizeF_ is not None: self.dockFavoritos.resize(sizeF_) if sizeA_ is not None: self.dockAreasTab.resize(sizeA_) if sizeMF_ is not None: self.resize(sizeMF_) else: self.showMaximized() """ self.dockFavoritos.setVisible(viewFavorites_) self.actionFavoritos.setChecked(viewFavorites_) self.dockAreasTab.setVisible(viewAreas_) self.actionModulos.setChecked(viewAreas_) """ def changeStateDockFavoritos(self): visible_ = self.actionFavoritos.isChecked() if visible_: sett_ = FLSettings() sizeF_ = sett_.readEntry("application/mainForm/FavoritesSize", None) if sizeF_ is not None: self.dockFavoritos.resize(sizeF_) self.dockFavoritos.setVisible(visible_) def changeStateActionFavoritos(self): if self.dockFavoritos.isVisible(): self.actionFavoritos.setChecked(True) else: self.actionFavoritos.setChecked(False) def changeStateDockAreas(self): visible_ = self.actionModulos.isChecked() if visible_: sett_ = FLSettings() sizeA_ = sett_.readEntry("application/mainForm/AreasSize", None) if sizeA_ is not None: self.dockAreasTab.resize(sizeA_) self.dockAreasTab.setVisible(visible_) def changeStateActionAreas(self): if self.dockAreasTab.isVisible(): self.actionModulos.setChecked(True) else: self.actionModulos.setChecked(False) def loadDevelop(self): moduleToolBox = self.toolBoxs[self.areas.index("dvl")] vBLayout = QWidget() vBLayout.layout = QVBoxLayout() # layout de cada módulo. vBLayout.layout.setSizeConstraint(QLayout.SetMinAndMaxSize) vBLayout.layout.setSpacing(0) vBLayout.layout.setContentsMargins(0, 0, 0, 0) vBLayout.setLayout(vBLayout.layout) button = QToolButton() button.setText("Consola") button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) iconsize = QtCore.QSize(16, 16) button.setIconSize(iconsize) button.setAutoRaise(True) button.setIcon(QtGui.QIcon('share/icons/terminal.png')) button.clicked.connect(self.showConsole) vBLayout.layout.addWidget(button) moduleToolBox.addItem(vBLayout, "Desarrollo") #self.addToMenuPineboo(action, module) def showConsole(self): if not self.dockConsole: self.dockConsole = QDockWidget() self.dockConsole.setWindowTitle("Consola") self.addDockWidget(Qt.BottomDockWidgetArea, self.dockConsole) self.teo_ = OutputWindow() self.dockConsole.setWidget(self.teo_) self.dockConsole.setVisible(True)
class Jigsaw(QMainWindow, Ui_MainWindow): """ 拼图主程序 """ saveData = [] def __init__(self, parent=None): """ 界面初始化 载入历史时间 记录时间初始化 载入游戏 """ super(Jigsaw, self).__init__(parent) self.setupUi(self) self.initUi() self.puzzleImage = QPixmap("./img/Peppa.png") self.saveData = self.loadTime() self.dock2 = QDockWidget("完整的图片", self) self.dock2.resize(400, 400) self.setupPuzzle() self.initTimeUi() def initUi(self): """ 一些简单布局 """ self.setWindowFlags(Qt.Dialog) self.setWhatsThis("这是一个拼图小游戏") frameLayout = QHBoxLayout(self.frame) self.puzzleshow = PuzzleShow(400) self.puzzlepiece = PuzzlePiece(self.puzzleshow.pieceSize()) frameLayout.addWidget(self.puzzlepiece) frameLayout.addWidget(self.puzzleshow) self.setCentralWidget(self.frame) self.puzzleshow.puzzleCompleted.connect(self.setCompleted) # 当我们完成游戏的时候会发出puzzleCompleted信号,这个信号是连接setCompleted()函数的 def initTimeUi(self): """ 游戏时间初始化 """ self.dock = QDockWidget("游戏时间", self) self.label = QLabel("当前游戏用时:0秒,最佳时间:0秒") self.label.setStyleSheet("color: rgb(255, 0, 0);font: 14pt \"微软雅黑\";") self.dock.setWidget(self.label) self.addDockWidget(Qt.BottomDockWidgetArea, self.dock) def setCompleted(self): """ 完成后弹出游戏结果对话框 """ self.timer.stop() self.saveData.append(self.time) self.saveTime() info = "恭喜通关成功!用时:{}秒,继续努力吧!\n按下OK继续!".format(self.time) QMessageBox.information(self, "通过成功", info, QMessageBox.Ok) self.setupPuzzle() # 游戏完成后,我们的定时器会停止。保存当前游戏时间。弹出恭喜对话框。游戏重新初始化(setupPuzzle()) def setupPuzzle(self): """ 游戏初始化 """ size = min(self.puzzleImage.width(), self.puzzleImage.height()) #游戏图片尺寸 self.puzzleImage = self.puzzleImage.copy( (self.puzzleImage.width() - size) / 2, (self.puzzleImage.height() - size) / 2, size, size).scaled(self.puzzleshow.width(), self.puzzleshow.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) #得到压缩尺寸后的图形 if self.puzzlepiece.count() > 1: self.puzzlepiece.clear() #只有在当前拼图列表存在拼图的情况下才能清空列表 for y in range(5): for x in range(5): pieceSize = self.puzzleshow.pieceSize() piece = self.puzzleImage.copy(x * pieceSize, y * pieceSize, pieceSize, pieceSize) self.puzzlepiece.addPiece(piece, QPoint(x, y)) #切割图片并添加到列表中 for i in range(self.puzzlepiece.count()): if random.random() * 10 > 3: item = self.puzzlepiece.takeItem(i) self.puzzlepiece.insertItem(0, item) #图片随机排序 self.puzzleshow.clear() #还原的图形展示小部件清空 self.setDock(self.puzzleImage) #完整的图形刷新 self.time = 0 self.timing() def loadTime(self): """ 载入游戏时间数据 """ pathname = "m.dat" if not (os.path.exists(pathname) and os.path.isfile(pathname)): data = [100000] with codecs.open("m.dat", "wb") as f: pickle.dump(data, f) with codecs.open("m.dat", "rb") as f: data = pickle.load(f) return data def saveTime(self): """ 保存游戏时间 """ with codecs.open("m.dat", "wb") as f: pickle.dump(self.saveData, f) def timing(self): """ 开始计时 """ self.timer = QTimer() self.timer.start(1000) self.timer.timeout.connect(self.second) def second(self): """ 显示游戏时间 """ self.time += 1 timeinfo = "当前游戏用时:{}秒,最佳时间:{}秒".format(self.time, min(self.saveData)) self.label.setText(timeinfo) def setDock(self, pix): """ 显示还原后的图片 """ label2 = QLabel() label2.setScaledContents(True) label2.setPixmap(pix) self.dock2.setWidget(label2) self.dock2.setFloating(True) @pyqtSlot() def on_action_O_triggered(self): """ 选择图片并开始游戏 """ fileName = QFileDialog.getOpenFileName(self, "打开文件", "./img", ("Images (*.png *.jpg)")) filepath = fileName[0] if filepath: self.puzzleImage = QPixmap(filepath) self.dock2.close() # 完成的拼图 self.setupPuzzle() # 游戏初始化 self.dock2.show() # 刷新一下这个画面,否则画面可能不会变 else: QMessageBox.warning(self, "打开图片", "图片加载失败!", QMessageBox.Cancel) return @pyqtSlot() def on_action_E_triggered(self): """ 退出游戏 """ self.close() @pyqtSlot() def on_action_R_triggered(self): """ 重新开始游戏 """ self.setupPuzzle() @pyqtSlot() def on_action_P_triggered(self): """ 重新显示完成的图片 """ self.dock2.close() self.dock2.show() @pyqtSlot() def on_action_J_triggered(self): """ 关于 """ QMessageBox.information(self, "关于", "学点编程吧出品,必属精品!")
def init_ui(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) ''' QText Edits ''' self.listing_gui = QLineEdit('', self) self.listing_gui.setFont(QFont('Arial', 12)) self.listing_gui.setPlaceholderText('Listing: ') self.listing_gui.resize(200, 30) self.listing_gui.move(0, 30) self.listing_gui.returnPressed.connect(self.get_listing) #width = listing_gui.frameGeometry().width() #height = listing_gui.frameGeometry().height() #print(width) #print(height) self.website_gui = QLineEdit('', self) self.website_gui.setFont(QFont('Arial', 12)) self.website_gui.setPlaceholderText('Website: ') self.website_gui.resize(200, 30) self.website_gui.move(0, 60) self.website_gui.returnPressed.connect(self.get_website) self.email_gui = QLineEdit('', self) self.email_gui.setFont(QFont('Arial', 12)) self.email_gui.setPlaceholderText('Email Address: ') self.email_gui.resize(200, 30) self.email_gui.move(0, 90) self.email_gui.returnPressed.connect(self.get_email) self.username_gui = QLineEdit('', self) self.username_gui.setFont(QFont('Arial', 12)) self.username_gui.setPlaceholderText('Username: '******'', self) self.password_gui.setFont(QFont('Arial', 12)) self.password_gui.setPlaceholderText('Password: '******''' End QText Edits ''' table = QTableWidget(self) table.setColumnCount(5) table.setRowCount(1) table.setHorizontalHeaderLabels('Listing;Website;Email Address;Username;Password'.split(";")) table.setItem(0, 0, QTableWidgetItem('Example Listing')) table.setItem(0, 1, QTableWidgetItem('https://example_website.com')) table.setItem(0, 2, QTableWidgetItem('*****@*****.**')) table.setItem(0, 3, QTableWidgetItem('ExampleUser66')) table.setItem(0, 4, QTableWidgetItem('ExAmPlEpassW0rd872@##@1')) table.resizeColumnsToContents() table.resizeRowsToContents() dock = QDockWidget('Table', self) dock.setWidget(table) dock.resize(800, 650 - 200) dock.move(0, 180) ''' Menu ''' mainMenu = self.menuBar() fileMenu = mainMenu.addMenu('File') exitButton = QAction('Exit', self) exitButton.setShortcut('Ctrl+Q') exitButton.setStatusTip('Exit application') exitButton.triggered.connect(self.close) printButton = QAction('Print File', self) printButton.setShortcut('Ctrl+P') printButton.setStatusTip('Print File') #printButton.triggered.connect() fileMenu.addAction(printButton) fileMenu.addAction(exitButton) editMenu = mainMenu.addMenu('Edit') viewMenu = mainMenu.addMenu('View') displayButton = QAction('Display All', self) displayButton.setShortcut('Ctrl+V') displayButton.setStatusTip('Display Entire File') #displayButton.triggered.connect() viewMenu.addAction(displayButton) searchMenu = mainMenu.addMenu('Search') searchStringButton = QAction('Search String', self) searchStringButton.setShortcut('Ctrl+S') searchStringButton.setStatusTip('Enter listing name in text box to search for that listing') #searchStringButton.triggered.connect() searchRowButton = QAction('Search Row', self) searchRowButton.setShortcut('Ctrl+R') searchRowButton.setStatusTip('Search a specific row') #searchRowButton.triggered.connect() searchColumnButton = QAction('Search Column', self) searchColumnButton.setShortcut('Ctrl+Y') searchColumnButton.setStatusTip('Enter the specific column you wish to search') #searchColumnButton.triggered.connect() searchMenu.addAction(searchStringButton) searchMenu.addAction(searchRowButton) searchMenu.addAction(searchColumnButton) toolsMenu = mainMenu.addMenu('Tools') helpMenu = mainMenu.addMenu('Help') ''' End Menu ''' self.show()
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): maxWidth = QDesktopWidget().availableGeometry().width() maxHeight = QDesktopWidget().availableGeometry().height() workSpace = QWidget(self) #### MainWindow Configuration self.setWindowTitle("Application") self.setWindowIcon(QIcon("icon.png")) self.tray_icon = QSystemTrayIcon(QIcon("icon.png")) self.tray_icon.show() #### Tray MENU ################# trayIconMenu = QMenu(self) trayIconMenu.setTitle("Main menu") trayIconMenu.addAction("Show Main Window", self.showMainWindow) trayIconMenu.addAction("Switch chat", self.toggleDockWidget) trayIconMenu.addSeparator() trayIconMenu.addAction("Quit", self.close) self.tray_icon.setContextMenu(trayIconMenu) ###################################### #### MENUBAR description: ################# mainmenu = self.menuBar() file = mainmenu.addMenu("File") file.addAction("isFloating", self.floatingInfo) file.addAction("Toggle Chat", self.toggleDockWidget) file.addAction("Close", self.close) ###################### self.dockWidget = QDockWidget("Messenger", self) self.dockWidget.setFloating(True) self.dockWidget.setVisible(True) self.dockWidget.setMinimumSize(300, 460) self.dockWidget.setMaximumSize(maxWidth / 2, maxHeight) self.dockWidget.setBaseSize(maxWidth / 2, maxHeight) self.dockWidget.resize(maxWidth / 4, maxHeight / 1.5) self.dockWidget.setFeatures(QDockWidget.NoDockWidgetFeatures) self.dockWidget.setVisible(False) #### TODO:" set dockWidget widgets" ################ messengerWidget = QWidget() masterVertical = QVBoxLayout() messengerWidget.setLayout(masterVertical) slaveHorizont = QHBoxLayout() subSlaveVertical = QVBoxLayout() msgSpace = QListView() textEdit = QTextEdit() sendBtn = QPushButton("Send") masterVertical.addWidget(msgSpace) masterVertical.addLayout(slaveHorizont) slaveHorizont.addWidget(textEdit) slaveHorizont.addLayout(subSlaveVertical) subSlaveVertical.addWidget(sendBtn) # self.dockWidget.setLayout(QVBoxLayout()) # print(self.dockWidget.setLayout(QVBoxLayout())) ############################################################ # self.statusBar() toggleDockWidgetBtn = QPushButton("Show geomerty", workSpace) toggleDockWidgetBtn.move(10, 40) toggleDockWidgetBtn.clicked.connect(self.showGeometry) #### TEST BUTONS #### hideBtn = QPushButton("hide main", workSpace) hideBtn.move(10, 70) hideBtn.clicked.connect(self.hideMainWindow) ####################################################### self.setGeometry(300, 300, 300, 500) self.dockWidget.resize(333, 1000) self.setCentralWidget(workSpace) self.addDockWidget(Qt.RightDockWidgetArea, self.dockWidget) def toggleDockWidget(self): flag = False if self.dockWidget.isVisible() else True text = "Messenger status was changed to {}".format( "visible" if flag else "hide") self.dockWidget.setVisible(flag) # self.dockWidget.setGeometry(650, 300, 200, 500) #### SET DOCKWINDOW GEAMETRY AND POSITION qtRect = self.dockWidget.frameGeometry() rightPoint = QDesktopWidget().availableGeometry().bottomRight() #### FOR LINUX POSITION ############################### # qtRect.moveBottomRight(rightPoint) # self.dockWidget.move(qtRect.bottomRight()) #### FOR WINDOWS POSITION ############################# qtRect.moveBottomRight(rightPoint) self.dockWidget.move(qtRect.topLeft()) ############################################################## self.statusBar().showMessage(text, 500) #### test functionality def showGeometry(self): availGeometry = QDesktopWidget().availableGeometry() self.statusBar().showMessage("Available geometry.") print("Available geometry: ", availGeometry) print("Right point: ", QDesktopWidget().availableGeometry().bottomRight()) print("DockWidget frame bottomRight: ", self.dockWidget.frameGeometry().bottomRight()) print("DockWidget frame topLeft: ", self.dockWidget.frameGeometry().topLeft()) print("\n" + "|---|" * 15 + "\n") def hideMainWindow(self): self.hide() def showMainWindow(self): self.show() def floatingInfo(self): flag = False if self.dockWidget.isFloating() else True print("dockWidget status is: ", flag) self.dockWidget.setFloating(flag)