def writeVersionInfo(): try: with open(resource_path('./version.json'), 'w') as f: info = {'build': __build__, 'date': __versiondate__.toordinal()} json.dump(info, f) except: print("Error: could not write version info to file 'version.json'")
def __init__(self, parent): super(LicenseDialog, self).__init__(parent) self.info = QtWidgets.QTextBrowser(self) self.info.setReadOnly(True) self.info.setOpenLinks(False) self.info.setOpenExternalLinks(False) # text = open(resource_path('./GPLv3.html')).read() # self.info.setHtml(text) self.info.setSource( QtCore.QUrl.fromLocalFile(resource_path('GPLv3.html'))) # OK button self.button = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self) self.button.accepted.connect(self.accept) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.info) #layout.addStretch(1) layout.addWidget(self.button) self.setWindowTitle('GNU General Public License...') self.resize(500, 600)
def readVersionInfo(): global __build__ global __versiondate__ try: with open(resource_path('./version.json')) as f: info = json.load(f) __build__ = int(info['build']) __versiondate__ = date.fromordinal(int(info['date'])) except: print("Error: could not read version info from file 'version.json'")
def __init__(self, parent, licenseDialog): super(AboutDialog, self).__init__(parent) self.licenseDialog = licenseDialog pixmap = QtGui.QPixmap(resource_path('./img/about.png')) img = QtWidgets.QLabel(self) img.setPixmap(pixmap) self.info = QtWidgets.QTextBrowser(self) self.info.setReadOnly(True) self.info.setFixedWidth(560) self.info.setFixedHeight(192) self.info.setHtml('<h3>Python Classification Toolbox</h3>' + '<font color="#909090"><i>Study popular machine learning algorithms and create your own implementations in Python for a deeper understanding of the algorithms!</i></font><br><br>' 'Copyright © 2016 Stefan Steidl<br>' + 'Pattern Recognition Lab<br>' + 'Computer Science Department 5<br>'+ 'Friedrich-Alexander University Erlangen-Nuremberg<br>' + '<a href="mailto:[email protected]">[email protected]</a><br><br>' + 'This program comes with ABSOLUTELY NO WARRANTY; for details click <a href="func://warranty">here</a>. ' + 'This is free software, and you are welcome to redistribute it ' + 'under certain conditions; click <a href="func://gpl">here</a> for details.' ) self.info.anchorClicked.connect(self.onInfoClicked) layout = QtWidgets.QHBoxLayout() layout.addWidget(img) layout.addWidget(self.info) layout.addStretch(1) box = QtWidgets.QWidget() box.setLayout(layout) # OK button self.button = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self) self.button.accepted.connect(self.accept) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(box) layout.addStretch(1) layout.addWidget(self.button) layout.setSizeConstraint(QtGui.QLayout.SetFixedSize) self.setWindowTitle('About...')
def initUI(self): self.clusteringParameters = ClusteringParameters(self) self.dimRedParameters = DimensionalityReductionParameters(self) self.classifierParameters = ClassifierParameters(self) self.regressionParameters = RegressionParameters(self) self.densityEstimationParameters = DensityEstimationParameters(self) self.probabilityDensityViewer = ProbabilityDensityViewer(self) self.licenseDialog = LicenseDialog(self) self.aboutDialog = AboutDialog(self, self.licenseDialog) self.infoDialog = InfoDialog(self) self.operationStack = OperationStack(self) self.createSamplesDockWidget = CreateSamplesProperties(self) self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, self.createSamplesDockWidget) self.statusbar = QtWidgets.QStatusBar() self.setStatusBar(self.statusbar) self.featurespace = FeatureSpace(self, self.statusbar, self.createSamplesDockWidget) self.setCentralWidget(self.featurespace) self.classifier = None self.regressor = None self.densityEstimator = None featureSpaceNewAction = QtWidgets.QAction('&New', self) featureSpaceNewAction.setShortcut('Ctrl+N') featureSpaceNewAction.setStatusTip('Create empty feature space') featureSpaceNewAction.triggered.connect(self.newFeatureSpace) featureSpaceOpenAction = QtWidgets.QAction('&Open...', self) featureSpaceOpenAction.setShortcut('Ctrl+O') featureSpaceOpenAction.setStatusTip('Load a feature space') featureSpaceOpenAction.triggered.connect(self.openFeatureSpace) featureSpaceSaveAction = QtWidgets.QAction('&Save', self) featureSpaceSaveAction.setShortcut('Ctrl+S') featureSpaceSaveAction.setStatusTip('Save the feature space') featureSpaceSaveAction.triggered.connect(self.saveFeatureSpace) featureSpaceSaveAsAction = QtWidgets.QAction('Save &as...', self) featureSpaceSaveAsAction.setStatusTip( 'Save the feature space to a new file') featureSpaceSaveAsAction.triggered.connect(self.saveAsFeatureSpace) featureSpaceImportAction = QtWidgets.QAction('&Import samples...', self) featureSpaceImportAction.setStatusTip( 'Read feature vectors from an ASCII file') featureSpaceImportAction.triggered.connect(self.importFeatureSpace) featureSpaceExportAction = QtWidgets.QAction('&Export samples...', self) featureSpaceExportAction.setStatusTip( 'Write the feature vectors to an ASCII file') featureSpaceExportAction.triggered.connect(self.exportFeatureSpace) featureSpaceSaveImageAction = QtWidgets.QAction( 'Export as image...', self) featureSpaceSaveImageAction.setStatusTip( 'Export the feature space as image') featureSpaceSaveImageAction.triggered.connect( self.exportFeatureSpaceAsImage) self.__featureSpaceHideSamplesAction = QtWidgets.QAction( 'Hide samples', self) self.__featureSpaceHideSamplesAction.setStatusTip('Hide all samples') self.__featureSpaceHideSamplesAction.setShortcut('F8') self.__featureSpaceHideSamplesAction.triggered.connect( self.hideSamples) self.__featureSpaceHideSamplesAction.setCheckable(True) self.__featureSpaceHideSamplesAction.setChecked(False) exitAction = QtWidgets.QAction('&Quit', self) exitAction.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_Q) exitAction.setStatusTip('Exit the Python Classification Toolbox') exitAction.triggered.connect(self.close) menubar = self.menuBar() menubar.setNativeMenuBar(False) featureSpaceMenu = menubar.addMenu('&Feature Space') featureSpaceMenu.addAction(featureSpaceNewAction) featureSpaceMenu.addAction(featureSpaceOpenAction) featureSpaceMenu.addAction(featureSpaceSaveAction) featureSpaceMenu.addAction(featureSpaceSaveAsAction) featureSpaceMenu.addSeparator() featureSpaceMenu.addAction(featureSpaceImportAction) featureSpaceMenu.addAction(featureSpaceExportAction) featureSpaceMenu.addAction(featureSpaceSaveImageAction) featureSpaceMenu.addSeparator() featureSpaceMenu.addAction(self.__featureSpaceHideSamplesAction) featureSpaceMenu.addSeparator() featureSpaceMenu.addAction(exitAction) clusteringKMeansAction = QtWidgets.QAction('k-Means Clustering...', self) clusteringKMeansAction.setStatusTip('k-Means Clustering') clusteringKMeansAction.triggered.connect( lambda: self.clusterWithParameters(Clustering.kMeans)) clusteringGMMAction = QtWidgets.QAction('Gaussian Mixture Model...', self) clusteringGMMAction.setStatusTip('Gaussian Mixture Model') clusteringGMMAction.triggered.connect( lambda: self.clusterWithParameters(Clustering.GMM)) clusteringParametersAction = QtWidgets.QAction('Parameters...', self) clusteringParametersAction.setStatusTip( 'Edit the parameters of the clustering algorithms') clusteringParametersAction.triggered.connect( self.editClusteringParameters) clusteringMenu = menubar.addMenu('C&lustering') clusteringMenu.addAction(clusteringKMeansAction) clusteringMenu.addAction(clusteringGMMAction) clusteringMenu.addSeparator() clusteringMenu.addAction(clusteringParametersAction) dimRedPCAAction = QtWidgets.QAction('Principal Component Analysis...', self) dimRedPCAAction.setStatusTip('Principal Component Analysis (PCA)') dimRedPCAAction.triggered.connect( lambda: self.reduceDimensionalityWithParameters( DimensionalityReduction.PCA)) dimRedMenu = menubar.addMenu('&Dimensionality Reduction') dimRedMenu.addAction(dimRedPCAAction) classificationLogRegAction = QtWidgets.QAction( 'Linear Logistic Regression...', self) classificationLogRegAction.setStatusTip( 'Linear Logistic Regression classifier') classificationLogRegAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.LogReg)) classificationNormAction = QtWidgets.QAction('Norm classifier...', self) classificationNormAction.setStatusTip( 'Classification based on the distance to the class centers') classificationNormAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.Norm)) classificationNaiveBayesAction = QtWidgets.QAction('Naive Bayes', self) classificationNaiveBayesAction.setStatusTip('Naive Bayes classifier') classificationNaiveBayesAction.triggered.connect( lambda: self.classify(Classifier.NaiveBayes)) classificationGaussianAction = QtWidgets.QAction( 'Gaussian classifier', self) classificationGaussianAction.setStatusTip('Gaussian classifier') classificationGaussianAction.triggered.connect( lambda: self.classify(Classifier.Gauss)) classificationGMMAction = QtWidgets.QAction('GMM classifier...', self) classificationGMMAction.setStatusTip( 'Gaussian Mixture Model classifier') classificationGMMAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.GMM)) classificationKNNAction = QtWidgets.QAction('kNN...', self) classificationKNNAction.setStatusTip('k Nearest Neighbor classifier') classificationKNNAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.kNN)) classificationLinRegAction = QtWidgets.QAction('Linear Regression...', self) classificationLinRegAction.setStatusTip('Linear Regression classifier') classificationLinRegAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.LinReg)) classificationPerceptronAction = QtWidgets.QAction( 'Rosenblatt\'s Perceptron...', self) classificationPerceptronAction.setStatusTip('Rosenblatt\'s Perceptron') classificationPerceptronAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.Perceptron)) classificationMLPAction = QtWidgets.QAction('Multilayer Perceptron...', self) classificationMLPAction.setStatusTip('Multilayer Perceptron') classificationMLPAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.MLP)) try: # requires sklearn >= 0.18.dev0 neural_network.MLPClassifier() except: classificationMLPAction.setEnabled(False) classificationSVMAction = QtWidgets.QAction('SVM...', self) classificationSVMAction.setStatusTip('Support Vector Machine') classificationSVMAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.SVM)) classificationDecisionTreeAction = QtWidgets.QAction( 'Decision Tree...', self) classificationDecisionTreeAction.setStatusTip( 'Decision Tree classifier') classificationDecisionTreeAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.DecisionTree)) classificationRandomForestAction = QtWidgets.QAction( 'Random Forest...', self) classificationRandomForestAction.setStatusTip( 'Random Forest classifier') classificationRandomForestAction.triggered.connect( lambda: self.classifyWithParameters(Classifier.RandomForest)) classificationParametersAction = QtWidgets.QAction( 'Parameters...', self) classificationParametersAction.setStatusTip( 'Edit the parameters of the classification algorithms') classificationParametersAction.triggered.connect( self.editClassificationParameters) classificationNoneAction = QtWidgets.QAction('None', self) classificationNoneAction.setStatusTip('Delete classification results') classificationNoneAction.triggered.connect(self.unsetClassifier) classificationMenu = menubar.addMenu('&Classification') classificationMenu.addAction(classificationLogRegAction) classificationMenu.addAction(classificationNormAction) classificationMenu.addAction(classificationNaiveBayesAction) classificationMenu.addAction(classificationGaussianAction) classificationMenu.addAction(classificationGMMAction) classificationMenu.addAction(classificationKNNAction) classificationMenu.addAction(classificationLinRegAction) classificationMenu.addAction(classificationPerceptronAction) classificationMenu.addAction(classificationMLPAction) classificationMenu.addAction(classificationSVMAction) classificationMenu.addAction(classificationDecisionTreeAction) classificationMenu.addAction(classificationRandomForestAction) classificationMenu.addSeparator() classificationMenu.addAction(classificationParametersAction) classificationMenu.addAction(classificationNoneAction) regressionLinRegAction = QtWidgets.QAction('Linear Regression...', self) regressionLinRegAction.setStatusTip('Linear Regression') regressionLinRegAction.triggered.connect( lambda: self.regressionWithParameters(Regression.LinearRegression)) regressionSVRAction = QtWidgets.QAction('Support Vector Regression...', self) regressionSVRAction.setStatusTip('Support Vector Regression (SVR)') regressionSVRAction.triggered.connect( lambda: self.regressionWithParameters(Regression.SVR)) regressionRegressionTreeAction = QtWidgets.QAction( 'Regression Tree...', self) regressionRegressionTreeAction.setStatusTip('Regression Tree') regressionRegressionTreeAction.triggered.connect( lambda: self.regressionWithParameters(Regression.RegressionTree)) regressionRegressionForestAction = QtWidgets.QAction( 'Regression Forest...', self) regressionRegressionForestAction.setStatusTip('Regression Forest') regressionRegressionForestAction.triggered.connect( lambda: self.regressionWithParameters(Regression.RegressionForest)) regressionParametersAction = QtWidgets.QAction('Parameters...', self) regressionParametersAction.setStatusTip( 'Edit the parameters of the regression algorithms') regressionParametersAction.triggered.connect( self.editRegressionParameters) regressionNoneAction = QtWidgets.QAction('None', self) regressionNoneAction.setStatusTip('Delete regression result') regressionNoneAction.triggered.connect(self.unsetRegressor) regressionMenu = menubar.addMenu('&Regression') regressionMenu.addAction(regressionLinRegAction) regressionMenu.addAction(regressionSVRAction) regressionMenu.addAction(regressionRegressionTreeAction) regressionMenu.addAction(regressionRegressionForestAction) regressionMenu.addSeparator() regressionMenu.addAction(regressionParametersAction) regressionMenu.addAction(regressionNoneAction) densityEstimationHistogramAction = QtWidgets.QAction( 'Histogram...', self) densityEstimationHistogramAction.setStatusTip('Histogram estimation') densityEstimationHistogramAction.triggered.connect( lambda: self.densityEstimationWithParameters(DensityEstimation. Histogram)) densityEstimationSphereAction = QtWidgets.QAction( 'Sphere Density Estimation...', self) densityEstimationSphereAction.setStatusTip('Sphere Density Estimation') densityEstimationSphereAction.triggered.connect( lambda: self.densityEstimationWithParameters( DensityEstimation.SphereDensityEstimation)) densityEstimationKernelAction = QtWidgets.QAction( 'Kernel Density Estimation...', self) densityEstimationKernelAction.setStatusTip('Kernel Density Estimation') densityEstimationKernelAction.triggered.connect( lambda: self.densityEstimationWithParameters( DensityEstimation.KernelDensityEstimation)) densityEstimationParametersAction = QtWidgets.QAction( 'Parameters...', self) densityEstimationParametersAction.setStatusTip( 'Edit the parameters of the density estimation algorithms') densityEstimationParametersAction.triggered.connect( self.editDensityEstimationParameters) densityEstimationNoneAction = QtWidgets.QAction('None', self) densityEstimationNoneAction.setStatusTip( 'Delete density estimation result') densityEstimationNoneAction.triggered.connect( self.unsetDensityEstimation) densityEstimationMenu = menubar.addMenu('Density &Estimation') densityEstimationMenu.addAction(densityEstimationHistogramAction) densityEstimationMenu.addAction(densityEstimationSphereAction) densityEstimationMenu.addAction(densityEstimationKernelAction) densityEstimationMenu.addSeparator() densityEstimationMenu.addAction(densityEstimationParametersAction) densityEstimationMenu.addAction(densityEstimationNoneAction) aboutAction = QtWidgets.QAction('About...', self) aboutAction.setStatusTip('About this software') aboutAction.triggered.connect(self.aboutDialog.exec_) licenseAction = QtWidgets.QAction('License...', self) licenseAction.setStatusTip('GNU General Public License') licenseAction.triggered.connect(self.licenseDialog.showLicense) infoAction = QtWidgets.QAction('Info...', self) infoAction.setStatusTip('Information about the Python distribution') infoAction.triggered.connect(self.infoDialog.exec_) helpMenu = menubar.addMenu('&Help') helpMenu.addAction(aboutAction) helpMenu.addAction(licenseAction) helpMenu.addAction(infoAction) # exitAction = QtGui.QAction(QtGui.QIcon('./img/exit.png'), 'Exit', self) # exitAction.setShortcut('Ctrl+Q') # exitAction.triggered.connect(QtGui.qApp.quit) # coordinateSystemAction = QtGui.QAction(QtGui.QIcon('./img/coord.png'), 'Move coordinate system', self) # coordinateSystemAction.triggered.connect(self.onMoveCoordinateSystem) # gaussCreateAction = QtGui.QAction(QtGui.QIcon('./img/create_gauss.png'), 'Create Gaussians', self) # gaussCreateAction.triggered.connect(self.onCreateGaussians) # gaussModifyAction = QtGui.QAction(QtGui.QIcon('./img/modify_gauss.png'), 'Modify Gaussians', self) # gaussModifyAction.triggered.connect(self.onModifyGaussians) self.moveCoordinateSystemButton = QtWidgets.QToolButton() self.moveCoordinateSystemButton.setIcon( QtGui.QIcon(resource_path('./img/coord.png'))) self.moveCoordinateSystemButton.setStatusTip( 'Move the coordinate system by dragging the mouse or zoom in or out using the mouse scroll wheel' ) self.moveCoordinateSystemButton.setCheckable(True) self.moveCoordinateSystemButton.setChecked(True) self.moveCoordinateSystemButton.clicked.connect( self.onMoveCoordinateSystem) self.createGaussButton = QtWidgets.QToolButton() self.createGaussButton.setIcon( QtGui.QIcon(resource_path('./img/create_gauss.png'))) self.createGaussButton.setStatusTip( 'Create samples drawn from a new Gaussian pdf by spanning the bounding box of the covariance matrix' ) self.createGaussButton.setCheckable(True) self.createGaussButton.clicked.connect(self.onCreateGaussians) self.modifyGaussButton = QtWidgets.QToolButton() self.modifyGaussButton.setIcon( QtGui.QIcon(resource_path('./img/modify_gauss.png'))) self.modifyGaussButton.setStatusTip( 'Modify existing Gaussian pdfs by left of right clicking on the center' ) self.modifyGaussButton.setCheckable(True) self.modifyGaussButton.clicked.connect(self.onModifyGaussians) self.createSamplesButton = QtWidgets.QToolButton() self.createSamplesButton.setIcon( QtGui.QIcon(resource_path('./img/samples.png'))) self.createSamplesButton.setStatusTip( 'Create and modify individual samples by spanning a rectangle that contains one or more samples' ) self.createSamplesButton.setCheckable(True) self.createSamplesButton.clicked.connect(self.onCreateSamples) self.toolbar = QtWidgets.QToolBar(self) self.toolbar.setIconSize(QtCore.QSize(48, 48)) self.addToolBar(QtCore.Qt.RightToolBarArea, self.toolbar) # self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) # self.toolbar.addAction(coordinateSystemAction) # self.toolbar.addAction(gaussCreateAction) # self.toolbar.addAction(gaussModifyAction) self.toolbar.addWidget(self.moveCoordinateSystemButton) self.toolbar.addWidget(self.createGaussButton) self.toolbar.addWidget(self.modifyGaussButton) self.toolbar.addWidget(self.createSamplesButton) QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Z"), self, self.undo) QtGui.QShortcut(QtGui.QKeySequence("Ctrl+R"), self, self.redo) self.printLicenseMessage()
def showWarranty(self): # three backslashes needed for Windows url = QtCore.QUrl("file:///" + resource_path('GPLv3.html') + "#section15") self.info.setSource(url) self.exec_()
def showLicense(self): url = QtCore.QUrl.fromLocalFile(resource_path('GPLv3.html')) self.info.setSource(url) self.exec_()