def showOpenFile(self): dlg = QFileDialog(self) dlg.setWindowTitle(self.tr("Open Video Files")) dlg.setWindowModality(Qt.WindowModal) mimeFilters = [ "video/mp4", "video/quicktime", "video/x-msvideo", "video/x-ms-wmv" ] globPatterns = [] db = QMimeDatabase() for m in mimeFilters: mimeType = db.mimeTypeForName(m) if not mimeType.isValid(): logger.warn("Invalid MIME type: {}".format(m)) continue globPatterns.extend(mimeType.globPatterns()) globText = ' '.join(globPatterns) logger.debug("Video glob patterns: {}".format(globText)) dlg.setNameFilters([ self.tr("Video Files ({})").format(globText), self.tr("All Files (*)") ]) dlg.setAcceptMode(QFileDialog.AcceptOpen) dlg.setOption(QFileDialog.ReadOnly, True) dlg.setOption(QFileDialog.DontUseCustomDirectoryIcons, True) dlg.setLabelText(QFileDialog.Accept, self.tr("Open Movie")) dlg.setFileMode(QFileDialog.ExistingFiles) if dlg.exec_(): filenames = dlg.selectedFiles() self.processVideoFiles(filenames)
def readMap(filename=None): """ Import alternate map file. """ if filename is None: fd = QFileDialog(None, "Load map file") fd.setLabelText(QFileDialog.Accept, "Import") fd.setNameFilters(["Map Files (*.txt)", "All Files (*)"]) fd.setOptions(QFileDialog.DontUseNativeDialog) fd.setViewMode(QFileDialog.List) fd.setFileMode(QFileDialog.ExistingFile) if fd.exec(): fileNames = fd.selectedFiles() filename = fileNames[0] else: pass numlines = sum(1 for line in open(filename)) if numlines < 2: print('Map file is empty.') return else: print('Map has ', numlines, ' lines.') # read the first line - target coords in HH:MM:SS.SS, DD:MM:SS.SS file = open(filename) line = file.readline() if len(line.split()) != 6: print('File is not a map file.') return file.close() mapListPath = filename numMapPoints = numlines - 1 return numMapPoints, mapListPath
def browse(self, type_='process'): """Open a dialog to choose either .mgf or metadata.txt file""" dialog = QFileDialog(self) dialog.setFileMode(QFileDialog.ExistingFile) if type_ == 'process': dialog.setNameFilters(["All supported formats (*.mgf *.msp)", "Mascot Generic Format (*.mgf)", "NIST Text Format of Individual Spectra (*.msp)", "All files (*)"]) elif type_ == 'metadata': dialog.setNameFilters(["Metadata File (*.csv *.tsv *.txt *.xls *.xlsx *.xlsm *.xlsb *.ods)", "Microsoft Excel spreadsheets (*.xls *.xlsx, *.xlsm *.xlsb)", "OpenDocument spreadsheets (*.ods)", "All files (*)"]) def on_dialog_finished(result): if result == QDialog.Accepted: filename = dialog.selectedFiles()[0] if type_ == 'process': self.editProcessFile.setText(filename) self.editProcessFile.setPalette(self.style().standardPalette()) else: self.on_show_options_dialog(filename) dialog.finished.connect(on_dialog_finished) dialog.open()
def importFromGDAL(self): """ Import stretch and lookup table from file where these have already been saved """ from . import viewerwindow from osgeo import gdal viewerwindow.populateFilters() dlg = QFileDialog(self) dlg.setNameFilters(viewerwindow.GDAL_FILTERS) dlg.setFileMode(QFileDialog.ExistingFile) # set last dir dir = os.path.dirname(self.layer.filename) dlg.setDirectory(dir) if dlg.exec_() == QDialog.Accepted: fname = dlg.selectedFiles()[0] fname = str(fname) try: stretch = viewerstretch.ViewerStretch.fromGDALFileWithLUT( fname) if stretch is None: QMessageBox.critical(self, MESSAGE_TITLE, "Unable to find stretch") else: self.viewwidget.setNewStretch(stretch, self.layer) self.stretchLayout.updateStretch(stretch) except Exception as e: QMessageBox.critical(self, MESSAGE_TITLE, str(e))
def writeSct(sctPars, sctfile): """ Write a *.sct file from a dictionary. """ fd = QFileDialog(None, "Save updated .sct file") fd.setLabelText(QFileDialog.Accept, "Export as") fd.setNameFilters(["Scan description (*.sct)", "All Files (*)"]) fd.setOptions(QFileDialog.DontUseNativeDialog) fd.setViewMode(QFileDialog.List) fd.selectFile(sctfile) if fd.exec(): #fd.getSaveFileName(directory=sctfile) filenames = fd.selectedFiles() filename = filenames[0] if filename[-4:] != '.sct': filename += '.sct' print("Exporting scan description to file: ", filename) with io.open(filename, mode='w') as f: for key in sctPars.keys(): if sctPars[key] != "": #print(sctPars[key]) f.write("{0:25s} #{1:s}\n".format(sctPars[key], key.upper())) print('File ' + filename + ' exported.') msg = "File " + filename + ' exported.\n' else: msg = 'Updated .sct file not saved.\n' return msg
def chooseFiles(self, mode, oldFiles, acceptedMimeTypes): #Format acceptedMimeTypes nameFiltersString = "" for x in acceptedMimeTypes: nameFiltersString += "*" + x + " " uploadDialog = QFileDialog() if (args.downloadPath): uploadDialog.setDirectory(args.downloadPath) uploadDialog.setNameFilters([nameFiltersString]) uploadDialog.setFileMode(QFileDialog.ExistingFile) uploadDialog.setAcceptMode(QFileDialog.AcceptOpen) options = QFileDialog.Options() options |= QFileDialog.ReadOnly options |= QFileDialog.DontUseNativeDialog uploadDialog.setOptions(options) if uploadDialog.exec_(): fileName = uploadDialog.selectedFiles() return fileName return [""]
def _save_copter_as(self): dialog = QFileDialog() dialog.setAcceptMode(QFileDialog.AcceptSave) dialog.setNameFilters(["JSON files (*.json)", "All Files (*)"]) dialog.selectNameFilter("JSON files (*.json)") dialog.setDefaultSuffix("*.json") dialog.setDirectory(os.path.dirname(__copter_dir__)) save = dialog.exec_() if save: copter_file = dialog.selectedFiles() copter_name = copter_file[0].split("/")[-1] copter_name = copter_name.split(".")[0] if not self.copter.name == copter_name: rename_msg = "Rename current copter to '{}'?".format( copter_name) reply = QMessageBox.question(self, 'Message', rename_msg, QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: self.copter.name = copter_name self._init_copter_settings() json_serializer.writefile(copter_file[0], self.copter) self.settings.current_copter = copter_file[0] self.settings.save() self._open_copter_settings() return
def openClicked(self): dlg = QFileDialog(self) dlg.setDefaultSuffix("json") dlg.setFileMode(QFileDialog.ExistingFile) dlg.setAcceptMode(QFileDialog.AcceptOpen) dlg.setNameFilters(("JSON files (*.json)", "All files (*)")) if dlg.exec(): path = dlg.selectedFiles()[0] try: with WaitCursor(): with open(path, 'r') as f: d = json.load(f) warn = None if 'version' not in d: warn = "The JSON configuration file does not contain a version number. It may be incompatible with this program." else: cversion = StrictVersion(d['version']) if cversion.version[0] != jsonversion.version[0]: raise BaseException("The JSON configuration file format is not compatible with this version of %s" % QApplication.applicationDisplayName()) elif cversion.version[1] != jsonversion.version[1]: warn = "The JSON configuration file format version does not match this version of %s. Incompatibilites should be handled gracefully, but unexpected results may occur." % QApplication.applicationDisplayName() if warn: with TempDefaultCursor(): QMessageBox.warning(self, "Warning", warn) self.ui.settingsTab.unserialize(d) self.ui.experimentsTab.unserialize(d['experiments']) self.setModified(False) self.currentFileChanged.emit(path) except BaseException as e: QMessageBox.critical(self, "Error", str(e))
def FileDialog(directory='', forOpen=True, fmt='', isFolder=False): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog options |= QFileDialog.DontUseCustomDirectoryIcons dialog = QFileDialog() dialog.setOptions(options) dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden) # ARE WE TALKING ABOUT FILES OR FOLDERS if isFolder: dialog.setFileMode(QFileDialog.DirectoryOnly) else: dialog.setFileMode(QFileDialog.AnyFile) # OPENING OR SAVING dialog.setAcceptMode(QFileDialog.AcceptOpen) if forOpen else dialog.setAcceptMode(QFileDialog.AcceptSave) # SET FORMAT, IF SPECIFIED if fmt != '' and isFolder is False: dialog.setDefaultSuffix(fmt) dialog.setNameFilters([f'{fmt} (*.{fmt})']) # SET THE STARTING DIRECTORY if directory != '': dialog.setDirectory(str(directory)) else: dialog.setDirectory(str(ROOT_DIR)) if dialog.exec_() == QDialog.Accepted: path = dialog.selectedFiles()[0] # returns a list return path else: return ''
def saveRotatedFits(self, name_orig): """ Save the downloaded FITS image """ filename, file_extension = os.path.splitext(name_orig) #fileroot = os.path.basename(filename) #print('file root is ', fileroot) print('Saving ',filename+'_NE.fits') # Dialog to save file fd = QFileDialog() fd.setLabelText(QFileDialog.Accept, "Save as") fd.setNameFilters(["Fits Files (*.fits)","All Files (*)"]) fd.setOptions(QFileDialog.DontUseNativeDialog) fd.setViewMode(QFileDialog.List) fd.selectFile(filename+'_NE.fits') if (fd.exec()): fileName = fd.selectedFiles() outfile = fileName[0] filename, file_extension = os.path.splitext(outfile) # basename = os.path.basename(filename) # Primary header image = self.data wcs = self.wcs header = wcs.to_header() header.remove('WCSAXES') header['INSTRUME'] = (self.source, 'Instrument') hdu = fits.PrimaryHDU(image) hdu.header.extend(header) hdul = fits.HDUList([hdu]) hdul.writeto(outfile,overwrite=True) # clobber true allows rewriting hdul.close()
def on_template_save_as(self): template_file = self.mainwindow.template_view_controller.selected_template if template_file is not None: fd = QFileDialog(self.mainwindow, "Save template", self.template_dialog_path) fd.setDefaultSuffix("template") filters = [ "Template files (*.template)", "JSON files (*.json)", "Any files (*)" ] fd.setNameFilters(filters) fd.setAcceptMode(QFileDialog.AcceptSave) if fd.exec(): filename = fd.selectedFiles()[0] file = open(filename, "w") template_file.file = file self.save_file(file, template_file.template) templates = self.mainwindow.template_list_controller.templates filename = template_file.file.name if filename not in templates: templates.append(filename) self.mainwindow.template_list_controller.templates = templates index = self.ui.templateListView.selectionModel().model( ).createIndex(templates.index(filename), 0) self.ui.templateListView.selectionModel().select( index, QItemSelectionModel.Select) self.mainwindow.template_view_controller.selected_template = file.name
def exportContours(self): """Export defined contours.""" itab = self.itabs.currentIndex() ic0 = self.ici[itab] ih0 = self.ihi[itab] if ic0.contour is not None: if ic0.title in ['Flux', 'Coverage map', 'Flux [no atm. corr.]']: source = self.specCube.instrument else: source = ic0.title info = [('source', source), ('levels', ih0.levels)] data = OrderedDict(info) # Open a dialog fd = QFileDialog() fd.setLabelText(QFileDialog.Accept, "Export as") fd.setNameFilters(["Json Files (*.json)", "All Files (*)"]) fd.setOptions(QFileDialog.DontUseNativeDialog) fd.setViewMode(QFileDialog.List) if (fd.exec()): filenames = fd.selectedFiles() filename = filenames[0] if filename[-5:] != '.json': filename += '.json' print("Exporting contour levels to file: ", filename) with io.open(filename, mode='w') as f: str_ = json.dumps(data, indent=2, separators=(',', ': '), ensure_ascii=False, cls=MyEncoder) f.write(str_) self.sb.showMessage("Aperture exported in file " + filename, 3000) else: return
def saveDump(buf): dump = {"flash": []} for l in buf.split("\n"): if not l: break addr, val = l.split(":") dump["flash"].append({"addr": addr, "val": val}) dlg = QFileDialog() dlg.setFileMode(QFileDialog.AnyFile) dlg.setNameFilters(["Json files (*.json)"]) if dlg.exec_(): filenames = dlg.selectedFiles() try: with open(filenames[0], "w") as f: json.dump(dump, f) msg = QMessageBox(QMessageBox.Information, "Save flash dump", "Saved successfully.") msg.exec_() except Exception as e: msg = QMessageBox(QMessageBox.Warning, "Save flash dump", "Error while saving flash dump:\n" + str(e)) msg.exec_() else: return
def openLocalCube(self): """ Open local spectral cube.""" # Open a dialog fd = QFileDialog() fd.setLabelText(QFileDialog.Accept, "Import") fd.setNameFilters(["Fits Files (*.fits)", "All Files (*)"]) fd.setOptions(QFileDialog.DontUseNativeDialog) fd.setViewMode(QFileDialog.List) fd.setFileMode(QFileDialog.ExistingFile) if (fd.exec()): filenames = fd.selectedFiles() cube_file = filenames[0] print("File selected is: ", filenames[0]) try: print('opening ', cube_file) self.data = specCube(cube_file) self.wcs = self.data.wcs # Check if coordinates are inside the image x, y = self.wcs.wcs_world2pix(self.lon, self.lat, 0) print('x y ', x, y) if x >= 0 and x <= self.data.nx and y >= 0 and y <= self.data.ny: print('Source inside the FITS cube') else: self.data = None self.wcs = None print('The selected FITS is not a valid file') except: self.data = None self.wcs = None print('The selected FITS is not a valid file')
def dlg_export(parent): dialog = QFileDialog(parent) dialog.setWindowTitle(_("Export the simulation as")) dialog.setAcceptMode(QFileDialog.AcceptSave) types=[] types.append(_("gpvdm archive input+output files (*.gpvdm)")) types.append(_("gpvdm archive input files (*.gpvdm)")) types.append(_("optical materials database (*.zip)")) types.append(_("pdf file (*.pdf)")) types.append(_("jpg image (*.jpg)")) types.append(_("tex file (*.tex)")) types.append(_("Excel file (*.xlsx)")) dialog.setNameFilters(types) dialog.setFileMode(QFileDialog.ExistingFile) dialog.setAcceptMode(QFileDialog.AcceptSave) if dialog.exec_() == QDialog.Accepted: file_name = dialog.selectedFiles()[0] if dialog.selectedNameFilter()==_("gpvdm archive input+output files (*.gpvdm)"): export_archive(file_name,True) elif dialog.selectedNameFilter()==_("gpvdm archive input files (*.gpvdm)"): export_archive(file_name,False) elif dialog.selectedNameFilter()==_("optical materials database (*.zip)"): export_materials(file_name) elif dialog.selectedNameFilter()==_("pdf file (*.pdf)") or dialog.selectedNameFilter()==_("jpg image (*.jpg)") or dialog.selectedNameFilter()==_("tex file (*.tex)"): export_as(file_name) elif dialog.selectedNameFilter()==_("Excel file (*.xlsx)"): gen_workbook(os.getcwd(),file_name)
def openProjectDialog(self): fileDialog = QFileDialog() fileDialog.setDefaultSuffix("pyr") fileDialog.setFileMode(QFileDialog.ExistingFile) fileDialog.setNameFilters(["Pyree Project Files (*.pyr)", "Any files (*)"]) if fileDialog.exec(): self.openProject(fileDialog.selectedFiles()[0])
def on_btnExportTrace_clicked(self): """ Export the contents of the trace tab to .txt file """ # get filename to save as dlg = QFileDialog() dlg.setAcceptMode(QFileDialog.AcceptSave) dlg.setDefaultSuffix("txt") dlg.setNameFilters(["Trace File (*.txt)", "all files (*.*)"]) dlg.setDirectory(self.parent.settings.value("Default/ProjPath")) if dlg.exec_(): fileNames = dlg.selectedFiles() if fileNames: self.fileName = fileNames[0] # save the file file = QFile(self.fileName) if not file.open(QFile.WriteOnly | QFile.Text): self.helper.displayErrMsg( "Export Trace Error", "Cannot write file {} {}".format( self.fileName, file.errorString())) return outstr = QTextStream(file) QApplication.setOverrideCursor(Qt.WaitCursor) outstr << self.textTrace.toPlainText() QApplication.restoreOverrideCursor()
def pick_picture(self): qfd = QFileDialog() qfd.setNameFilters(["*.png", "*.jpg"]) if qfd.exec(): files = qfd.selectedFiles() for file in files: self.send_picture(file)
def getImageFileNamesToOpen(cls, parent_window, defaultDirectory): """ Launch an "Open File" dialog to ask the user for one or more image files. """ extensions = OpDataSelection.SupportedExtensions filter_strs = ["*." + x for x in extensions] filters = ["{filt} ({filt})".format(filt=x) for x in filter_strs] filt_all_str = "Image files (" + ' '.join(filter_strs) + ')' fileNames = [] if ilastik_config.getboolean("ilastik", "debug"): # use Qt dialog in debug mode (more portable?) file_dialog = QFileDialog(parent_window, "Select Images") file_dialog.setOption(QFileDialog.DontUseNativeDialog, True) # do not display file types associated with a filter # the line for "Image files" is too long otherwise file_dialog.setNameFilters([filt_all_str] + filters) #file_dialog.setNameFilterDetailsVisible(False) # select multiple files file_dialog.setFileMode(QFileDialog.ExistingFiles) file_dialog.setDirectory( defaultDirectory ) if file_dialog.exec_(): fileNames = file_dialog.selectedFiles() else: # otherwise, use native dialog of the present platform fileNames, _filter = QFileDialog.getOpenFileNames(parent_window, "Select Images", defaultDirectory, filt_all_str) return fileNames
def _fileDialog(acceptMode, fileMode, parent=None, caption='', directory='', filters=(), selectedFilter=None, options=0): nameFilters = make_filters(filters) dialog = QFileDialog(parent, caption, directory) dialog.setNameFilters(nameFilters) dialog.setAcceptMode(acceptMode) dialog.setFileMode(fileMode) dialog.setOptions(QFileDialog.Options(options)) if selectedFilter is not None: dialog.selectNameFilter(nameFilters[selectedFilter]) if dialog.exec_() != QDialog.Accepted: return None filename = dialog.selectedFiles()[0] if fileMode != QFileDialog.Directory: selectedFilter = nameFilters.index(dialog.selectedNameFilter()) _, ext = os.path.splitext(filename) if not ext: ext = filters[selectedFilter][1] # use first extension if ext.startswith('*.') and ext != '*.*': return filename + ext[1:] # remove leading '*' return filename
def handlebuttonbrowse(self): dlg = QFileDialog() dlg.setFileMode(QFileDialog.AnyFile) dlg.setAcceptMode(QFileDialog.AcceptSave) dlg.setLabelText(QFileDialog.Accept, "Save comparison") dlg.setDefaultSuffix(self.expected_extension.strip('.')) inputfilename = self.settings.get_object('inputfilename') dirname = os.path.dirname(inputfilename) suggested_filename = os.path.splitext( os.path.basename(inputfilename))[0] + self.expected_extension dlg.setDirectory(dirname) dlg.selectFile(suggested_filename) filternames = [ "%s files (*%s)" % (ext.strip('.'), ext) for ext in [self.expected_extension] ] filternames += ["all files (*)"] dlg.setNameFilters(filternames) if dlg.exec_(): self.outputfilename = str(dlg.selectedFiles()[0]) self.settings.register('outputfilename', self) self.outputfile.setText(shorten_path(self.outputfilename)) if self.outputfilename: self.compare() self.issaved = True print('Complete!') self.buttonshow.setEnabled(True)
def set_input(self) -> None: """Handler for the input button.""" try: dialog = QFileDialog() dialog.setFileMode(QFileDialog.ExistingFile) dialog.setNameFilters(["GEDCOM files (*.ged)"]) if not dialog.exec(): return files = dialog.selectedFiles() assert len(files) == 1 ged_path = files[0] self.input_value.setText(ged_path) import_config = { 'input': ged_path, } ged_import = ged2dot.GedcomImport() graph = ged_import.load(import_config) self.rootfamily_value.clear() for node in graph: if not isinstance(node, ged2dot.Family): continue help_string = "" if node.husb and node.husb.get_surname(): help_string += node.husb.get_surname() help_string += "-" if node.wife and node.wife.get_surname(): help_string += node.wife.get_surname() key = "%s (%s)" % (node.get_identifier(), help_string) self.rootfamily_value.addItem(key, node.get_identifier()) self.update_status() except Exception: # pylint: disable=broad-except self.print_traceback()
def importAction(self): fileDialog = QFileDialog(self) fileDialog.setWindowTitle("Import VisualStates File") fileDialog.setViewMode(QFileDialog.Detail) fileDialog.setNameFilters(['VisualStates File (*.xml)']) fileDialog.setDefaultSuffix('.xml') fileDialog.setAcceptMode(QFileDialog.AcceptOpen) if fileDialog.exec_(): tempPath = self.fileManager.getFullPath() file = self.fileManager.open(fileDialog.selectedFiles()[0]) if file[0] is not None: self.fileManager.setPath(tempPath) # if the current active state already has an initial state make sure that # there will not be any initial state in the imported state if self.activeState.getInitialChild() is not None: for childState in file[0].getChildren(): childState.setInitial(False) # Update importing Namespaces importedState, self.config, self.libraries, self.globalNamespace = self.importManager.updateAuxiliaryData(file, self) self.treeModel.loadFromRoot(importedState, self.activeState) self.automataScene.displayState(self.activeState) self.automataScene.setLastIndexes(self.rootState) else: self.showWarning("Wrong file selected", "The selected file is not a valid VisualStates file")
def dlg_export(parent): dialog = QFileDialog(parent) dialog.setWindowTitle(_("Export the simulation as")) dialog.setAcceptMode(QFileDialog.AcceptSave) types=[] types.append(_("gpvdm archive input+output files")+" (*.gpvdm)") types.append(_("gpvdm archive input files")+" (*.gpvdm)") types.append(_("optical materials database")+" (*.zip)") types.append(_("pdf file")+" (*.pdf)") types.append(_("jpg image")+" (*.jpg)") types.append(_("tex file")+" (*.tex)") dialog.setNameFilters(types) dialog.setFileMode(QFileDialog.ExistingFile) dialog.setAcceptMode(QFileDialog.AcceptSave) if dialog.exec_() == QDialog.Accepted: file_name = dialog.selectedFiles()[0] #print(dialog.selectedNameFilter()) if dialog.selectedNameFilter()==_("gpvdm archive input+output files")+" (*.gpvdm)": export_archive(file_name,True) elif dialog.selectedNameFilter()==_("gpvdm archive input files")+" (*.gpvdm)": export_archive(file_name,False) elif dialog.selectedNameFilter()==_("optical materials database")+" (*.zip)": export_materials(file_name) elif dialog.selectedNameFilter()==_("pdf file")+" (*.pdf)" or dialog.selectedNameFilter()==_("jpg image")+" (*.jpg)" or dialog.selectedNameFilter()==_("tex file")+" (*.tex)": export_as(file_name)
def getModelFileNameToOpen(cls, parent_window, defaultDirectory): """ opens a QFileDialog for importing files """ extensions = ["pytorch"] filter_strs = ["*." + x for x in extensions] filters = ["{filt} ({filt})".format(filt=x) for x in filter_strs] filt_all_str = "Neural nets (" + " ".join(filter_strs) + ")" fileName = None if ilastik_config.getboolean("ilastik", "debug"): # use Qt dialog in debug mode (more portable?) file_dialog = QFileDialog(parent_window, "Select Model") file_dialog.setOption(QFileDialog.DontUseNativeDialog, True) # do not display file types associated with a filter # the line for "Image files" is too long otherwise file_dialog.setNameFilters([filt_all_str] + filters) # file_dialog.setNameFilterDetailsVisible(False) file_dialog.setFileMode(QFileDialog.ExistingFile) file_dialog.setDirectory(defaultDirectory) if file_dialog.exec_(): fileName = file_dialog.selectedFiles()[0] else: # otherwise, use native dialog of the present platform fileName, _ = QFileDialog.getOpenFileName(parent_window, "Select Model", defaultDirectory, filt_all_str) return fileName
def file_dialog(dir='', for_open=True, fmt='', is_folder=False): """Dialog z eksploratorem Windows. Otwieranie/tworzenie folderów i plików.""" options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog options |= QFileDialog.DontUseCustomDirectoryIcons dialog = QFileDialog() dialog.setOptions(options) dialog.setFilter(dialog.filter() | QDir.Hidden) if is_folder: # Otwieranie folderu dialog.setFileMode(QFileDialog.DirectoryOnly) else: # Otwieranie pliku dialog.setFileMode(QFileDialog.AnyFile) # Otwieranie / zapisywanie: dialog.setAcceptMode( QFileDialog.AcceptOpen) if for_open else dialog.setAcceptMode( QFileDialog.AcceptSave) # Ustawienie filtrowania rozszerzeń plików: if fmt != '' and not is_folder: dialog.setDefaultSuffix(fmt) dialog.setNameFilters([f'{fmt} (*.{fmt})']) # Ścieżka startowa: if dir != '': dialog.setDirectory(str(dir)) else: dialog.setDirectory(str(os.environ["HOMEPATH"])) # Przekazanie ścieżki folderu/pliku: if dialog.exec_() == QDialog.Accepted: path = dialog.selectedFiles()[0] return path else: return ''
def on_btnExportLog_clicked(self): """ Export the contents of the log tab to .csv file """ # get filename to save as dlg = QFileDialog() dlg.setAcceptMode(QFileDialog.AcceptSave) dlg.setDefaultSuffix("csv") dlg.setNameFilters(["Log File (*.csv)", "all files (*.*)"]) dlg.setDirectory(self.parent.settings.value("Default/ProjPath")) if dlg.exec_(): fileNames = dlg.selectedFiles() try: if fileNames: self.fileName = fileNames[0] # save the file with open(self.fileName, 'w', newline='') as csvfile: csvWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) for row in range(self.gridLog.model().rowCount()): rowItems = [] for col in range( self.gridLog.model().columnCount()): value = self.gridLog.model().index( row, col, QModelIndex()).data(Qt.DisplayRole) rowItems.append(value) csvWriter.writerow(c for c in rowItems) except BaseException as e: msg = "{} - {} failed.".format("Write CSV", repr(e)) self.helper.displayErrMsg("Export CSV Error", msg)
def conv_save_pressed(P, W): head = _translate('HandlerClass', 'Save Error') with open(P.fNgc, 'r') as inFile: for line in inFile: if '(new conversational file)' in line: msg0 = _translate('HandlerClass', 'An empty file cannot be saved') P.dialog_show_ok(QMessageBox.Warning, '{}'.format(head), '{}\n'.format(msg0)) return P.vkb_show() dlg = QFileDialog(W) dlg.setOptions(QFileDialog.DontUseNativeDialog) dlg.setAcceptMode(QFileDialog.AcceptSave) dlg.setNameFilters(['G-Code Files (*.ngc *.nc *.tap)', 'All Files (*)']) dlg.setDefaultSuffix('ngc') dlg.setDirectory(P.programPrefix) name = '' if dlg.exec_(): name = dlg.selectedFiles()[0] if name: COPY(P.fNgc, name) W.conv_save.setEnabled(False) conv_enable_tabs(P, W) P.vkb_show(True)
def getImageFileNamesToOpen(cls, parent_window, defaultDirectory): """ opens a QFileDialog for importing files """ extensions = ['nn'] filter_strs = ["*." + x for x in extensions] filters = ["{filt} ({filt})".format(filt=x) for x in filter_strs] filt_all_str = "Image files (" + ' '.join(filter_strs) + ')' fileNames = [] if ilastik_config.getboolean("ilastik", "debug"): # use Qt dialog in debug mode (more portable?) file_dialog = QFileDialog(parent_window, "Select Model") file_dialog.setOption(QFileDialog.DontUseNativeDialog, True) # do not display file types associated with a filter # the line for "Image files" is too long otherwise file_dialog.setNameFilters([filt_all_str] + filters) #file_dialog.setNameFilterDetailsVisible(False) # select multiple files file_dialog.setFileMode(QFileDialog.ExistingFiles) file_dialog.setDirectory(defaultDirectory) if file_dialog.exec_(): fileNames = file_dialog.selectedFiles() else: # otherwise, use native dialog of the present platform fileNames, _ = QFileDialog.getOpenFileNames(parent_window, "Select Model", defaultDirectory, filt_all_str) return fileNames
def file_dlg(self, text): msg_box = QMessageBox() msg_box.setIcon(QMessageBox.Question) try: msg_box.setWindowIcon( QtGui.QIcon(os.path.join("misc", "archerrank2.svg"))) except FileNotFoundError: msg_box.setWindowIcon( QtGui.QIcon( os.path.abspath( os.path.join(os.path.dirname(sys.argv[0]), "misc", "archerrank2.svg")))) msg_box.setText(self.tr("Question")) msg_box.setInformativeText(text) msg_box.addButton(self.tr('Load'), QMessageBox.AcceptRole) msg_box.addButton(self.tr('New'), QMessageBox.AcceptRole) msg_box.addButton(self.tr('Exit'), QMessageBox.NoRole) reply = msg_box.exec_() if reply == 0: fileName, _ = QFileDialog.getOpenFileName( None, "QFileDialog.getOpenFileName()", "", "Acherrang2 Files (*.sqlite)") return fileName elif reply == 1: filedialog = QFileDialog(msg_box) filedialog.setFilter(filedialog.filter() | QtCore.QDir.Hidden) filedialog.setDefaultSuffix('sqlite') filedialog.setAcceptMode(QFileDialog.AcceptSave) filedialog.setNameFilters(["Acherrang2 Files (*.sqlite)"]) if filedialog.exec_() == QFileDialog.Accepted: return filedialog.selectedFiles()[0] return else: return "exit"
def contextCoverMenu(self, point): if len(self.treeFileList.selectedItems()) == 1: menu = QMenu() actionLoad = menu.addAction(_translate('fb2mobi-gui', 'Load from file...')) actionSave = menu.addAction(_translate('fb2mobi-gui', 'Save to file...')) actionClear = menu.addAction(_translate('fb2mobi-gui', 'Clear')) action = menu.exec_(self.imgBookCover.mapToGlobal(point)) if action == actionLoad: fileDialog = QFileDialog(self, _translate('fb2mobi-gui', 'Select book cover')) fileDialog.setFileMode(QFileDialog.ExistingFile) fileDialog.setNameFilters([_translate('fb2mobi-gui', 'Image files (*.png *.jpg *.bmp)')]) if fileDialog.exec_(): file_list = fileDialog.selectedFiles() self.loadNewCoverFormFile(file_list[0]) elif action == actionSave: fileDialog = QFileDialog(self, _translate('fb2mobi-gui', 'Save cover as')) fileDialog.setAcceptMode(QFileDialog.AcceptSave) fileDialog.setFileMode(QFileDialog.AnyFile) fileDialog.setNameFilters([_translate('fb2mobi-gui', 'Image files (*.png *.jpg *.bmp)')]) if fileDialog.exec_(): file_list = fileDialog.selectedFiles() self.book_cover.save(file_list[0], os.path.splitext(file_list[0])[1][1:].upper()); elif action == actionClear: self.book_cover = None self.imgBookCover.clear()
def on_layout_save(self): dialog = QFileDialog() dialog.setDefaultSuffix("vil") dialog.setAcceptMode(QFileDialog.AcceptSave) dialog.setNameFilters(["Vial layout (*.vil)"]) if dialog.exec_() == QDialog.Accepted: with open(dialog.selectedFiles()[0], "wb") as outf: outf.write(self.keymap_editor.save_layout())
def fromFile(self): dlg = QFileDialog(self) dlg.setFileMode(QFileDialog.ExistingFile) dlg.setAcceptMode(QFileDialog.AcceptOpen) dlg.setNameFilters(("CSV files (*.csv *.txt)", "All files (*)")) if dlg.exec(): path = dlg.selectedFiles()[0] self._fromFile(path)
def saveAsAction(self): fileDialog = QFileDialog(self) fileDialog.setWindowTitle("Save VisualStates Project") fileDialog.setViewMode(QFileDialog.Detail) fileDialog.setNameFilters(['VisualStates File (*.xml)']) fileDialog.setAcceptMode(QFileDialog.AcceptSave) if fileDialog.exec_(): self.fileManager.setFullPath(fileDialog.selectedFiles()[0]) self.fileManager.save(self.rootState, self.config, self.libraries)
def saveProjectDialog(self, saveAs = False): if saveAs or self.currentProject.filePath is None: fileDialog = QFileDialog() fileDialog.setDefaultSuffix("pyr") fileDialog.setFileMode(QFileDialog.AnyFile) fileDialog.setNameFilters(["Pyree Project Files (*.pyr)", "Any files (*)"]) if fileDialog.exec(): self.currentProject.saveToFile(fileDialog.selectedFiles()[0]) else: self.currentProject.saveToFile(self.currentProject.filePath)
def open_file(self): dlg = QFileDialog(self) dlg.setWindowTitle('Open image') dlg.setViewMode(QFileDialog.Detail) dlg.setNameFilters([self.tr('Image Files (*.bmp)'), self.tr('All Files (*)')]) dlg.setDefaultSuffix('.bmp') functions.set_style_sheet(dlg, STYLE_SHEET) if dlg.exec_() : self.piximage = piximage2.PixImage(dlg.selectedFiles()[0]) self.display()
def on_action_Import_triggered(self): caption = 'Import csv dat' dialog = QFileDialog(self, caption) dialog.setFileMode(QFileDialog.ExistingFile) dialog.setNameFilters(['CSV soubory (*.csv)', 'Všechny soubory (*)']) if dialog.exec_(): importDialog = ImportDialog() importDialog.setFilename(dialog.selectedFiles()[0]) importDialog.exec_() self.updateData() self.blocksWidget.updateData() self.measurementsWidget.updateData()
def open_text(self): # Show loading page self.taggedTextWidget.stop() self.taggedTextWidget.showLoading() self.taggedDocumentWidget.stop() self.taggedDocumentWidget.showLoading() dialog = QFileDialog(self) dialog.setNameFilters([self.tr('Text Files (*.txt)'), self.tr('All Files (*)')]) dialog.setDefaultSuffix('.txt') file_name = dialog.getOpenFileName(self, 'Open file') self.progressBar.setVisible(True) self.progressBar_2.setVisible(True) self.progressBar_3.setVisible(True) if file_name[0] != '': text = codecs.open(file_name[0], "r", "utf-8").read() # We need to create new TextWorker self.tag = (TextWorker(), QtCore.QThread()) # prompt for custom common words list msg = QMessageBox() question = "Do you want to choose a custom list of domain specific common words?" reply = msg.question(self, 'Message', question, msg.Yes, msg.No) if reply == msg.Yes: dialog = QFileDialog(self) dialog.setNameFilters([self.tr('Text Files (*.txt)'), self.tr('All Files (*)')]) dialog.setDefaultSuffix('.txt') file_name = dialog.getOpenFileName(self, 'Open file') self.tag[0].common_words_file = file_name[0] else: self.tag[0].common_words_file = "textparser/wordlist.txt" self.tag[0].TextToParse = text self.textEdit.setText(text) # Gray out all buttons self.openButton_1.setEnabled(False) self.openButton_2.setEnabled(False) self.actionText_ffnen.setEnabled(False) self.textEditApply.setEnabled(False) self.textEditApplyMarked.setEnabled(False) self.textEditSave.setEnabled(False) # Create Thread self.tag[1].objThread = QtCore.QThread() self.tag[0].moveToThread(self.tag[1]) self.tag[0].finished.connect(self.tag[1].quit) self.tag[0].updated.connect(self.updateWorkerInfo); # self.tag[0].finished.connect(self.finishOpen) self.tag[1].started.connect(self.tag[0].longRunning) self.tag[1].finished.connect(self.finishOpen) self.tag[1].start()
def saveTextEdit(self): filename = "" dialog = QFileDialog(self, 'Save File') dialog.setNameFilters([self.tr('Text Files (*.txt)'), self.tr('All Files (*)')]) dialog.setDefaultSuffix('.txt') filename = dialog.getSaveFileName() file = filename[0] if not file.endswith('.txt'): file += ".txt" f = open(file, 'w') filedata = self.textEdit.toPlainText() f.write(filedata) f.close()
def openAction(self): fileDialog = QFileDialog(self) fileDialog.setWindowTitle("Open VisualStates File") fileDialog.setViewMode(QFileDialog.Detail) fileDialog.setNameFilters(['VisualStates File (*.xml)']) fileDialog.setDefaultSuffix('.xml') fileDialog.setAcceptMode(QFileDialog.AcceptOpen) if fileDialog.exec_(): (self.rootState, self.config, self.libraries) = self.fileManager.open(fileDialog.selectedFiles()[0]) self.treeModel.removeAll() self.treeModel.loadFromRoot(self.rootState) # set the active state as the loaded state self.automataScene.setActiveState(self.rootState) self.automataScene.setLastIndexes(self.rootState)
def save_file(self): dlg = QFileDialog(self) dlg.setWindowTitle('Open image') dlg.setViewMode(QFileDialog.Detail) dlg.setFileMode(QFileDialog.AnyFile) dlg.setAcceptMode(QFileDialog.AcceptSave) dlg.setNameFilters([self.tr('Image Files (*.bmp)'), self.tr('All Files (*)')]) dlg.setDefaultSuffix('.bmp') functions.set_style_sheet(dlg, STYLE_SHEET) if dlg.exec_(): path = dlg.selectedFiles()[0] i = self.ui.tabWidget.currentIndex() if self.piximage is not None: if (i == 0): self.piximage.image_o.save(path) elif (i == 1): self.piximage.image_t.save(path) elif (i == 2): self.piximage.image_t_color.save(path)
def requestWrite(self, nodes, file_name = None, limit_mimetypes = None, file_handler = None, **kwargs): if self._writing: raise OutputDeviceError.DeviceBusyError() # Set up and display file dialog dialog = QFileDialog() dialog.setWindowTitle(catalog.i18nc("@title:window", "Save to File")) dialog.setFileMode(QFileDialog.AnyFile) dialog.setAcceptMode(QFileDialog.AcceptSave) # Ensure platform never ask for overwrite confirmation since we do this ourselves dialog.setOption(QFileDialog.DontConfirmOverwrite) if sys.platform == "linux" and "KDE_FULL_SESSION" in os.environ: dialog.setOption(QFileDialog.DontUseNativeDialog) filters = [] mime_types = [] selected_filter = None if "preferred_mimetypes" in kwargs and kwargs["preferred_mimetypes"] is not None: preferred_mimetypes = kwargs["preferred_mimetypes"] else: preferred_mimetypes = Application.getInstance().getPreferences().getValue("local_file/last_used_type") preferred_mimetype_list = preferred_mimetypes.split(";") if not file_handler: file_handler = Application.getInstance().getMeshFileHandler() file_types = file_handler.getSupportedFileTypesWrite() file_types.sort(key = lambda k: k["description"]) if limit_mimetypes: file_types = list(filter(lambda i: i["mime_type"] in limit_mimetypes, file_types)) file_types = [ft for ft in file_types if not ft["hide_in_file_dialog"]] if len(file_types) == 0: Logger.log("e", "There are no file types available to write with!") raise OutputDeviceError.WriteRequestFailedError(catalog.i18nc("@info:warning", "There are no file types available to write with!")) # Find the first available preferred mime type preferred_mimetype = None for mime_type in preferred_mimetype_list: if any(ft["mime_type"] == mime_type for ft in file_types): preferred_mimetype = mime_type break for item in file_types: type_filter = "{0} (*.{1})".format(item["description"], item["extension"]) filters.append(type_filter) mime_types.append(item["mime_type"]) if preferred_mimetype == item["mime_type"]: selected_filter = type_filter if file_name: file_name += "." + item["extension"] # CURA-6411: This code needs to be before dialog.selectFile and the filters, because otherwise in macOS (for some reason) the setDirectory call doesn't work. stored_directory = Application.getInstance().getPreferences().getValue("local_file/dialog_save_path") dialog.setDirectory(stored_directory) # Add the file name before adding the extension to the dialog if file_name is not None: dialog.selectFile(file_name) dialog.setNameFilters(filters) if selected_filter is not None: dialog.selectNameFilter(selected_filter) if not dialog.exec_(): raise OutputDeviceError.UserCanceledError() save_path = dialog.directory().absolutePath() Application.getInstance().getPreferences().setValue("local_file/dialog_save_path", save_path) selected_type = file_types[filters.index(dialog.selectedNameFilter())] Application.getInstance().getPreferences().setValue("local_file/last_used_type", selected_type["mime_type"]) # Get file name from file dialog file_name = dialog.selectedFiles()[0] Logger.log("d", "Writing to [%s]..." % file_name) if os.path.exists(file_name): result = QMessageBox.question(None, catalog.i18nc("@title:window", "File Already Exists"), catalog.i18nc("@label Don't translate the XML tag <filename>!", "The file <filename>{0}</filename> already exists. Are you sure you want to overwrite it?").format(file_name)) if result == QMessageBox.No: raise OutputDeviceError.UserCanceledError() self.writeStarted.emit(self) # Actually writing file if file_handler: file_writer = file_handler.getWriter(selected_type["id"]) else: file_writer = Application.getInstance().getMeshFileHandler().getWriter(selected_type["id"]) try: mode = selected_type["mode"] if mode == MeshWriter.OutputMode.TextMode: Logger.log("d", "Writing to Local File %s in text mode", file_name) stream = open(file_name, "wt", encoding = "utf-8") elif mode == MeshWriter.OutputMode.BinaryMode: Logger.log("d", "Writing to Local File %s in binary mode", file_name) stream = open(file_name, "wb") else: Logger.log("e", "Unrecognised OutputMode.") return None job = WriteFileJob(file_writer, stream, nodes, mode) job.setFileName(file_name) job.setAddToRecentFiles(True) # The file will be added into the "recent files" list upon success job.progress.connect(self._onJobProgress) job.finished.connect(self._onWriteJobFinished) message = Message(catalog.i18nc("@info:progress Don't translate the XML tags <filename>!", "Saving to <filename>{0}</filename>").format(file_name), 0, False, -1 , catalog.i18nc("@info:title", "Saving")) message.show() job.setMessage(message) self._writing = True job.start() except PermissionError as e: Logger.log("e", "Permission denied when trying to write to %s: %s", file_name, str(e)) raise OutputDeviceError.PermissionDeniedError(catalog.i18nc("@info:status Don't translate the XML tags <filename>!", "Permission denied when trying to save <filename>{0}</filename>").format(file_name)) from e except OSError as e: Logger.log("e", "Operating system would not let us write to %s: %s", file_name, str(e)) raise OutputDeviceError.WriteRequestFailedError(catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "Could not save to <filename>{0}</filename>: <message>{1}</message>").format()) from e
class MainWindow(QMainWindow): upload_pictures = pyqtSignal(list) def __init__(self, **kwargs): super(MainWindow, self).__init__(**kwargs) load_ui('MainWindow.ui', self) self.setWindowTitle('Picup - {}'.format(__version__)) apikey = get_api_key(self) self.upload_in_progress = False self.upload_thread = QThread() self.upload = Upload(apikey=apikey) self.upload_thread.start() self.upload.moveToThread(self.upload_thread.thread()) self.listView_files_model = FileListModel() self.listView_files.setModel(self.listView_files_model) self.pushButton_close.clicked.connect(self.close) self.pushButton_add_picture.clicked.connect(self.add_file) self.pushButton_upload.clicked.connect(self.start_upload) self.pushButton_clear_list.clicked.connect( self.listView_files_model.clear_list) self.pushButton_remove_selected.clicked.connect(self.remove_selected) self.upload.upload_finished.connect(self.upload_finished) self.upload.upload_error.connect(self.handle_error) self.upload_pictures.connect(self.upload.upload_multiple) self.dialog = QFileDialog(parent=self) self.dialog.setFileMode(QFileDialog.ExistingFiles) self.dialog.setNameFilters(SUPPORTED_FILE_TYPES) @pyqtSlot() def add_file(self): if self.dialog.exec_(): files = self.dialog.selectedFiles() self.listView_files_model.add_files(files) @pyqtSlot() def start_upload(self,): print(self.upload_thread.isRunning()) if (len(self.listView_files_model.files) and not self.upload_in_progress): self.upload_in_progress = True link_dialog = ShowLinks(self.upload, len(self.listView_files_model.files), parent=self) link_dialog.show() self.upload_pictures.emit(self.listView_files_model.files) self.listView_files_model.clear_list() elif self.upload_in_progress: logger.debug('Upload already in progress.') QMessageBox.warning(self, 'Upload Läuft', 'Es läuft bereits ein Upload Prozess.') else: logger.debug('There is nothing to upload.') QMessageBox.information(self, 'Nüx da', 'Es wurden keine bilder zum hochladen hinzugefügt') @pyqtSlot() def upload_finished(self): self.upload_in_progress = False @pyqtSlot(type, tuple) def handle_error(self, exception_type, args): message = QMessageBox(QMessageBox.Warning, 'Fehler', 'Fehler beim upload.', buttons=QMessageBox.Ok, parent=self) message.setDetailedText(repr(exception_type) + '\n' + repr(args)) message.exec_() @pyqtSlot() def remove_selected(self,): for item in self.listView_files.selectedIndexes(): self.listView_files_model.remove_element(item.row(), item.row())
class MainWindow(QMainWindow): """ Main window class. Includes the main window itself as well as handling of it's signals """ upload_pictures = pyqtSignal(list) def __init__(self, **kwargs): super().__init__(**kwargs) load_ui('MainWindow.ui', self) self.setWindowTitle('Picup - {}'.format(__version__)) apikey = get_api_key() if not apikey: apikey = self.request_api_key() self.legal_resize = True self.upload_in_progress = False self.upload_thread = QThread(parent=self) self.upload = Upload(apikey=apikey) self.upload_thread.start() self.upload.moveToThread(self.upload_thread) self.list_view_files_model = FileListModel(parent=self) self.list_view_files.setModel(self.list_view_files_model) self.pushButton_close.clicked.connect(self.shutdown) self.pushButton_add_picture.clicked.connect(self.add_file) self.pushButton_add_links.clicked.connect(self.add_url) self.pushButton_upload.clicked.connect(self.start_upload) self.pushButton_clear_list.clicked.connect( self.list_view_files_model.clear_list) self.pushButton_remove_selected.clicked.connect(self.remove_selected) self.upload.upload_finished.connect(self.upload_finished) self.upload.upload_error.connect(self.handle_error) self.upload_pictures.connect(self.upload.upload_multiple) self.dialog = QFileDialog(parent=self) self.dialog.setFileMode(QFileDialog.ExistingFiles) self.dialog.setNameFilters(SUPPORTED_FILE_TYPES) self.resize_container.hide() self.resize_container_percentual.hide() self.check_box_resize.clicked.connect( self.set_resize_box_visibility ) self.radio_button_absolute.toggled.connect( self.set_absolute_resize_box_visibility ) self.radio_button_percentual.toggled.connect( self.set_percentual_resize_box_visibility ) self.spin_box_width.valueChanged.connect(self.update_resize) self.spin_box_higth.valueChanged.connect(self.update_resize) self.spin_box_percentual.valueChanged.connect(self.update_resize) self.comboBox_rotate_options.activated['QString'].connect( self.upload.change_default_rotation ) self.checkBox_delete_exif.toggled.connect( self.upload.change_default_exif ) self.comboBox_rotate_options.addItems(ALLOWED_ROTATION) def request_api_key(self,): """ requests and stores an api key from the user, if non is stores yet. If none is given a default one is used. """ window = KeyRequest(parent=self) if window.exec_(): apikey = window.lineEdit_apikey.text() if apikey: set_api_key(apikey) return apikey return DEFAULT_API_KEY sys.exit(0) @pyqtSlot() def add_file(self): """ add file(s) to the upload list. using Qts file dialog. """ if self.dialog.exec_(): files = self.dialog.selectedFiles() files = [(file_, 'file') for file_ in files] self.list_view_files_model.add_files(files) @pyqtSlot() def add_url(self,): """ add url(s) to the upload list. using a text box. """ url_input = UrlInput() code = url_input.exec_() urls = url_input.text() new_entrys = [] not_added = [] if code and urls != '': for url in urls.split('\n'): # skip empty lines if url == '': continue parsed_url = urlparse(url, scheme='http') scheme = parsed_url.scheme.lower() if scheme in ['http', 'https', 'ftp']: new_entrys.append((urlunparse(parsed_url), 'url')) else: not_added.append(url) if not_added: message = QMessageBox(QMessageBox.Warning, 'Fehler', ('Ein oder mehrere link(s) konnten ' 'nicht hinzugefügt werden.'), buttons=QMessageBox.Ok, parent=self) message.setDetailedText('\n'.join(not_added)) self.list_view_files_model.add_files(new_entrys) @pyqtSlot() def start_upload(self,): """ starts the upload and does some setup for the status/result dialog. As well as some cleanup afterwards. It locks the application for any further uploads until this one is \ finished. """ if (len(self.list_view_files_model.files) and not self.upload_in_progress and self.legal_resize): self.upload_in_progress = True files = self.list_view_files_model.files.copy() link_dialog = ShowLinks(self.upload, len(files), parent=self) link_dialog.readd_pictures.connect( self.list_view_files_model.add_files ) link_dialog.show() LOGGER.debug('emitting upload signal with arguments: %s', files) self.upload_pictures.emit(files) LOGGER.debug('cleanup main window') self.list_view_files_model.clear_list() elif self.upload_in_progress: LOGGER.debug('Upload already in progress.') QMessageBox.warning(self, 'Upload Läuft', 'Es läuft bereits ein Upload Prozess.') elif not self.legal_resize: LOGGER.debug('illegal resize string will not upload.') # pylint: disable=line-too-long # would harm readability QMessageBox.warning(self, 'Auflösung ungültig', ('Die für die Skalierung angegebene Auflösung ist ungültig. ' 'Bitte gib diese im folgendem format an: breite x höhe') ) else: LOGGER.info('There is nothing to upload.') QMessageBox.information(self, 'Nüx da', ('Es wurden keine bilder zum hochladen ' 'hinzugefügt')) @pyqtSlot() def upload_finished(self,): """ called through a signal after upload is finished to release the lock. """ self.upload_in_progress = False @pyqtSlot(type, tuple) def handle_error(self, exception_type, args): """ displays informations about an exception. """ message = QMessageBox(QMessageBox.Warning, 'Fehler', 'Fehler beim upload.', buttons=QMessageBox.Ok, parent=self) message.setDetailedText(repr(exception_type) + '\n' + repr(args)) message.exec_() @pyqtSlot() def update_resize(self,): if (self.check_box_resize.isChecked() and self.radio_button_absolute.isChecked()): width = self.spin_box_width.value() higth = self.spin_box_higth.value() self.upload.change_default_resize("{}x{}".format(width, higth)) elif (self.check_box_resize.isChecked() and self.radio_button_percentual.isChecked()): percentage = self.spin_box_percentual.value() self.upload.change_default_resize("{}%".format(percentage)) else: self.upload.change_default_resize(None) @pyqtSlot(bool) def set_resize_box_visibility(self, visible): if visible: LOGGER.debug('show resize box') self.update_resize() else: LOGGER.debug('hide resize box') self.update_resize() self.resize_container.setVisible(visible) @pyqtSlot(bool) def set_absolute_resize_box_visibility(self, visible): if visible: LOGGER.debug('show absolute resize box') self.update_resize() else: LOGGER.debug('hide absolute resize box') self.resize_container_absolute.setVisible(visible) @pyqtSlot(bool) def set_percentual_resize_box_visibility(self, visible): if visible: LOGGER.debug('show percentual resize box') self.update_resize() else: LOGGER.debug('hide percentual resize box') self.resize_container_percentual.setVisible(visible) @pyqtSlot() def remove_selected(self,): """ remove selected files from the upload list. """ for item in self.list_view_files.selectedIndexes(): self.list_view_files_model.remove_element(item.row(), item.row()) @pyqtSlot() def display_about_qt(self,): """ displays the about qt dialog """ QMessageBox.aboutQt(self,) @pyqtSlot() def shutdown(self,): """shut down Qapp""" self.thread_cleanup() QCoreApplication.instance().quit() def thread_cleanup(self): """ shuts down the upload thread at exit. """ LOGGER.debug('begin cleanup threads') try: self.upload_thread.quit() self.upload_thread.wait() # pylint: disable=bare-except # I do want to catch them all here, to be able to log them. except: LOGGER.exception('Exception while cleanup') LOGGER.debug('thread cleanup finished')
def browse(self): """ Open a file dialog and select a user specified file. """ formats = [ "Text - comma separated (*.csv, *)", "Text - tab separated (*.tsv, *)", "Text - all files (*)" ] dlg = QFileDialog( self, windowTitle="Open Data File", acceptMode=QFileDialog.AcceptOpen, fileMode=QFileDialog.ExistingFile ) dlg.setNameFilters(formats) state = self.dialog_state lastdir = state.get("directory", "") lastfilter = state.get("filter", "") if lastdir and os.path.isdir(lastdir): dlg.setDirectory(lastdir) if lastfilter: dlg.selectNameFilter(lastfilter) status = dlg.exec_() dlg.deleteLater() if status == QFileDialog.Accepted: self.dialog_state["directory"] = dlg.directory().absolutePath() self.dialog_state["filter"] = dlg.selectedNameFilter() selected_filter = dlg.selectedNameFilter() path = dlg.selectedFiles()[0] # pre-flight check; try to determine the nature of the file mtype = _mime_type_for_path(path) if not mtype.inherits("text/plain"): mb = QMessageBox( parent=self, windowTitle="", icon=QMessageBox.Question, text="The '{basename}' may be a binary file.\n" "Are you sure you want to continue?".format( basename=os.path.basename(path)), standardButtons=QMessageBox.Cancel | QMessageBox.Yes ) mb.setWindowModality(Qt.WindowModal) if mb.exec() == QMessageBox.Cancel: return # initialize dialect based on selected extension if selected_filter in formats[:-1]: filter_idx = formats.index(selected_filter) if filter_idx == 0: dialect = csv.excel() elif filter_idx == 1: dialect = csv.excel_tab() else: dialect = csv.excel_tab() header = True else: try: dialect, header = sniff_csv_with_path(path) except Exception: dialect, header = csv.excel(), True options = None # Search for path in history. # If found use the stored params to initialize the import dialog items = self.itemsFromSettings() idx = index_where(items, lambda t: samepath(t[0], path)) if idx is not None: _, options_ = items[idx] if options_ is not None: options = options_ if options is None: if not header: rowspec = [] else: rowspec = [(range(0, 1), RowSpec.Header)] options = Options( encoding="utf-8", dialect=dialect, rowspec=rowspec) dlg = CSVImportDialog( self, windowTitle="Import Options", sizeGripEnabled=True) dlg.setWindowModality(Qt.WindowModal) dlg.setPath(path) dlg.setOptions(options) status = dlg.exec_() dlg.deleteLater() if status == QDialog.Accepted: self.set_selected_file(path, dlg.options())
def requestWrite(self, node, file_name = None, limit_mimetypes = None): if self._writing: raise OutputDeviceError.DeviceBusyError() dialog = QFileDialog() dialog.setWindowTitle(catalog.i18nc("@title:window", "Save to File")) dialog.setFileMode(QFileDialog.AnyFile) dialog.setAcceptMode(QFileDialog.AcceptSave) # Ensure platform never ask for overwrite confirmation since we do this ourselves dialog.setOption(QFileDialog.DontConfirmOverwrite) if sys.platform == "linux" and "KDE_FULL_SESSION" in os.environ: dialog.setOption(QFileDialog.DontUseNativeDialog) filters = [] mime_types = [] selected_filter = None last_used_type = Preferences.getInstance().getValue("local_file/last_used_type") file_types = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() file_types.sort(key = lambda k: k["description"]) if limit_mimetypes: file_types = list(filter(lambda i: i["mime_type"] in limit_mimetypes, file_types)) if len(file_types) == 0: Logger.log("e", "There are no file types available to write with!") raise OutputDeviceError.WriteRequestFailedError() for item in file_types: type_filter = "{0} (*.{1})".format(item["description"], item["extension"]) filters.append(type_filter) mime_types.append(item["mime_type"]) if last_used_type == item["mime_type"]: selected_filter = type_filter if file_name: file_name += "." + item["extension"] dialog.setNameFilters(filters) if selected_filter != None: dialog.selectNameFilter(selected_filter) if file_name != None: dialog.selectFile(file_name) dialog.restoreState(Preferences.getInstance().getValue("local_file/dialog_state").encode()) if not dialog.exec_(): raise OutputDeviceError.UserCanceledError() Preferences.getInstance().setValue("local_file/dialog_state", str(dialog.saveState())) selected_type = file_types[filters.index(dialog.selectedNameFilter())] Preferences.getInstance().setValue("local_file/last_used_type", selected_type["mime_type"]) file_name = dialog.selectedFiles()[0] if os.path.exists(file_name): result = QMessageBox.question(None, catalog.i18nc("@title:window", "File Already Exists"), catalog.i18nc("@label", "The file <filename>{0}</filename> already exists. Are you sure you want to overwrite it?").format(file_name)) if result == QMessageBox.No: raise OutputDeviceError.UserCanceledError() self.writeStarted.emit(self) mesh_writer = Application.getInstance().getMeshFileHandler().getWriter(selected_type["id"]) try: mode = selected_type["mode"] if mode == MeshWriter.OutputMode.TextMode: Logger.log("d", "Writing to Local File %s in text mode", file_name) stream = open(file_name, "wt") elif mode == MeshWriter.OutputMode.BinaryMode: Logger.log("d", "Writing to Local File %s in binary mode", file_name) stream = open(file_name, "wb") job = WriteMeshJob(mesh_writer, stream, node, mode) job.setFileName(file_name) job.progress.connect(self._onJobProgress) job.finished.connect(self._onWriteJobFinished) message = Message(catalog.i18nc("@info:progress", "Saving to <filename>{0}</filename>").format(file_name), 0, False, -1) message.show() job._message = message self._writing = True job.start() except PermissionError as e: Logger.log("e", "Permission denied when trying to write to %s: %s", file_name, str(e)) raise OutputDeviceError.PermissionDeniedError(catalog.i18nc("@info:status", "Permission denied when trying to save <filename>{0}</filename>").format(file_name)) from e except OSError as e: Logger.log("e", "Operating system would not let us write to %s: %s", file_name, str(e)) raise OutputDeviceError.WriteRequestFailedError(catalog.i18nc("@info:status", "Could not save to <filename>{0}</filename>: <message>{1}</message>").format()) from e