def __init__(self, parent, giface, inputGisdbase, inputLocation, inputMapset, inputLayer, outputGisdbase, outputLocation, outputMapset, etype, id=wx.ID_ANY, title=_("Reprojection"), style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER): self.parent = parent # GMFrame self._giface = giface # used to add layers wx.Dialog.__init__(self, parent, id, title, style=style, name="ReprojectionDialog") self.panel = wx.Panel(parent=self, id=wx.ID_ANY) self.iGisdbase = inputGisdbase self.iLocation = inputLocation self.iMapset = inputMapset self.iLayer = inputLayer self.oGisdbase = outputGisdbase self.oLocation = outputLocation self.oMapset = outputMapset self.etype = etype self._blackList = { 'enabled': True, 'items': { 'r.proj': { 'params': ['location', 'mapset', 'input', 'dbase'], 'flags': ['l']}, 'v.proj': { 'params': ['location', 'mapset', 'input', 'dbase'], 'flags': ['l']}}} if self.etype == 'raster': grass_task = gtask.parse_interface('r.proj', blackList=self._blackList) elif self.etype == 'vector': grass_task = gtask.parse_interface('v.proj', blackList=self._blackList) self.settingsPanel = CmdPanel(parent=self, giface=self._giface, task=grass_task, frame=None) self.closeOnFinished = wx.CheckBox(self.panel, label=_("Close dialog on finish")) # # buttons # # cancel self.btn_close = wx.Button(parent=self.panel, id=wx.ID_CLOSE) self.btn_close.Bind(wx.EVT_BUTTON, lambda evt: self.Close()) # run self.btn_run = wx.Button( parent=self.panel, id=wx.ID_OK, label=_("Reproject")) if self.etype == 'raster': self.btn_run.SetToolTipString(_("Reproject raster")) elif self.etype == 'vector': self.btn_run.SetToolTipString(_("Reproject vector")) self.btn_run.SetDefault() self.btn_run.Bind(wx.EVT_BUTTON, self.OnReproject) self.doLayout()
def createSettingsPage(self): self._blackList = { 'enabled': True, 'items': { self._getCommand(): { 'params': self._getBlackListedParameters(), 'flags': self._getBlackListedFlags()}}} grass_task = gtask.parse_interface(self._getCommand(), blackList=self._blackList) self.advancedPagePanel = CmdPanel( parent=self, giface=None, task=grass_task, frame=None) self.notebook.AddPage(page=self.advancedPagePanel, text=_('Import settings'), name='settings')
def createSettingsPage(self): self._blackList = { 'enabled' : True, 'items' : {self._getCommand() : {'params' : self._getBlackListedParameters(), 'flags' : self._getBlackListedFlags()}}} grass_task = gtask.parse_interface(self._getCommand(), blackList=self._blackList) self.advancedPagePanel = CmdPanel(parent=self, giface=None, task=grass_task, frame=None) self.notebook.AddPage(page = self.advancedPagePanel, text=_('Import settings'), name = 'settings')
def createSettingsPage(self): self._blackList = { "enabled": True, "items": { self._getCommand(): { "params": self._getBlackListedParameters(), "flags": self._getBlackListedFlags(), } }, } grass_task = gtask.parse_interface(self._getCommand(), blackList=self._blackList) self.advancedPagePanel = CmdPanel(parent=self, giface=None, task=grass_task, frame=None) self.notebook.AddPage(page=self.advancedPagePanel, text=_("Import settings"), name="settings")
class ImportDialog(wx.Dialog): """Dialog for bulk import of various data (base class)""" def __init__(self, parent, giface, itype, id = wx.ID_ANY, title = _("Multiple import"), style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER): self.parent = parent # GMFrame self._giface = giface # used to add layers self.importType = itype self.options = dict() # list of options self.options_par = dict() self.commandId = -1 # id of running command wx.Dialog.__init__(self, parent, id, title, style = style, name = "MultiImportDialog") self.panel = wx.Panel(parent = self, id = wx.ID_ANY) self.layerBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY) if self.importType == 'gdal': label = _("List of raster layers") elif self.importType == 'ogr': label = _("List of vector layers") else: label = _("List of %s layers") % self.importType.upper() self.layerBox.SetLabel(" %s - %s " % (label, _("right click to (un)select all"))) # list of layers columns = [_('Layer id'), _('Layer name'), _('Name for output GRASS map (editable)')] if itype == 'ogr': columns.insert(2, _('Feature type')) columns.insert(3, _('Projection match')) elif itype == 'gdal': columns.insert(2, _('Projection match')) self.list = LayersList(parent = self.panel, columns = columns) self.list.LoadData() self.overwrite = wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _("Allow output files to overwrite existing files")) self.overwrite.SetValue(UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled')) self.add = wx.CheckBox(parent = self.panel, id = wx.ID_ANY) self.closeOnFinish = wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _("Close dialog on finish")) self.closeOnFinish.SetValue(UserSettings.Get(group = 'cmd', key = 'closeDlg', subkey = 'enabled')) # # buttons # # cancel self.btn_close = wx.Button(parent = self.panel, id = wx.ID_CLOSE) self.btn_close.SetToolTipString(_("Close dialog")) self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose) # run self.btn_run = wx.Button(parent = self.panel, id = wx.ID_OK, label = _("&Import")) self.btn_run.SetToolTipString(_("Import selected layers")) self.btn_run.SetDefault() self.btn_run.Bind(wx.EVT_BUTTON, self.OnRun) self.Bind(wx.EVT_CLOSE, lambda evt: self.Destroy()) self.notebook = GNotebook(parent = self, style = FN.FNB_FANCY_TABS | FN.FNB_BOTTOM | FN.FNB_NO_X_BUTTON) self.notebook.AddPage(page = self.panel, text=_('Source settings'), name = 'source') self.createSettingsPage() def createSettingsPage(self): self._blackList = { 'enabled' : True, 'items' : {self._getCommand() : {'params' : self._getBlackListedParameters(), 'flags' : self._getBlackListedFlags()}}} grass_task = gtask.parse_interface(self._getCommand(), blackList=self._blackList) self.advancedPagePanel = CmdPanel(parent=self, giface=None, task=grass_task, frame=None) self.notebook.AddPage(page = self.advancedPagePanel, text=_('Import settings'), name = 'settings') def doLayout(self): """Do layout""" dialogSizer = wx.BoxSizer(wx.VERTICAL) # dsn input dialogSizer.Add(item = self.dsnInput, proportion = 0, flag = wx.EXPAND) # # list of DXF layers # layerSizer = wx.StaticBoxSizer(self.layerBox, wx.HORIZONTAL) layerSizer.Add(item = self.list, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5) dialogSizer.Add(item = layerSizer, proportion = 1, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5) dialogSizer.Add(item = self.overwrite, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5) dialogSizer.Add(item = self.add, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5) dialogSizer.Add(item = self.closeOnFinish, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5) # # buttons # btnsizer = wx.BoxSizer(orient = wx.HORIZONTAL) btnsizer.Add(item = self.btn_close, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER, border = 10) btnsizer.Add(item = self.btn_run, proportion = 0, flag = wx.RIGHT | wx.ALIGN_CENTER, border = 10) dialogSizer.Add(item = btnsizer, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.ALIGN_RIGHT, border = 10) # dialogSizer.SetSizeHints(self.panel) self.panel.SetAutoLayout(True) self.panel.SetSizer(dialogSizer) dialogSizer.Fit(self.panel) # auto-layout seems not work here - FIXME size = wx.Size(globalvar.DIALOG_GSELECT_SIZE[0] + 225, 550) self.SetMinSize(size) self.SetSize((size.width, size.height + 100)) # width = self.GetSize()[0] # self.list.SetColumnWidth(col = 1, width = width / 2 - 50) self.Layout() def _getCommand(self): """Get command""" raise NotImplementedError() def _getBlackListedParameters(self): """Get parameters which will not be showed in Settings page""" raise NotImplementedError() def _getBlackListedFlags(self): """Get flags which will not be showed in Settings page""" raise NotImplementedError() def OnClose(self, event = None): """Close dialog""" self.Close() def OnRun(self, event): """Import/Link data (each layes as separate vector map)""" pass def AddLayers(self, returncode, cmd = None, userData = None): """Add imported/linked layers into layer tree""" if not self.add.IsChecked() or returncode != 0: return # TODO: if importing map creates more map the folowing does not work # * do nothing if map does not exist or # * try to determine names using regexp or # * persuade import tools to report map names self.commandId += 1 layer, output = self.list.GetLayers()[self.commandId][:2] if '@' not in output: name = output + '@' + grass.gisenv()['MAPSET'] else: name = output # add imported layers into layer tree # an alternative would be emit signal (mapCreated) and (optionally) # connect to this signal llist = self._giface.GetLayerList() if self.importType == 'gdal': if userData: nBands = int(userData.get('nbands', 1)) else: nBands = 1 if UserSettings.Get(group = 'rasterLayer', key = 'opaque', subkey = 'enabled'): nFlag = True else: nFlag = False for i in range(1, nBands+1): nameOrig = name if nBands > 1: mapName, mapsetName = name.split('@') mapName += '.%d' % i name = mapName + '@' + mapsetName cmd = ['d.rast', 'map=%s' % name] if nFlag: cmd.append('-n') llist.AddLayer(ltype='raster', name=name, checked=True, cmd=cmd) name = nameOrig else: llist.AddLayer(ltype='vector', name=name, checked=True, cmd=['d.vect', 'map=%s' % name] + GetDisplayVectSettings()) self._giface.GetMapWindow().ZoomToMap() def OnAbort(self, event): """Abort running import .. todo:: not yet implemented """ pass def OnCmdDone(self, event): """Do what has to be done after importing""" pass def _getLayersToReprojetion(self, projMatch_idx, grassName_idx): """If there are layers with different projection from loation projection, show dialog to user to explicitly select layers which will be reprojected...""" differentProjLayers = [] data = self.list.GetData(checked=True) for itm in data: layerId = itm[-1] # select only layers with different projetion if self.layersData[layerId][projMatch_idx] == 0: dt = [itm[0], itm[grassName_idx]] differentProjLayers.append(tuple(dt)) layers = self.list.GetLayers() if differentProjLayers and '-o' not in self.getSettingsPageCmd(): dlg = RerojectionDialog(parent=self, giface=self._giface, data=differentProjLayers) ret = dlg.ShowModal() if ret == wx.ID_OK: # do not import unchecked layers for itm in reversed(list(dlg.GetData(checked=False))): idx = itm[-1] layers.pop(idx) else: return None; return layers def getSettingsPageCmd(self): return self.advancedPagePanel.createCmd(ignoreErrors=True, ignoreRequired=True)
class ImportDialog(wx.Dialog): """Dialog for bulk import of various data (base class)""" def __init__(self, parent, giface, itype, id=wx.ID_ANY, title=_("Multiple import"), style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER): self.parent = parent # GMFrame self._giface = giface # used to add layers self.importType = itype self.options = dict() # list of options self.options_par = dict() self.commandId = -1 # id of running command wx.Dialog.__init__(self, parent, id, title, style=style, name="MultiImportDialog") self.panel = wx.Panel(parent=self, id=wx.ID_ANY) self.layerBox = StaticBox(parent=self.panel, id=wx.ID_ANY) if self.importType == 'gdal': label = _("List of raster layers") elif self.importType == 'ogr': label = _("List of vector layers") else: label = _("List of %s layers") % self.importType.upper() self.layerBox.SetLabel(" %s - %s " % (label, _("right click to (un)select all"))) # list of layers columns = [ _('Layer id'), _('Layer name'), _('Name for output GRASS map (editable)') ] if itype == 'ogr': columns.insert(2, _('Feature type')) columns.insert(3, _('Projection match')) elif itype == 'gdal': columns.insert(2, _('Projection match')) self.list = LayersList(parent=self.panel, columns=columns) self.list.LoadData() self.override = wx.CheckBox( parent=self.panel, id=wx.ID_ANY, label=_( "Override projection check (use current location's projection)" )) self.overwrite = wx.CheckBox( parent=self.panel, id=wx.ID_ANY, label=_("Allow output files to overwrite existing files")) self.overwrite.SetValue( UserSettings.Get(group='cmd', key='overwrite', subkey='enabled')) self.overwrite.Bind(wx.EVT_CHECKBOX, self.OnCheckOverwrite) if UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'): self.list.validate = False self.add = wx.CheckBox(parent=self.panel, id=wx.ID_ANY) self.closeOnFinish = wx.CheckBox(parent=self.panel, id=wx.ID_ANY, label=_("Close dialog on finish")) self.closeOnFinish.SetValue( UserSettings.Get(group='cmd', key='closeDlg', subkey='enabled')) # # buttons # # cancel self.btn_close = CloseButton(parent=self.panel) self.btn_close.SetToolTip(_("Close dialog")) self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose) # run self.btn_run = Button(parent=self.panel, id=wx.ID_OK, label=_("&Import")) self.btn_run.SetToolTip(_("Import selected layers")) self.btn_run.SetDefault() self.btn_run.Bind(wx.EVT_BUTTON, self.OnRun) self.Bind(wx.EVT_CLOSE, lambda evt: self.Destroy()) self.notebook = GNotebook(parent=self, style=globalvar.FNPageDStyle) self.notebook.AddPage(page=self.panel, text=_('Source settings'), name='source') self.createSettingsPage() def createSettingsPage(self): self._blackList = { 'enabled': True, 'items': { self._getCommand(): { 'params': self._getBlackListedParameters(), 'flags': self._getBlackListedFlags() } } } grass_task = gtask.parse_interface(self._getCommand(), blackList=self._blackList) self.advancedPagePanel = CmdPanel(parent=self, giface=None, task=grass_task, frame=None) self.notebook.AddPage(page=self.advancedPagePanel, text=_('Import settings'), name='settings') def doLayout(self): """Do layout""" dialogSizer = wx.BoxSizer(wx.VERTICAL) # dsn input dialogSizer.Add(self.dsnInput, proportion=0, flag=wx.EXPAND) # # list of DXF layers # layerSizer = wx.StaticBoxSizer(self.layerBox, wx.HORIZONTAL) layerSizer.Add(self.list, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) dialogSizer.Add(layerSizer, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5) dialogSizer.Add(self.override, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) dialogSizer.Add(self.overwrite, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) dialogSizer.Add(self.add, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) dialogSizer.Add(self.closeOnFinish, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5) # # buttons # btnsizer = wx.BoxSizer(orient=wx.HORIZONTAL) btnsizer.Add(self.btn_close, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER, border=10) btnsizer.Add(self.btn_run, proportion=0, flag=wx.RIGHT | wx.ALIGN_CENTER, border=10) dialogSizer.Add(btnsizer, proportion=0, flag=wx.BOTTOM | wx.ALIGN_RIGHT, border=10) # dialogSizer.SetSizeHints(self.panel) self.panel.SetAutoLayout(True) self.panel.SetSizer(dialogSizer) dialogSizer.Fit(self.panel) # auto-layout seems not work here - FIXME size = wx.Size(globalvar.DIALOG_GSELECT_SIZE[0] + 322, 550) self.SetMinSize(size) self.SetSize((size.width, size.height + 100)) # width = self.GetSize()[0] # self.list.SetColumnWidth(col = 1, width = width / 2 - 50) self.Layout() def _getCommand(self): """Get command""" raise NotImplementedError() def _getBlackListedParameters(self): """Get parameters which will not be showed in Settings page""" raise NotImplementedError() def _getBlackListedFlags(self): """Get flags which will not be showed in Settings page""" raise NotImplementedError() def _nameValidationFailed(self, layers_list): """Output map name validation callback :param layers_list: LayersList class instance """ if isinstance(layers_list.output_map, list): maps = ['<{}>'.format(m) for m in layers_list.output_map] message = _("Output map names %(names)s exist. ") % { 'names': ', '.join(maps) } else: message = _("Output map name <%(name)s> exist. ") % { 'name': layers_list.output_map } GError(parent=self, message=message, caption=_("Invalid name")) def _validateOutputMapName(self): """Enable/disable output map name validation according the overwrite state""" if not self.overwrite.IsChecked(): if not self.list.GetValidator().\ Validate(win=self.list, validate_all=True): return False return True def OnClose(self, event=None): """Close dialog""" self.Close() def OnRun(self, event): """Import/Link data (each layes as separate vector map)""" pass def OnCheckOverwrite(self, event): """Check/uncheck overwrite checkbox widget""" if self.overwrite.IsChecked(): self.list.validate = False else: self.list.validate = True def AddLayers(self, returncode, cmd=None, userData=None): """Add imported/linked layers into layer tree""" if not self.add.IsChecked() or returncode != 0: return # TODO: if importing map creates more map the following does not work # * do nothing if map does not exist or # * try to determine names using regexp or # * persuade import tools to report map names self.commandId += 1 layer, output = self.list.GetLayers()[self.commandId][:2] if '@' not in output: name = output + '@' + grass.gisenv()['MAPSET'] else: name = output # add imported layers into layer tree # an alternative would be emit signal (mapCreated) and (optionally) # connect to this signal llist = self._giface.GetLayerList() if self.importType == 'gdal': if userData: nBands = int(userData.get('nbands', 1)) else: nBands = 1 if UserSettings.Get(group='rasterLayer', key='opaque', subkey='enabled'): nFlag = True else: nFlag = False for i in range(1, nBands + 1): nameOrig = name if nBands > 1: mapName, mapsetName = name.split('@') mapName += '.%d' % i name = mapName + '@' + mapsetName cmd = ['d.rast', 'map=%s' % name] if nFlag: cmd.append('-n') llist.AddLayer(ltype='raster', name=name, checked=True, cmd=cmd) name = nameOrig else: llist.AddLayer(ltype='vector', name=name, checked=True, cmd=['d.vect', 'map=%s' % name] + GetDisplayVectSettings()) self._giface.GetMapWindow().ZoomToMap() def OnAbort(self, event): """Abort running import .. todo:: not yet implemented """ pass def OnCmdDone(self, event): """Do what has to be done after importing""" pass def _getLayersToReprojetion(self, projMatch_idx, grassName_idx): """If there are layers with different projection from loation projection, show dialog to user to explicitly select layers which will be reprojected...""" differentProjLayers = [] data = self.list.GetData(checked=True) for itm in data: layerId = itm[-1] # select only layers with different projetion if self.layersData[layerId][projMatch_idx] == 0: dt = [itm[0], itm[grassName_idx]] differentProjLayers.append(tuple(dt)) layers = self.list.GetLayers() if not self.link and \ differentProjLayers and \ not self.override.IsChecked(): # '-o' not in self.getSettingsPageCmd(): dlg = ReprojectionDialog(parent=self, giface=self._giface, data=differentProjLayers) ret = dlg.ShowModal() if ret == wx.ID_OK: # do not import unchecked layers for itm in reversed(list(dlg.GetData(checked=False))): idx = itm[-1] layers.pop(idx) else: return None return layers def getSettingsPageCmd(self): return self.advancedPagePanel.createCmd(ignoreErrors=True, ignoreRequired=True)
class CatalogReprojectionDialog(wx.Dialog): """ """ def __init__(self, parent, giface, inputGisdbase, inputLocation, inputMapset, inputLayer, outputGisdbase, outputLocation, outputMapset, etype, id=wx.ID_ANY, title=_("Reprojection"), style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER): self.parent = parent # GMFrame self._giface = giface # used to add layers wx.Dialog.__init__(self, parent, id, title, style=style, name="ReprojectionDialog") self.panel = wx.Panel(parent=self, id=wx.ID_ANY) self.iGisdbase = inputGisdbase self.iLocation = inputLocation self.iMapset = inputMapset self.iLayer = inputLayer self.oGisdbase = outputGisdbase self.oLocation = outputLocation self.oMapset = outputMapset self.etype = etype self._blackList = { 'enabled': True, 'items': { 'r.proj': { 'params': ['location', 'mapset', 'input', 'dbase'], 'flags': ['l']}, 'v.proj': { 'params': ['location', 'mapset', 'input', 'dbase'], 'flags': ['l']}}} if self.etype == 'raster': grass_task = gtask.parse_interface('r.proj', blackList=self._blackList) elif self.etype == 'vector': grass_task = gtask.parse_interface('v.proj', blackList=self._blackList) self.settingsPanel = CmdPanel(parent=self, giface=self._giface, task=grass_task, frame=None) self.closeOnFinished = wx.CheckBox(self.panel, label=_("Close dialog on finish")) # # buttons # # cancel self.btn_close = wx.Button(parent=self.panel, id=wx.ID_CLOSE) self.btn_close.Bind(wx.EVT_BUTTON, lambda evt: self.Close()) # run self.btn_run = wx.Button( parent=self.panel, id=wx.ID_OK, label=_("Reproject")) if self.etype == 'raster': self.btn_run.SetToolTipString(_("Reproject raster")) elif self.etype == 'vector': self.btn_run.SetToolTipString(_("Reproject vector")) self.btn_run.SetDefault() self.btn_run.Bind(wx.EVT_BUTTON, self.OnReproject) self.doLayout() def doLayout(self): """Do layout""" dialogSizer = wx.BoxSizer(wx.VERTICAL) dialogSizer.Add(wx.StaticText(self.panel, label=_("The copied layer needs to be reprojected:")), flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=5) dialogSizer.Add(item=self.settingsPanel, proportion=1, flag=wx.ALL | wx.EXPAND, border=5) dialogSizer.Add(item=self.closeOnFinished, flag=wx.ALL | wx.EXPAND, border=5) # # buttons # btnsizer = wx.BoxSizer(orient=wx.HORIZONTAL) btnsizer.Add(item=self.btn_close, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER, border=10) btnsizer.Add(item=self.btn_run, proportion=0, flag=wx.RIGHT | wx.ALIGN_CENTER, border=10) dialogSizer.Add( item=btnsizer, proportion=0, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, border=5) self.panel.SetSizer(dialogSizer) dialogSizer.Fit(self.panel) self.Layout() # sizing not working properly self.SetMinSize(self.GetBestSize()) def getSettingsPageCmd(self): return self.settingsPanel.createCmd( ignoreErrors=True, ignoreRequired=True) def OnReproject(self, event): cmd = self.getSettingsPageCmd() cmd.append('dbase=' + self.iGisdbase) cmd.append('location=' + self.iLocation) cmd.append('mapset=' + self.iMapset) cmd.append('input=' + self.iLayer) self.tmpfile, env = gscript.create_environment(self.oGisdbase, self.oLocation, self.oMapset) self._giface.RunCmd(cmd, env=env, onDone=self.OnDone, userData=None, notification=Notification.MAKE_VISIBLE) def OnDone(self, event): gscript.try_remove(self.tmpfile) if self.closeOnFinished.IsChecked() and event.returncode == 0: self.Close()