diff -r 816bc1c6db77 -r 34f74c19ed7a src/eric7/PipInterface/PipPackagesWidget.py --- a/src/eric7/PipInterface/PipPackagesWidget.py Sun May 28 14:40:38 2023 +0200 +++ b/src/eric7/PipInterface/PipPackagesWidget.py Sun Jul 02 17:39:33 2023 +0200 @@ -12,7 +12,7 @@ import os import textwrap -from packaging.specifiers import SpecifierSet +from packaging.specifiers import InvalidSpecifier, SpecifierSet from PyQt6.QtCore import Qt, QUrl, QUrlQuery, pyqtSlot from PyQt6.QtGui import QIcon from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest @@ -177,8 +177,8 @@ @param pip reference to the global pip interface @type Pip - @param parent reference to the parent widget - @type QWidget + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) """ super().__init__(parent) self.setupUi(self) @@ -246,9 +246,10 @@ venvManager.virtualEnvironmentRemoved.connect(self.on_refreshButton_clicked) self.__selectedEnvironment = None - project = ericApp().getObject("Project") - project.projectOpened.connect(self.__projectOpened) - project.projectClosed.connect(self.__projectClosed) + with contextlib.suppress(KeyError): + project = ericApp().getObject("Project") + project.projectOpened.connect(self.__projectOpened) + project.projectClosed.connect(self.__projectClosed) self.__initPipMenu() self.__populateEnvironments() @@ -1554,7 +1555,28 @@ """ Private slot to open the configuration page. """ - ericApp().getObject("UserInterface").showPreferences("pipPage") + try: + ericApp().getObject("UserInterface").showPreferences("pipPage") + except KeyError: + # we were called from outside the eric IDE + from eric7.Preferences.ConfigurationDialog import ( # noqa: I101 + ConfigurationDialog, + ConfigurationMode, + ) + + dlg = ConfigurationDialog( + None, + "Configuration", + True, + fromEric=False, + displayMode=ConfigurationMode.PIPMANAGERMODE, + ) + dlg.show() + dlg.showConfigurationPageByName("pipPage") + dlg.exec() + if dlg.result() == QDialog.DialogCode.Accepted: + dlg.setPreferences() + Preferences.syncPreferences() @pyqtSlot() def __showCacheInfo(self): @@ -1848,11 +1870,17 @@ if dependency["required_version"][0] in "0123456789" else dependency["required_version"] ) - specifierSet = SpecifierSet(specifiers=spec) - if not specifierSet.contains(dependency["installed_version"]): - itm.setIcon( + try: + specifierSet = SpecifierSet(specifiers=spec) + if not specifierSet.contains(dependency["installed_version"]): + itm.setIcon( + PipPackagesWidget.DepRequiredVersionColumn, + EricPixmapCache.getIcon("warning"), + ) + except InvalidSpecifier: + itm.setText( PipPackagesWidget.DepRequiredVersionColumn, - EricPixmapCache.getIcon("warning"), + dependency["required_version"], ) elif dependency["required_version"].lower() == "any":