- Implemented some enhancements related to indicating outdated packages. release-10.2.0

Sun, 28 Jul 2024 11:46:18 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 28 Jul 2024 11:46:18 +0200
changeset 32
b7a3ae7519ba
parent 31
17e37d4ebe42
child 33
f721a3360a3b

- Implemented some enhancements related to indicating outdated packages.
- Implemented a check for executed apps before upgrading a package.

PipxInterface/ConfigurationPage/PipxPage.py file | annotate | diff | comparison | revisions
PipxInterface/ConfigurationPage/PipxPage.ui file | annotate | diff | comparison | revisions
PipxInterface/ConfigurationPage/Ui_PipxPage.py file | annotate | diff | comparison | revisions
PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html file | annotate | diff | comparison | revisions
PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html file | annotate | diff | comparison | revisions
PipxInterface/Pipx.py file | annotate | diff | comparison | revisions
PipxInterface/PipxWidget.py file | annotate | diff | comparison | revisions
PipxInterface/i18n/pipx_de.qm file | annotate | diff | comparison | revisions
PipxInterface/i18n/pipx_de.ts file | annotate | diff | comparison | revisions
PipxInterface/i18n/pipx_empty.ts file | annotate | diff | comparison | revisions
PipxInterface/i18n/pipx_en.ts file | annotate | diff | comparison | revisions
PipxInterface/i18n/pipx_es.ts file | annotate | diff | comparison | revisions
PipxInterface/i18n/pipx_ru.ts file | annotate | diff | comparison | revisions
PluginPipxInterface.py file | annotate | diff | comparison | revisions
PluginPipxInterface.zip file | annotate | diff | comparison | revisions
changelog.md file | annotate | diff | comparison | revisions
--- a/PipxInterface/ConfigurationPage/PipxPage.py	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/ConfigurationPage/PipxPage.py	Sun Jul 28 11:46:18 2024 +0200
@@ -37,6 +37,12 @@
         self.indexEdit.setText(Preferences.getPip("PipSearchIndex"))
 
         # set initial values
+        self.autoCheckOutdatedCheckBox.setChecked(
+            self.__plugin.getPreferences("AutoCheckOutdated")
+        )
+        self.outdatedDependenciesCheckBox.setChecked(
+            self.__plugin.getPreferences("IncludeOutdatedDependencies")
+        )
         self.recentWorkdirsSpinBox.setValue(
             self.__plugin.getPreferences("MaxRecentAppWorkdirs")
         )
@@ -46,5 +52,11 @@
         Public slot to save the MQTT Monitor configuration.
         """
         self.__plugin.setPreferences(
+            "AutoCheckOutdated", self.autoCheckOutdatedCheckBox.isChecked()
+        )
+        self.__plugin.setPreferences(
+            "IncludeOutdatedDependencies", self.outdatedDependenciesCheckBox.isChecked()
+        )
+        self.__plugin.setPreferences(
             "MaxRecentAppWorkdirs", self.recentWorkdirsSpinBox.value()
         )
--- a/PipxInterface/ConfigurationPage/PipxPage.ui	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/ConfigurationPage/PipxPage.ui	Sun Jul 28 11:46:18 2024 +0200
@@ -7,10 +7,10 @@
     <x>0</x>
     <y>0</y>
     <width>548</width>
-    <height>300</height>
+    <height>383</height>
    </rect>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_2">
+  <layout class="QVBoxLayout" name="verticalLayout_3">
    <item>
     <widget class="QLabel" name="headerLabel">
      <property name="text">
@@ -61,6 +61,35 @@
     </widget>
    </item>
    <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Outdated Application Packages</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <item>
+       <widget class="QCheckBox" name="autoCheckOutdatedCheckBox">
+        <property name="toolTip">
+         <string>Select to determine outdated packages when loading the list of installed packages.</string>
+        </property>
+        <property name="text">
+         <string>Determine outdated packages automatically</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="outdatedDependenciesCheckBox">
+        <property name="toolTip">
+         <string>Select to determine packages with any outdated dependencies when determining outdated packages.</string>
+        </property>
+        <property name="text">
+         <string>Determine packages with outdated dependencies</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
     <widget class="QGroupBox" name="groupBox_7">
      <property name="title">
       <string>Recent Application Working Directories</string>
@@ -120,6 +149,12 @@
    </item>
   </layout>
  </widget>
+ <tabstops>
+  <tabstop>indexEdit</tabstop>
+  <tabstop>autoCheckOutdatedCheckBox</tabstop>
+  <tabstop>outdatedDependenciesCheckBox</tabstop>
+  <tabstop>recentWorkdirsSpinBox</tabstop>
+ </tabstops>
  <resources/>
  <connections/>
 </ui>
--- a/PipxInterface/ConfigurationPage/Ui_PipxPage.py	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/ConfigurationPage/Ui_PipxPage.py	Sun Jul 28 11:46:18 2024 +0200
@@ -1,6 +1,6 @@
 # Form implementation generated from reading ui file 'PipxInterface/ConfigurationPage/PipxPage.ui'
 #
-# Created by: PyQt6 UI code generator 6.7.0
+# Created by: PyQt6 UI code generator 6.7.1
 #
 # WARNING: Any manual changes made to this file will be lost when pyuic6 is
 # run again.  Do not edit this file unless you know what you are doing.
@@ -12,18 +12,18 @@
 class Ui_PipxPage(object):
     def setupUi(self, PipxPage):
         PipxPage.setObjectName("PipxPage")
-        PipxPage.resize(548, 300)
-        self.verticalLayout_2 = QtWidgets.QVBoxLayout(PipxPage)
-        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        PipxPage.resize(548, 383)
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout(PipxPage)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
         self.headerLabel = QtWidgets.QLabel(parent=PipxPage)
         self.headerLabel.setObjectName("headerLabel")
-        self.verticalLayout_2.addWidget(self.headerLabel)
+        self.verticalLayout_3.addWidget(self.headerLabel)
         self.line9_3 = QtWidgets.QFrame(parent=PipxPage)
         self.line9_3.setFrameShape(QtWidgets.QFrame.Shape.HLine)
         self.line9_3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
         self.line9_3.setFrameShape(QtWidgets.QFrame.Shape.HLine)
         self.line9_3.setObjectName("line9_3")
-        self.verticalLayout_2.addWidget(self.line9_3)
+        self.verticalLayout_3.addWidget(self.line9_3)
         self.groupBox_2 = QtWidgets.QGroupBox(parent=PipxPage)
         self.groupBox_2.setObjectName("groupBox_2")
         self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox_2)
@@ -37,7 +37,18 @@
         self.indexLabel.setWordWrap(True)
         self.indexLabel.setObjectName("indexLabel")
         self.verticalLayout.addWidget(self.indexLabel)
-        self.verticalLayout_2.addWidget(self.groupBox_2)
+        self.verticalLayout_3.addWidget(self.groupBox_2)
+        self.groupBox = QtWidgets.QGroupBox(parent=PipxPage)
+        self.groupBox.setObjectName("groupBox")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.autoCheckOutdatedCheckBox = QtWidgets.QCheckBox(parent=self.groupBox)
+        self.autoCheckOutdatedCheckBox.setObjectName("autoCheckOutdatedCheckBox")
+        self.verticalLayout_2.addWidget(self.autoCheckOutdatedCheckBox)
+        self.outdatedDependenciesCheckBox = QtWidgets.QCheckBox(parent=self.groupBox)
+        self.outdatedDependenciesCheckBox.setObjectName("outdatedDependenciesCheckBox")
+        self.verticalLayout_2.addWidget(self.outdatedDependenciesCheckBox)
+        self.verticalLayout_3.addWidget(self.groupBox)
         self.groupBox_7 = QtWidgets.QGroupBox(parent=PipxPage)
         self.groupBox_7.setObjectName("groupBox_7")
         self.hboxlayout = QtWidgets.QHBoxLayout(self.groupBox_7)
@@ -53,18 +64,26 @@
         self.hboxlayout.addWidget(self.recentWorkdirsSpinBox)
         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
         self.hboxlayout.addItem(spacerItem)
-        self.verticalLayout_2.addWidget(self.groupBox_7)
+        self.verticalLayout_3.addWidget(self.groupBox_7)
         spacerItem1 = QtWidgets.QSpacerItem(20, 73, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding)
-        self.verticalLayout_2.addItem(spacerItem1)
+        self.verticalLayout_3.addItem(spacerItem1)
 
         self.retranslateUi(PipxPage)
         QtCore.QMetaObject.connectSlotsByName(PipxPage)
+        PipxPage.setTabOrder(self.indexEdit, self.autoCheckOutdatedCheckBox)
+        PipxPage.setTabOrder(self.autoCheckOutdatedCheckBox, self.outdatedDependenciesCheckBox)
+        PipxPage.setTabOrder(self.outdatedDependenciesCheckBox, self.recentWorkdirsSpinBox)
 
     def retranslateUi(self, PipxPage):
         _translate = QtCore.QCoreApplication.translate
         self.headerLabel.setText(_translate("PipxPage", "<b>Configure Python Application Management</b>"))
         self.groupBox_2.setTitle(_translate("PipxPage", "Index URL"))
         self.indexLabel.setText(_translate("PipxPage", "<b>Note</b>: The index URL is configured on the \'Python Package Management\' page."))
+        self.groupBox.setTitle(_translate("PipxPage", "Outdated Application Packages"))
+        self.autoCheckOutdatedCheckBox.setToolTip(_translate("PipxPage", "Select to determine outdated packages when loading the list of installed packages."))
+        self.autoCheckOutdatedCheckBox.setText(_translate("PipxPage", "Determine outdated packages automatically"))
+        self.outdatedDependenciesCheckBox.setToolTip(_translate("PipxPage", "Select to determine packages with any outdated dependencies when determining outdated packages."))
+        self.outdatedDependenciesCheckBox.setText(_translate("PipxPage", "Determine packages with outdated dependencies"))
         self.groupBox_7.setTitle(_translate("PipxPage", "Recent Application Working Directories"))
         self.label.setText(_translate("PipxPage", "Number of recent working directories:"))
         self.recentWorkdirsSpinBox.setToolTip(_translate("PipxPage", "Enter the number of recently used working directories  to remember"))
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html	Sun Jul 28 11:46:18 2024 +0200
@@ -232,13 +232,14 @@
 <dl>
 <dt>Return:</dt>
 <dd>
-latest version in case the package is outdated and None otherwise
+tuple containing the latest version in case the package is outdated
+            or None otherwise and a flag indicating any outdated dependencies
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-str or None
+tuple of (str or None, bool)
 </dd>
 </dl>
 <a NAME="Pipx.createSpecMetadataFile" ID="Pipx.createSpecMetadataFile"></a>
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html	Sun Jul 28 11:46:18 2024 +0200
@@ -43,6 +43,7 @@
 <table>
 <tr><td>AppPathRole</td></tr>
 <tr><td>LatestVersionRole</td></tr>
+<tr><td>OutdatedDependenciesRole</td></tr>
 <tr><td>PackageColumn</td></tr>
 <tr><td>PythonVersionColumn</td></tr>
 <tr><td>VersionColumn</td></tr>
@@ -77,6 +78,14 @@
 <td>Private slot to ensure that the directory where pipx stores apps is in your PATH environment variable.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__getAllRunningApps">__getAllRunningApps</a></td>
+<td>Private method to determine all running pipx managed apps.</td>
+</tr>
+<tr>
+<td><a href="#PipxWidget.__getRunningApps">__getRunningApps</a></td>
+<td>Private method to determine, which app of the given list of apps is running.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__initPipxMenu">__initPipxMenu</a></td>
 <td>Private method to create the super menu and attach it to the super menu button.</td>
 </tr>
@@ -89,10 +98,18 @@
 <td>Private slot to install packages to be given by the user.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__markPackageDependenciesOutdated">__markPackageDependenciesOutdated</a></td>
+<td>Private method to mark the given package item as having outdated dependencies.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__markPackageOutdated">__markPackageOutdated</a></td>
 <td>Private method to mark the given package item as outdated.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__packageApps">__packageApps</a></td>
+<td>Private method to determine the apps belonging to a package item.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__pipxConfigure">__pipxConfigure</a></td>
 <td>Private slot to show the pipx configuration page.</td>
 </tr>
@@ -113,6 +130,10 @@
 <td>Private method to resize the columns of the packages list.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__selectedPackageItems">__selectedPackageItems</a></td>
+<td>Private method to determine the list of selected package items.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__selectedPackages">__selectedPackages</a></td>
 <td>Private method to determine the list of selected packages.</td>
 </tr>
@@ -216,6 +237,51 @@
         in your PATH environment variable.
 </p>
 
+<a NAME="PipxWidget.__getAllRunningApps" ID="PipxWidget.__getAllRunningApps"></a>
+<h4>PipxWidget.__getAllRunningApps</h4>
+<b>__getAllRunningApps</b>(<i></i>)
+<p>
+        Private method to determine all running pipx managed apps.
+</p>
+
+<dl>
+<dt>Return:</dt>
+<dd>
+set of running apps
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+set of str
+</dd>
+</dl>
+<a NAME="PipxWidget.__getRunningApps" ID="PipxWidget.__getRunningApps"></a>
+<h4>PipxWidget.__getRunningApps</h4>
+<b>__getRunningApps</b>(<i>apps</i>)
+<p>
+        Private method to determine, which app of the given list of apps is running.
+</p>
+
+<dl>
+
+<dt><i>apps</i> (str)</dt>
+<dd>
+list of apps to check
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+set of running apps
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+set of str
+</dd>
+</dl>
 <a NAME="PipxWidget.__initPipxMenu" ID="PipxWidget.__initPipxMenu"></a>
 <h4>PipxWidget.__initPipxMenu</h4>
 <b>__initPipxMenu</b>(<i></i>)
@@ -238,9 +304,23 @@
         Private slot to install packages to be given by the user.
 </p>
 
+<a NAME="PipxWidget.__markPackageDependenciesOutdated" ID="PipxWidget.__markPackageDependenciesOutdated"></a>
+<h4>PipxWidget.__markPackageDependenciesOutdated</h4>
+<b>__markPackageDependenciesOutdated</b>(<i>item</i>)
+<p>
+        Private method to mark the given package item as having outdated dependencies.
+</p>
+
+<dl>
+
+<dt><i>item</i> (QTreeWidgetItem)</dt>
+<dd>
+reference to the outdated package item
+</dd>
+</dl>
 <a NAME="PipxWidget.__markPackageOutdated" ID="PipxWidget.__markPackageOutdated"></a>
 <h4>PipxWidget.__markPackageOutdated</h4>
-<b>__markPackageOutdated</b>(<i>item, latestVersion</i>)
+<b>__markPackageOutdated</b>(<i>item, latestVersion, outdatedDependencies</i>)
 <p>
         Private method to mark the given package item as outdated.
 </p>
@@ -256,6 +336,32 @@
 latest version of the package
 </dd>
 </dl>
+<a NAME="PipxWidget.__packageApps" ID="PipxWidget.__packageApps"></a>
+<h4>PipxWidget.__packageApps</h4>
+<b>__packageApps</b>(<i>packageItem</i>)
+<p>
+        Private method to determine the apps belonging to a package item.
+</p>
+
+<dl>
+
+<dt><i>packageItem</i> (QTreeWidgetItem)</dt>
+<dd>
+reference to the package item
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+list of app names
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list of str
+</dd>
+</dl>
 <a NAME="PipxWidget.__pipxConfigure" ID="PipxWidget.__pipxConfigure"></a>
 <h4>PipxWidget.__pipxConfigure</h4>
 <b>__pipxConfigure</b>(<i></i>)
@@ -291,6 +397,25 @@
         Private method to resize the columns of the packages list.
 </p>
 
+<a NAME="PipxWidget.__selectedPackageItems" ID="PipxWidget.__selectedPackageItems"></a>
+<h4>PipxWidget.__selectedPackageItems</h4>
+<b>__selectedPackageItems</b>(<i></i>)
+<p>
+        Private method to determine the list of selected package items.
+</p>
+
+<dl>
+<dt>Return:</dt>
+<dd>
+list of selected package items
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list of QTreeWidgetItem
+</dd>
+</dl>
 <a NAME="PipxWidget.__selectedPackages" ID="PipxWidget.__selectedPackages"></a>
 <h4>PipxWidget.__selectedPackages</h4>
 <b>__selectedPackages</b>(<i></i>)
@@ -307,7 +432,7 @@
 <dl>
 <dt>Return Type:</dt>
 <dd>
-list of QTreeWidgetItem
+list of str
 </dd>
 </dl>
 <a NAME="PipxWidget.__showInterpreters" ID="PipxWidget.__showInterpreters"></a>
--- a/PipxInterface/Pipx.py	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/Pipx.py	Sun Jul 28 11:46:18 2024 +0200
@@ -441,8 +441,9 @@
 
         @param package name of the package
         @type str
-        @return latest version in case the package is outdated and None otherwise
-        @rtype str or None
+        @return tuple containing the latest version in case the package is outdated
+            or None otherwise and a flag indicating any outdated dependencies
+        @rtype tuple of (str or None, bool)
         """
         args = ["runpip", package, "list", "--outdated", "--format", "json"]
         if Preferences.getPip("PipSearchIndex"):
@@ -458,15 +459,15 @@
                     "<p>Reason: {1}</p>"
                 ).format(package, output),
             )
-            return None
+            return None, False
 
         outdatedList = json.loads(output)
         # check if the main package is in the list
         for outdatedPackage in outdatedList:
             if outdatedPackage["name"] == package:
-                return outdatedPackage["latest_version"]
+                return outdatedPackage["latest_version"], len(outdatedList) > 1
 
-        return None
+        return None, bool(outdatedList)
 
     def upgradePackage(self, package):
         """
--- a/PipxInterface/PipxWidget.py	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/PipxWidget.py	Sun Jul 28 11:46:18 2024 +0200
@@ -36,6 +36,7 @@
     AppPathRole = Qt.ItemDataRole.UserRole
     VersionRole = Qt.ItemDataRole.UserRole + 1
     LatestVersionRole = Qt.ItemDataRole.UserRole + 2
+    OutdatedDependenciesRole = Qt.ItemDataRole.UserRole + 3
 
     def __init__(self, plugin, fromEric=True, parent=None):
         """
@@ -338,10 +339,16 @@
             for row in range(self.packagesList.topLevelItemCount()):
                 itm = self.packagesList.topLevelItem(row)
                 package = itm.text(PipxWidget.PackageColumn)
-                latestVersion = self.__pipx.checkPackageOutdated(package)
+                latestVersion, outdatedDependencies = self.__pipx.checkPackageOutdated(
+                    package
+                )
                 if latestVersion is not None:
-                    self.__markPackageOutdated(itm, latestVersion)
-                # TODO: check outdated dependencies (configurable)
+                    self.__markPackageOutdated(itm, latestVersion, outdatedDependencies)
+                elif (
+                    self.__plugin.getPreferences("IncludeOutdatedDependencies")
+                    and outdatedDependencies
+                ):
+                    self.__markPackageDependenciesOutdated(itm)
         self.__resizePackagesColumns()
 
     @pyqtSlot()
@@ -470,7 +477,7 @@
         self.packagesList.resizeColumnToContents(PipxWidget.VersionColumn)
         self.packagesList.resizeColumnToContents(PipxWidget.PythonVersionColumn)
 
-    def __markPackageOutdated(self, item, latestVersion):
+    def __markPackageOutdated(self, item, latestVersion, outdatedDependencies):
         """
         Private method to mark the given package item as outdated.
 
@@ -481,6 +488,7 @@
         """
         version = item.data(0, PipxWidget.VersionRole)
         item.setData(0, PipxWidget.LatestVersionRole, latestVersion)
+        item.setData(0, PipxWidget.OutdatedDependenciesRole, outdatedDependencies)
         item.setText(
             PipxWidget.VersionColumn,
             self.tr("{0} ({1})", "current version, latest version").format(
@@ -489,6 +497,16 @@
         )
         item.setIcon(PipxWidget.VersionColumn, EricPixmapCache.getIcon("upgrade"))
 
+    def __markPackageDependenciesOutdated(self, item):
+        """
+        Private method to mark the given package item as having outdated dependencies.
+
+        @param item reference to the outdated package item
+        @type QTreeWidgetItem
+        """
+        item.setData(0, PipxWidget.OutdatedDependenciesRole, True)
+        item.setIcon(PipxWidget.VersionColumn, EricPixmapCache.getIcon("upgrade"))
+
     def __populatePackages(self):
         """
         Private method to populate the packages list.
@@ -512,6 +530,10 @@
             for app, appPath in package["apps"]:
                 itm = QTreeWidgetItem(topItem, [app])
                 itm.setData(0, PipxWidget.AppPathRole, appPath)
+
+        if self.__plugin.getPreferences("AutoCheckOutdated"):
+            self.__checkOutdatedPackages()
+
         self.__resizePackagesColumns()
 
     @pyqtSlot()
@@ -528,8 +550,12 @@
             if itm.isExpanded():
                 expandedPackages.append(itm.text(PipxWidget.PackageColumn))
             latestVersion = itm.data(0, PipxWidget.LatestVersionRole)
-            if latestVersion is not None:
-                outdatedPackages[itm.text(PipxWidget.PackageColumn)] = latestVersion
+            outdatedDependencies = itm.data(0, PipxWidget.OutdatedDependenciesRole)
+            if latestVersion or outdatedDependencies:
+                outdatedPackages[itm.text(PipxWidget.PackageColumn)] = (
+                    latestVersion,
+                    outdatedDependencies,
+                )
 
         self.__populatePackages()
 
@@ -539,11 +565,16 @@
             if package in expandedPackages:
                 itm.setExpanded(True)
 
-            if (
-                package in outdatedPackages
-                and itm.data(0, PipxWidget.VersionRole) != outdatedPackages[package]
-            ):
-                self.__markPackageOutdated(itm, outdatedPackages[package])
+            if package in outdatedPackages:
+                latestVersion, outdatedDependencies = outdatedPackages[package]
+                if itm.data(0, PipxWidget.VersionRole) != latestVersion:
+                    self.__markPackageOutdated(itm, latestVersion, outdatedDependencies)
+                elif (
+                    itm.data(0, PipxWidget.OutdatedDependenciesRole)
+                    != outdatedDependencies
+                    and outdatedDependencies
+                ):
+                    self.__markPackageDependenciesOutdated()
 
         self.__resizePackagesColumns()
 
@@ -630,9 +661,13 @@
         @rtype set of str
         """
         runningApps = set()
-        
-        for proc in psutil.process_iter(["name"]):
-            if proc.info["name"] in apps:
+        venvs = self.venvsPathEdit.text()
+        for proc in psutil.process_iter(["name", "cmdline"]):
+            if (
+                proc.info["name"] in apps
+                and proc.info["cmdline"]
+                and proc.info["cmdline"][0].startswith(venvs)
+            ):
                 runningApps.add(proc.info["name"])
 
         return runningApps
Binary file PipxInterface/i18n/pipx_de.qm has changed
--- a/PipxInterface/i18n/pipx_de.ts	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/i18n/pipx_de.ts	Sun Jul 28 11:46:18 2024 +0200
@@ -54,42 +54,42 @@
       <translation>Alle Pakete deinstallieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="455" />
+      <location filename="../Pipx.py" line="456" />
       <source>Check Outdated Package</source>
       <translation>Prüfe veraltete Pakete</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
+      <location filename="../Pipx.py" line="457" />
       <source>&lt;p&gt;The status of package &lt;b&gt;{0}&lt;/b&gt; could not be determined.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;Der Status des Paketes &lt;b&gt;{0}&lt;/b&gt; konnte nicht bestimmt werden.&lt;/p&gt;&lt;p&gt;Ursache: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="483" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Package</source>
       <translation>Paket aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="493" />
+      <location filename="../Pipx.py" line="494" />
       <source>Upgrade All Packages</source>
       <translation>Alle Pakete aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="503" />
+      <location filename="../Pipx.py" line="504" />
       <source>Upgrade Shared Libraries</source>
       <translation>Gemeinsame Bibliotheken aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="517" />
+      <location filename="../Pipx.py" line="518" />
       <source>Upgrade Interpreters</source>
       <translation>Interpreter aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="530" />
+      <location filename="../Pipx.py" line="531" />
       <source>Prune Unused Interpreters</source>
       <translation>Ungenutzte Interpreter entfernen</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="541" />
+      <location filename="../Pipx.py" line="542" />
       <source>Ensure PATH Modifications</source>
       <translation>PATH-Änderungen sicherstellen</translation>
     </message>
@@ -296,6 +296,31 @@
     </message>
     <message>
       <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Outdated Application Packages</source>
+      <translation>Veraltete Anwendungspakete</translation>
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine outdated packages when loading the list of installed packages.</source>
+      <translation>Auswählen, um veraltete Pakete beim Laden der Liste installierter Pakete zu bestimmen.</translation>
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine outdated packages automatically</source>
+      <translation>Automatische Ermittlung veralteter Pakete</translation>
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine packages with any outdated dependencies when determining outdated packages.</source>
+      <translation>Auswählen, um Pakete mit veralteten Abhängigkeiten bei der Ermittlung veralteter Pakete zu bestimmen.</translation>
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine packages with outdated dependencies</source>
+      <translation>Ermittle Pakete mit veralteten Abhängigkeiten</translation>
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
       <source>Recent Application Working Directories</source>
       <translation>Arbeitsverzeichnisse für Anwendungen</translation>
     </message>
@@ -434,172 +459,184 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="105" />
+      <location filename="../PipxWidget.py" line="108" />
       <source>Install</source>
       <translation>Installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="199" />
-      <location filename="../PipxWidget.py" line="107" />
+      <location filename="../PipxWidget.py" line="202" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install Packages</source>
       <translation>Pakete installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="218" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="221" />
+      <location filename="../PipxWidget.py" line="113" />
       <source>Install All Packages</source>
       <translation>Alle Pakete installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="114" />
+      <location filename="../PipxWidget.py" line="117" />
       <source>Re-Install Selected Package</source>
       <translation>Ausgewähltes Paket neu installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="316" />
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="319" />
+      <location filename="../PipxWidget.py" line="120" />
       <source>Re-Install All Packages</source>
       <translation>Alle Pakete neu installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="274" />
-      <location filename="../PipxWidget.py" line="265" />
-      <location filename="../PipxWidget.py" line="253" />
-      <location filename="../PipxWidget.py" line="237" />
-      <location filename="../PipxWidget.py" line="121" />
+      <location filename="../PipxWidget.py" line="277" />
+      <location filename="../PipxWidget.py" line="268" />
+      <location filename="../PipxWidget.py" line="256" />
+      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="124" />
       <source>Create Spec Metadata File</source>
       <translation>Erzeuge Spec-Metadaten-Datei</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="128" />
+      <location filename="../PipxWidget.py" line="131" />
       <source>Upgrade</source>
       <translation>Aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="130" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Check Outdated Packages</source>
       <translation>Prüfe veraltete Pakete</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="134" />
+      <location filename="../PipxWidget.py" line="364" />
+      <location filename="../PipxWidget.py" line="137" />
       <source>Upgrade Selected Package</source>
       <translation>Ausgewähltes Paket aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="385" />
+      <location filename="../PipxWidget.py" line="140" />
       <source>Upgrade All Packages</source>
       <translation>Alle Pakete aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="141" />
+      <location filename="../PipxWidget.py" line="144" />
       <source>Upgrade Shared Libraries</source>
       <translation>Gemeinsame Bibliotheken aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="148" />
+      <location filename="../PipxWidget.py" line="151" />
       <source>Uninstall</source>
       <translation>Deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="150" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall Selected Package</source>
       <translation>Ausgewähltes Paket deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="392" />
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="427" />
+      <location filename="../PipxWidget.py" line="156" />
       <source>Uninstall All Packages</source>
       <translation>Alle Pakete deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="168" />
+      <location filename="../PipxWidget.py" line="171" />
       <source>Standalone Interpreters</source>
       <translation>Eigenständige Interpreter</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="172" />
+      <location filename="../PipxWidget.py" line="175" />
       <source>Ensure PATH Modifications</source>
       <translation>PATH-Änderungen sicherstellen</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="178" />
       <source>Configure...</source>
       <translation>Einstellungen...</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="239" />
+      <location filename="../PipxWidget.py" line="242" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation>JSON Dateien (*.json);;Alle Dateien (*)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="243" />
       <source>JSON Files (*.json)</source>
       <translation>JSON-Dateien (*.json)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="254" />
+      <location filename="../PipxWidget.py" line="257" />
       <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; exists already. Overwrite it?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Die Datei &lt;b&gt;{0}&lt;/b&gt; existiert bereits. Überschreiben?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="266" />
+      <location filename="../PipxWidget.py" line="269" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; was created successfully.&lt;/p&gt;</source>
       <translation>&lt;p&gt;Die Spec-Metadaten-Datei &lt;b&gt;{0}&lt;/b&gt; wurde erfolgreich erzeugt.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="275" />
+      <location filename="../PipxWidget.py" line="278" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;Die Spec-Metadaten-Datei &lt;b&gt;{0}&lt;/b&gt; konnte nicht erzeugt werden.&lt;/p&gt;&lt;p&gt;Ursache: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="291" />
+      <location filename="../PipxWidget.py" line="294" />
       <source>Re-Install Package</source>
       <translation>Paket neu installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="292" />
+      <location filename="../PipxWidget.py" line="295" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be reinstalled?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Soll das Paket &lt;b&gt;{0}&lt;/b&gt; wirklich neu installiert werden?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="317" />
+      <location filename="../PipxWidget.py" line="320" />
       <source>Do you really want to reinstall all packages?</source>
       <translation>Sollen wirklich alle Pakete neu installiert werden?</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="376" />
+      <location filename="../PipxWidget.py" line="365" />
+      <source>&lt;p&gt;The selected package cannot be upgraded because some of its apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation>&lt;p&gt;Das ausgewählte Paket kann nicht aktualisiert werden, da einige seiner Anwendungen ausgeführt werden.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Beende diese Anwendungen und versuche es erneut.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="386" />
+      <source>&lt;p&gt;The packages cannot be upgraded because some of their apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation>&lt;p&gt;Die Pakete können nicht aktualisiert werden, da einige ihrer Anwendungen ausgeführt werden.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Beende diese Anwendungen und versuche es erneut.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="411" />
       <source>Uninstall Package</source>
       <translation>Paket deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="377" />
+      <location filename="../PipxWidget.py" line="412" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be uninstalled?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Soll das Paket &lt;b&gt;{0}&lt;/b&gt; wirklich deinstalliert werden?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="393" />
+      <location filename="../PipxWidget.py" line="428" />
       <source>&lt;p&gt;Do you really want to uninstall &lt;b&gt;ALL&lt;/b&gt; packages?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Sollen wirklich &lt;b&gt;ALLE&lt;/b&gt; Pakete deinstalliert werden?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="433" />
+      <location filename="../PipxWidget.py" line="468" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation>&lt;b&gt;pipx Version {0}&lt;/b&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="458" />
+      <location filename="../PipxWidget.py" line="494" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation>{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="476" />
+      <location filename="../PipxWidget.py" line="523" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation>{0}{1}</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="478" />
+      <location filename="../PipxWidget.py" line="525" />
       <source> (standalone)</source>
       <translation> (eigenständig)</translation>
     </message>
@@ -672,30 +709,30 @@
   <context>
     <name>PluginPipxInterface</name>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="188" />
+      <location filename="../../PluginPipxInterface.py" line="192" />
+      <location filename="../../PluginPipxInterface.py" line="191" />
       <location filename="../../PluginPipxInterface.py" line="187" />
-      <location filename="../../PluginPipxInterface.py" line="183" />
-      <location filename="../../PluginPipxInterface.py" line="70" />
+      <location filename="../../PluginPipxInterface.py" line="72" />
       <source>PyPI Application Management</source>
       <translation>PyPI Anwendungsmanagement</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="114" />
+      <location filename="../../PluginPipxInterface.py" line="116" />
       <source>Python Application Management</source>
       <translation>Python Anwendungsmanagement</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="189" />
+      <location filename="../../PluginPipxInterface.py" line="193" />
       <source>Ctrl+Alt+Shift+A</source>
       <translation>Ctrl+Alt+Shift+A</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="195" />
+      <location filename="../../PluginPipxInterface.py" line="199" />
       <source>Switch the input focus to the PyPI Application Management window.</source>
       <translation>Schalte den Eingabefokus auf die PyPI Anwendungsverwaltung um.</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="198" />
+      <location filename="../../PluginPipxInterface.py" line="202" />
       <source>&lt;b&gt;Activate PyPI Application Management&lt;/b&gt;&lt;p&gt;This switches the input focus to the PyPI Application Management window.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Aktiviere PyPI Anwendungsmanagement&lt;/b&gt;&lt;p&gt;Dies schaltet den Eingabefokus auf die PyPI Anwendungsverwaltung um.&lt;/p&gt;</translation>
     </message>
--- a/PipxInterface/i18n/pipx_empty.ts	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/i18n/pipx_empty.ts	Sun Jul 28 11:46:18 2024 +0200
@@ -54,42 +54,42 @@
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="455" />
+      <location filename="../Pipx.py" line="456" />
       <source>Check Outdated Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
+      <location filename="../Pipx.py" line="457" />
       <source>&lt;p&gt;The status of package &lt;b&gt;{0}&lt;/b&gt; could not be determined.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="483" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="493" />
+      <location filename="../Pipx.py" line="494" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="503" />
+      <location filename="../Pipx.py" line="504" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="517" />
+      <location filename="../Pipx.py" line="518" />
       <source>Upgrade Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="530" />
+      <location filename="../Pipx.py" line="531" />
       <source>Prune Unused Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="541" />
+      <location filename="../Pipx.py" line="542" />
       <source>Ensure PATH Modifications</source>
       <translation type="unfinished" />
     </message>
@@ -296,6 +296,31 @@
     </message>
     <message>
       <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Outdated Application Packages</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine outdated packages when loading the list of installed packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine outdated packages automatically</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine packages with any outdated dependencies when determining outdated packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine packages with outdated dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
       <source>Recent Application Working Directories</source>
       <translation type="unfinished" />
     </message>
@@ -434,172 +459,184 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="105" />
+      <location filename="../PipxWidget.py" line="108" />
       <source>Install</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="199" />
-      <location filename="../PipxWidget.py" line="107" />
+      <location filename="../PipxWidget.py" line="202" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="218" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="221" />
+      <location filename="../PipxWidget.py" line="113" />
       <source>Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="114" />
+      <location filename="../PipxWidget.py" line="117" />
       <source>Re-Install Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="316" />
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="319" />
+      <location filename="../PipxWidget.py" line="120" />
       <source>Re-Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="274" />
-      <location filename="../PipxWidget.py" line="265" />
-      <location filename="../PipxWidget.py" line="253" />
-      <location filename="../PipxWidget.py" line="237" />
-      <location filename="../PipxWidget.py" line="121" />
+      <location filename="../PipxWidget.py" line="277" />
+      <location filename="../PipxWidget.py" line="268" />
+      <location filename="../PipxWidget.py" line="256" />
+      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="124" />
       <source>Create Spec Metadata File</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="128" />
+      <location filename="../PipxWidget.py" line="131" />
       <source>Upgrade</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="130" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Check Outdated Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="134" />
+      <location filename="../PipxWidget.py" line="364" />
+      <location filename="../PipxWidget.py" line="137" />
       <source>Upgrade Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="385" />
+      <location filename="../PipxWidget.py" line="140" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="141" />
+      <location filename="../PipxWidget.py" line="144" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="148" />
+      <location filename="../PipxWidget.py" line="151" />
       <source>Uninstall</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="150" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="392" />
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="427" />
+      <location filename="../PipxWidget.py" line="156" />
       <source>Uninstall All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="168" />
+      <location filename="../PipxWidget.py" line="171" />
       <source>Standalone Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="172" />
-      <source>Ensure PATH Modifications</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
       <location filename="../PipxWidget.py" line="175" />
+      <source>Ensure PATH Modifications</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="178" />
       <source>Configure...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="239" />
+      <location filename="../PipxWidget.py" line="242" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="243" />
       <source>JSON Files (*.json)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="254" />
+      <location filename="../PipxWidget.py" line="257" />
       <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; exists already. Overwrite it?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="266" />
+      <location filename="../PipxWidget.py" line="269" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; was created successfully.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="275" />
+      <location filename="../PipxWidget.py" line="278" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="291" />
+      <location filename="../PipxWidget.py" line="294" />
       <source>Re-Install Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="292" />
+      <location filename="../PipxWidget.py" line="295" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be reinstalled?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="317" />
+      <location filename="../PipxWidget.py" line="320" />
       <source>Do you really want to reinstall all packages?</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="376" />
+      <location filename="../PipxWidget.py" line="365" />
+      <source>&lt;p&gt;The selected package cannot be upgraded because some of its apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="386" />
+      <source>&lt;p&gt;The packages cannot be upgraded because some of their apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="411" />
       <source>Uninstall Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="377" />
+      <location filename="../PipxWidget.py" line="412" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be uninstalled?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="393" />
+      <location filename="../PipxWidget.py" line="428" />
       <source>&lt;p&gt;Do you really want to uninstall &lt;b&gt;ALL&lt;/b&gt; packages?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="433" />
+      <location filename="../PipxWidget.py" line="468" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="458" />
+      <location filename="../PipxWidget.py" line="494" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="476" />
+      <location filename="../PipxWidget.py" line="523" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="478" />
+      <location filename="../PipxWidget.py" line="525" />
       <source> (standalone)</source>
       <translation type="unfinished" />
     </message>
@@ -672,30 +709,30 @@
   <context>
     <name>PluginPipxInterface</name>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="188" />
+      <location filename="../../PluginPipxInterface.py" line="192" />
+      <location filename="../../PluginPipxInterface.py" line="191" />
       <location filename="../../PluginPipxInterface.py" line="187" />
-      <location filename="../../PluginPipxInterface.py" line="183" />
-      <location filename="../../PluginPipxInterface.py" line="70" />
+      <location filename="../../PluginPipxInterface.py" line="72" />
       <source>PyPI Application Management</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="114" />
+      <location filename="../../PluginPipxInterface.py" line="116" />
       <source>Python Application Management</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="189" />
+      <location filename="../../PluginPipxInterface.py" line="193" />
       <source>Ctrl+Alt+Shift+A</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="195" />
+      <location filename="../../PluginPipxInterface.py" line="199" />
       <source>Switch the input focus to the PyPI Application Management window.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="198" />
+      <location filename="../../PluginPipxInterface.py" line="202" />
       <source>&lt;b&gt;Activate PyPI Application Management&lt;/b&gt;&lt;p&gt;This switches the input focus to the PyPI Application Management window.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
--- a/PipxInterface/i18n/pipx_en.ts	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/i18n/pipx_en.ts	Sun Jul 28 11:46:18 2024 +0200
@@ -54,42 +54,42 @@
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="455" />
+      <location filename="../Pipx.py" line="456" />
       <source>Check Outdated Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
+      <location filename="../Pipx.py" line="457" />
       <source>&lt;p&gt;The status of package &lt;b&gt;{0}&lt;/b&gt; could not be determined.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="483" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="493" />
+      <location filename="../Pipx.py" line="494" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="503" />
+      <location filename="../Pipx.py" line="504" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="517" />
+      <location filename="../Pipx.py" line="518" />
       <source>Upgrade Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="530" />
+      <location filename="../Pipx.py" line="531" />
       <source>Prune Unused Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="541" />
+      <location filename="../Pipx.py" line="542" />
       <source>Ensure PATH Modifications</source>
       <translation type="unfinished" />
     </message>
@@ -296,6 +296,31 @@
     </message>
     <message>
       <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Outdated Application Packages</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine outdated packages when loading the list of installed packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine outdated packages automatically</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine packages with any outdated dependencies when determining outdated packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine packages with outdated dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
       <source>Recent Application Working Directories</source>
       <translation type="unfinished" />
     </message>
@@ -434,172 +459,184 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="105" />
+      <location filename="../PipxWidget.py" line="108" />
       <source>Install</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="199" />
-      <location filename="../PipxWidget.py" line="107" />
+      <location filename="../PipxWidget.py" line="202" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="218" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="221" />
+      <location filename="../PipxWidget.py" line="113" />
       <source>Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="114" />
+      <location filename="../PipxWidget.py" line="117" />
       <source>Re-Install Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="316" />
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="319" />
+      <location filename="../PipxWidget.py" line="120" />
       <source>Re-Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="274" />
-      <location filename="../PipxWidget.py" line="265" />
-      <location filename="../PipxWidget.py" line="253" />
-      <location filename="../PipxWidget.py" line="237" />
-      <location filename="../PipxWidget.py" line="121" />
+      <location filename="../PipxWidget.py" line="277" />
+      <location filename="../PipxWidget.py" line="268" />
+      <location filename="../PipxWidget.py" line="256" />
+      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="124" />
       <source>Create Spec Metadata File</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="128" />
+      <location filename="../PipxWidget.py" line="131" />
       <source>Upgrade</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="130" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Check Outdated Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="134" />
+      <location filename="../PipxWidget.py" line="364" />
+      <location filename="../PipxWidget.py" line="137" />
       <source>Upgrade Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="385" />
+      <location filename="../PipxWidget.py" line="140" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="141" />
+      <location filename="../PipxWidget.py" line="144" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="148" />
+      <location filename="../PipxWidget.py" line="151" />
       <source>Uninstall</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="150" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="392" />
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="427" />
+      <location filename="../PipxWidget.py" line="156" />
       <source>Uninstall All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="168" />
+      <location filename="../PipxWidget.py" line="171" />
       <source>Standalone Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="172" />
-      <source>Ensure PATH Modifications</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
       <location filename="../PipxWidget.py" line="175" />
+      <source>Ensure PATH Modifications</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="178" />
       <source>Configure...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="239" />
+      <location filename="../PipxWidget.py" line="242" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="243" />
       <source>JSON Files (*.json)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="254" />
+      <location filename="../PipxWidget.py" line="257" />
       <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; exists already. Overwrite it?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="266" />
+      <location filename="../PipxWidget.py" line="269" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; was created successfully.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="275" />
+      <location filename="../PipxWidget.py" line="278" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="291" />
+      <location filename="../PipxWidget.py" line="294" />
       <source>Re-Install Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="292" />
+      <location filename="../PipxWidget.py" line="295" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be reinstalled?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="317" />
+      <location filename="../PipxWidget.py" line="320" />
       <source>Do you really want to reinstall all packages?</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="376" />
+      <location filename="../PipxWidget.py" line="365" />
+      <source>&lt;p&gt;The selected package cannot be upgraded because some of its apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="386" />
+      <source>&lt;p&gt;The packages cannot be upgraded because some of their apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="411" />
       <source>Uninstall Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="377" />
+      <location filename="../PipxWidget.py" line="412" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be uninstalled?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="393" />
+      <location filename="../PipxWidget.py" line="428" />
       <source>&lt;p&gt;Do you really want to uninstall &lt;b&gt;ALL&lt;/b&gt; packages?&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="433" />
+      <location filename="../PipxWidget.py" line="468" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="458" />
+      <location filename="../PipxWidget.py" line="494" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="476" />
+      <location filename="../PipxWidget.py" line="523" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="478" />
+      <location filename="../PipxWidget.py" line="525" />
       <source> (standalone)</source>
       <translation type="unfinished" />
     </message>
@@ -672,30 +709,30 @@
   <context>
     <name>PluginPipxInterface</name>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="188" />
+      <location filename="../../PluginPipxInterface.py" line="192" />
+      <location filename="../../PluginPipxInterface.py" line="191" />
       <location filename="../../PluginPipxInterface.py" line="187" />
-      <location filename="../../PluginPipxInterface.py" line="183" />
-      <location filename="../../PluginPipxInterface.py" line="70" />
+      <location filename="../../PluginPipxInterface.py" line="72" />
       <source>PyPI Application Management</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="114" />
+      <location filename="../../PluginPipxInterface.py" line="116" />
       <source>Python Application Management</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="189" />
+      <location filename="../../PluginPipxInterface.py" line="193" />
       <source>Ctrl+Alt+Shift+A</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="195" />
+      <location filename="../../PluginPipxInterface.py" line="199" />
       <source>Switch the input focus to the PyPI Application Management window.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="198" />
+      <location filename="../../PluginPipxInterface.py" line="202" />
       <source>&lt;b&gt;Activate PyPI Application Management&lt;/b&gt;&lt;p&gt;This switches the input focus to the PyPI Application Management window.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
--- a/PipxInterface/i18n/pipx_es.ts	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/i18n/pipx_es.ts	Sun Jul 28 11:46:18 2024 +0200
@@ -24,72 +24,72 @@
       <translation>pipx no se ha podido iniciar.</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="288" />
+      <location filename="../Pipx.py" line="284" />
       <source>Install Packages</source>
       <translation>Instalar Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="333" />
+      <location filename="../Pipx.py" line="329" />
       <source>Install All Packages</source>
       <translation>Instalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="383" />
+      <location filename="../Pipx.py" line="379" />
       <source>Re-Install Package</source>
       <translation>Reinstalar Package</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="414" />
+      <location filename="../Pipx.py" line="410" />
       <source>Re-Install All Packages</source>
       <translation>Reinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="427" />
+      <location filename="../Pipx.py" line="423" />
       <source>Uninstall Package</source>
       <translation>Desinstalar Package</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="437" />
+      <location filename="../Pipx.py" line="433" />
       <source>Uninstall All Packages</source>
       <translation>Desinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="459" />
+      <location filename="../Pipx.py" line="456" />
       <source>Check Outdated Package</source>
       <translation>Comprobar Package Desactualizado</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="460" />
+      <location filename="../Pipx.py" line="457" />
       <source>&lt;p&gt;The status of package &lt;b&gt;{0}&lt;/b&gt; could not be determined.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;El status del package &lt;b&gt;{0}&lt;/b&gt; no se ha podido determinar.&lt;/p&gt;&lt;p&gt;Razón: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="487" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Package</source>
       <translation>Actualizar Package</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="497" />
+      <location filename="../Pipx.py" line="494" />
       <source>Upgrade All Packages</source>
       <translation>Actualizar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="507" />
+      <location filename="../Pipx.py" line="504" />
       <source>Upgrade Shared Libraries</source>
       <translation>Actualizar Bibliotecas Compartidas</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="521" />
+      <location filename="../Pipx.py" line="518" />
       <source>Upgrade Interpreters</source>
       <translation>Actualizar Intérpretes</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="534" />
+      <location filename="../Pipx.py" line="531" />
       <source>Prune Unused Interpreters</source>
       <translation>Limpiar Intérpretes no Utililizados</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="545" />
+      <location filename="../Pipx.py" line="542" />
       <source>Ensure PATH Modifications</source>
       <translation>Asegurar modificaciones de PATH</translation>
     </message>
@@ -296,6 +296,31 @@
     </message>
     <message>
       <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Outdated Application Packages</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine outdated packages when loading the list of installed packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine outdated packages automatically</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine packages with any outdated dependencies when determining outdated packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine packages with outdated dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
       <source>Recent Application Working Directories</source>
       <translation>Directorios de Trabajo de Aplicación Recientes</translation>
     </message>
@@ -434,172 +459,184 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="105" />
+      <location filename="../PipxWidget.py" line="108" />
       <source>Install</source>
       <translation>Instalar</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="199" />
-      <location filename="../PipxWidget.py" line="107" />
+      <location filename="../PipxWidget.py" line="202" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install Packages</source>
       <translation>Instalar Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="218" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="221" />
+      <location filename="../PipxWidget.py" line="113" />
       <source>Install All Packages</source>
       <translation>Instalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="114" />
+      <location filename="../PipxWidget.py" line="117" />
       <source>Re-Install Selected Package</source>
       <translation>Reinstalar Package Seleccionado</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="316" />
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="319" />
+      <location filename="../PipxWidget.py" line="120" />
       <source>Re-Install All Packages</source>
       <translation>Reinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="274" />
-      <location filename="../PipxWidget.py" line="265" />
-      <location filename="../PipxWidget.py" line="253" />
-      <location filename="../PipxWidget.py" line="237" />
-      <location filename="../PipxWidget.py" line="121" />
+      <location filename="../PipxWidget.py" line="277" />
+      <location filename="../PipxWidget.py" line="268" />
+      <location filename="../PipxWidget.py" line="256" />
+      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="124" />
       <source>Create Spec Metadata File</source>
       <translation>Crear Archivo de Metadatos de Spec</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="128" />
+      <location filename="../PipxWidget.py" line="131" />
       <source>Upgrade</source>
       <translation>Actualizar</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="130" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Check Outdated Packages</source>
       <translation>Comprobar Packages Desactualizados</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="134" />
+      <location filename="../PipxWidget.py" line="364" />
+      <location filename="../PipxWidget.py" line="137" />
       <source>Upgrade Selected Package</source>
       <translation>Actualizar Package Seleccionado</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="385" />
+      <location filename="../PipxWidget.py" line="140" />
       <source>Upgrade All Packages</source>
       <translation>Actualizar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="141" />
+      <location filename="../PipxWidget.py" line="144" />
       <source>Upgrade Shared Libraries</source>
       <translation>Actualizar Bibliotecas Compartidas</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="148" />
+      <location filename="../PipxWidget.py" line="151" />
       <source>Uninstall</source>
       <translation>Desinstalar</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="150" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall Selected Package</source>
       <translation>Desinstalar Package Seleccionado</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="394" />
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="427" />
+      <location filename="../PipxWidget.py" line="156" />
       <source>Uninstall All Packages</source>
       <translation>Desinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="168" />
+      <location filename="../PipxWidget.py" line="171" />
       <source>Standalone Interpreters</source>
       <translation>Intérpretes Independientes</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="172" />
+      <location filename="../PipxWidget.py" line="175" />
       <source>Ensure PATH Modifications</source>
       <translation>Asegurar modificaciones de PATH</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="178" />
       <source>Configure...</source>
       <translation>Configurar...</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="239" />
+      <location filename="../PipxWidget.py" line="242" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation>Archivos JSON (*.json);;Todos los Archivos (*)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="243" />
       <source>JSON Files (*.json)</source>
       <translation>Archivos JSON (*.json)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="254" />
+      <location filename="../PipxWidget.py" line="257" />
       <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; exists already. Overwrite it?&lt;/p&gt;</source>
       <translation>&lt;p&gt;El archivo &lt;b&gt;{0}&lt;/b&gt; ya existe. ¿Desea sobreescribirlo?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="266" />
+      <location filename="../PipxWidget.py" line="269" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; was created successfully.&lt;/p&gt;</source>
       <translation>&lt;p&gt;El archivo de metadatos de spec &lt;b&gt;{0}&lt;/b&gt; se ha creado con éxito&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="275" />
+      <location filename="../PipxWidget.py" line="278" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;El archivo de metadatos de spec &lt;b&gt;{0}&lt;/b&gt; no se ha podido crear.&lt;/p&gt;&lt;p&gt;Razón: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="291" />
+      <location filename="../PipxWidget.py" line="294" />
       <source>Re-Install Package</source>
       <translation>Reinstalar Package</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="292" />
+      <location filename="../PipxWidget.py" line="295" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be reinstalled?&lt;/p&gt;</source>
       <translation>&lt;p&gt;¿Debe ser el package &lt;b&gt;{0}&lt;/b&gt; reinstalado seguro?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="317" />
+      <location filename="../PipxWidget.py" line="320" />
       <source>Do you really want to reinstall all packages?</source>
       <translation>¿Desea seguro reinstalar todos los packages?</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="378" />
+      <location filename="../PipxWidget.py" line="365" />
+      <source>&lt;p&gt;The selected package cannot be upgraded because some of its apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="386" />
+      <source>&lt;p&gt;The packages cannot be upgraded because some of their apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="411" />
       <source>Uninstall Package</source>
       <translation>Desinstalar Package</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="379" />
+      <location filename="../PipxWidget.py" line="412" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be uninstalled?&lt;/p&gt;</source>
       <translation>&lt;p&gt;¿Debe ser el package &lt;b&gt;{0}&lt;/b&gt; desinstalado seguro?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="395" />
+      <location filename="../PipxWidget.py" line="428" />
       <source>&lt;p&gt;Do you really want to uninstall &lt;b&gt;ALL&lt;/b&gt; packages?&lt;/p&gt;</source>
       <translation>&lt;p&gt;¿Desea seguro desinstalar &lt;b&gt;TODOS&lt;/b&gt; los packages?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="435" />
+      <location filename="../PipxWidget.py" line="468" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation>&lt;b&gt;pipx Versión {0}&lt;/b&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="460" />
+      <location filename="../PipxWidget.py" line="494" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation>{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="480" />
+      <location filename="../PipxWidget.py" line="523" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation>{0}{1}</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="482" />
+      <location filename="../PipxWidget.py" line="525" />
       <source> (standalone)</source>
       <translation> (independiente)</translation>
     </message>
@@ -672,30 +709,30 @@
   <context>
     <name>PluginPipxInterface</name>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="189" />
-      <location filename="../../PluginPipxInterface.py" line="188" />
-      <location filename="../../PluginPipxInterface.py" line="184" />
-      <location filename="../../PluginPipxInterface.py" line="71" />
+      <location filename="../../PluginPipxInterface.py" line="192" />
+      <location filename="../../PluginPipxInterface.py" line="191" />
+      <location filename="../../PluginPipxInterface.py" line="187" />
+      <location filename="../../PluginPipxInterface.py" line="72" />
       <source>PyPI Application Management</source>
       <translation>Gestión de Aplicación PyPI</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="115" />
+      <location filename="../../PluginPipxInterface.py" line="116" />
       <source>Python Application Management</source>
       <translation>Gestión de Aplicación Python</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="190" />
+      <location filename="../../PluginPipxInterface.py" line="193" />
       <source>Ctrl+Alt+Shift+A</source>
       <translation>Ctrl+Alt+Shift+A</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="196" />
+      <location filename="../../PluginPipxInterface.py" line="199" />
       <source>Switch the input focus to the PyPI Application Management window.</source>
       <translation>Cambiar el foco de entrada a la ventana de Gestión de Aplicación PyPI.</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="199" />
+      <location filename="../../PluginPipxInterface.py" line="202" />
       <source>&lt;b&gt;Activate PyPI Application Management&lt;/b&gt;&lt;p&gt;This switches the input focus to the PyPI Application Management window.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Activar Gestión de Aplicación PyPI&lt;/b&gt;&lt;p&gt;Esto cambia el foco de entrada a la ventana de Gestión de Aplicación PyPI.&lt;/p&gt;</translation>
     </message>
--- a/PipxInterface/i18n/pipx_ru.ts	Sat Jul 27 19:39:32 2024 +0200
+++ b/PipxInterface/i18n/pipx_ru.ts	Sun Jul 28 11:46:18 2024 +0200
@@ -54,42 +54,42 @@
       <translation>Деинсталировать все пакеты</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="455" />
+      <location filename="../Pipx.py" line="456" />
       <source>Check Outdated Package</source>
       <translation>Проверить устаревшие пакеты</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
+      <location filename="../Pipx.py" line="457" />
       <source>&lt;p&gt;The status of package &lt;b&gt;{0}&lt;/b&gt; could not be determined.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;Не удалось определить статус пакета &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Причина: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="483" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Package</source>
       <translation>Обновить пакет</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="493" />
+      <location filename="../Pipx.py" line="494" />
       <source>Upgrade All Packages</source>
       <translation>Обновить все пакеты</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="503" />
+      <location filename="../Pipx.py" line="504" />
       <source>Upgrade Shared Libraries</source>
       <translation>Обновить общие библиотеки</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="517" />
+      <location filename="../Pipx.py" line="518" />
       <source>Upgrade Interpreters</source>
       <translation>Обновить интерпретаторы</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="530" />
+      <location filename="../Pipx.py" line="531" />
       <source>Prune Unused Interpreters</source>
       <translation>Удалить неиспользуемые интерпретаторы</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="541" />
+      <location filename="../Pipx.py" line="542" />
       <source>Ensure PATH Modifications</source>
       <translation>Обеспечьте внесение изменений в ПУТЬ</translation>
     </message>
@@ -296,6 +296,31 @@
     </message>
     <message>
       <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Outdated Application Packages</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine outdated packages when loading the list of installed packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine outdated packages automatically</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Select to determine packages with any outdated dependencies when determining outdated packages.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
+      <source>Determine packages with outdated dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PipxPage.ui" line="0" />
       <source>Recent Application Working Directories</source>
       <translation>Последние рабочие директории приложений</translation>
     </message>
@@ -434,172 +459,184 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="105" />
+      <location filename="../PipxWidget.py" line="108" />
       <source>Install</source>
       <translation>Установить</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="199" />
-      <location filename="../PipxWidget.py" line="107" />
+      <location filename="../PipxWidget.py" line="202" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install Packages</source>
       <translation>Установить пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="218" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="221" />
+      <location filename="../PipxWidget.py" line="113" />
       <source>Install All Packages</source>
       <translation>Установить все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="114" />
+      <location filename="../PipxWidget.py" line="117" />
       <source>Re-Install Selected Package</source>
       <translation>Переустановить выбранный пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="316" />
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="319" />
+      <location filename="../PipxWidget.py" line="120" />
       <source>Re-Install All Packages</source>
       <translation>Переустановить все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="274" />
-      <location filename="../PipxWidget.py" line="265" />
-      <location filename="../PipxWidget.py" line="253" />
-      <location filename="../PipxWidget.py" line="237" />
-      <location filename="../PipxWidget.py" line="121" />
+      <location filename="../PipxWidget.py" line="277" />
+      <location filename="../PipxWidget.py" line="268" />
+      <location filename="../PipxWidget.py" line="256" />
+      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="124" />
       <source>Create Spec Metadata File</source>
       <translation>Создайть файл метаданных спецификации</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="128" />
+      <location filename="../PipxWidget.py" line="131" />
       <source>Upgrade</source>
       <translation>Обновлять</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="130" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Check Outdated Packages</source>
       <translation>Проверить устаревшие пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="134" />
+      <location filename="../PipxWidget.py" line="364" />
+      <location filename="../PipxWidget.py" line="137" />
       <source>Upgrade Selected Package</source>
       <translation>Обновить выбранный пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="385" />
+      <location filename="../PipxWidget.py" line="140" />
       <source>Upgrade All Packages</source>
       <translation>Обновить все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="141" />
+      <location filename="../PipxWidget.py" line="144" />
       <source>Upgrade Shared Libraries</source>
       <translation>Обновить общие библиотеки</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="148" />
+      <location filename="../PipxWidget.py" line="151" />
       <source>Uninstall</source>
       <translation>Деинсталировать</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="150" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall Selected Package</source>
       <translation>Деинсталировать выбранный пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="392" />
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="427" />
+      <location filename="../PipxWidget.py" line="156" />
       <source>Uninstall All Packages</source>
       <translation>Деинсталировать все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="168" />
+      <location filename="../PipxWidget.py" line="171" />
       <source>Standalone Interpreters</source>
       <translation>Автономные интерпретаторы</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="172" />
+      <location filename="../PipxWidget.py" line="175" />
       <source>Ensure PATH Modifications</source>
       <translation>Обеспечьте внесение изменений в ПУТЬ</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="178" />
       <source>Configure...</source>
       <translation>Настроить...</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="239" />
+      <location filename="../PipxWidget.py" line="242" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation>Файлы JSON (*.json);;Все файлы (*)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="240" />
+      <location filename="../PipxWidget.py" line="243" />
       <source>JSON Files (*.json)</source>
       <translation>Файлы JSON (*.json)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="254" />
+      <location filename="../PipxWidget.py" line="257" />
       <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; exists already. Overwrite it?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Файл &lt;b&gt;{0}&lt;/b&gt; уже существует. Перезаписать?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="266" />
+      <location filename="../PipxWidget.py" line="269" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; was created successfully.&lt;/p&gt;</source>
       <translation>&lt;p&gt;Файл метаданных спецификации &lt;b&gt;{0}&lt;/b&gt; был успешно создан.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="275" />
+      <location filename="../PipxWidget.py" line="278" />
       <source>&lt;p&gt;The spec metadata file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;Не удалось создать файл метаданных спецификации &lt;b&gt;{0}&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Причина: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="291" />
+      <location filename="../PipxWidget.py" line="294" />
       <source>Re-Install Package</source>
       <translation>Переустановить пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="292" />
+      <location filename="../PipxWidget.py" line="295" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be reinstalled?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Должен ли пакет &lt;b&gt;{0}&lt;/b&gt; действительно быть переустановлен?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="317" />
+      <location filename="../PipxWidget.py" line="320" />
       <source>Do you really want to reinstall all packages?</source>
       <translation>Вы действительно хотите переустановить все пакеты?</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="376" />
+      <location filename="../PipxWidget.py" line="365" />
+      <source>&lt;p&gt;The selected package cannot be upgraded because some of its apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="386" />
+      <source>&lt;p&gt;The packages cannot be upgraded because some of their apps are running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Stop these apps and try again.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="411" />
       <source>Uninstall Package</source>
       <translation>Деинсталировать пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="377" />
+      <location filename="../PipxWidget.py" line="412" />
       <source>&lt;p&gt;Shall the package &lt;b&gt;{0}&lt;/b&gt; really be uninstalled?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Должен ли пакет &lt;b&gt;{0}&lt;/b&gt; действительно быть удален?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="393" />
+      <location filename="../PipxWidget.py" line="428" />
       <source>&lt;p&gt;Do you really want to uninstall &lt;b&gt;ALL&lt;/b&gt; packages?&lt;/p&gt;</source>
       <translation>&lt;p&gt;Вы действительно хотите удалить ВСЕ &lt;/b&gt; пакеты?&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="433" />
+      <location filename="../PipxWidget.py" line="468" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation>&lt;b&gt;Версия pipx {0}&lt;/b&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="458" />
+      <location filename="../PipxWidget.py" line="494" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation>{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="476" />
+      <location filename="../PipxWidget.py" line="523" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="478" />
+      <location filename="../PipxWidget.py" line="525" />
       <source> (standalone)</source>
       <translation> (автономный)</translation>
     </message>
@@ -672,30 +709,30 @@
   <context>
     <name>PluginPipxInterface</name>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="188" />
+      <location filename="../../PluginPipxInterface.py" line="192" />
+      <location filename="../../PluginPipxInterface.py" line="191" />
       <location filename="../../PluginPipxInterface.py" line="187" />
-      <location filename="../../PluginPipxInterface.py" line="183" />
-      <location filename="../../PluginPipxInterface.py" line="70" />
+      <location filename="../../PluginPipxInterface.py" line="72" />
       <source>PyPI Application Management</source>
       <translation>Управление приложениями PyPI</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="114" />
+      <location filename="../../PluginPipxInterface.py" line="116" />
       <source>Python Application Management</source>
       <translation>Управление приложениями Python</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="189" />
+      <location filename="../../PluginPipxInterface.py" line="193" />
       <source>Ctrl+Alt+Shift+A</source>
       <translation>Ctrl+Alt+Shift+A</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="195" />
+      <location filename="../../PluginPipxInterface.py" line="199" />
       <source>Switch the input focus to the PyPI Application Management window.</source>
       <translation>Переключите фокус ввода на окно управления приложением PyPI.</translation>
     </message>
     <message>
-      <location filename="../../PluginPipxInterface.py" line="198" />
+      <location filename="../../PluginPipxInterface.py" line="202" />
       <source>&lt;b&gt;Activate PyPI Application Management&lt;/b&gt;&lt;p&gt;This switches the input focus to the PyPI Application Management window.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Активировать управление приложениями PyPI.&lt;/b&gt;&lt;p&gt; Это переключит фокус ввода на окно управления приложениями PyPI.&lt;/p&gt;</translation>
     </message>
--- a/PluginPipxInterface.py	Sat Jul 27 19:39:32 2024 +0200
+++ b/PluginPipxInterface.py	Sun Jul 28 11:46:18 2024 +0200
@@ -36,7 +36,7 @@
     "author": "Detlev Offenbach <detlev@die-offenbachs.de>",
     "autoactivate": True,
     "deactivateable": True,
-    "version": "10.1.1",
+    "version": "10.2.0",
     "className": "PluginPipxInterface",
     "packageName": "PipxInterface",
     "shortDescription": "Graphical interface to the 'pipx' command.",
@@ -149,11 +149,11 @@
         self.__ui = ui
         self.__initialize()
 
-        # TODO: add option to check outdated dependencies when checking for
-        #       outdated status
         self.__defaults = {
             "RecentAppWorkdirs": [],
             "MaxRecentAppWorkdirs": 20,
+            "IncludeOutdatedDependencies": True,
+            "AutoCheckOutdated": False,
         }
 
         self.__translator = None
@@ -284,6 +284,16 @@
                     self.PreferencesKey + "/" + key, self.__defaults[key]
                 )
             )
+        elif key in ("IncludeOutdatedDependencies", "AutoCheckOutdated"):
+            return Globals.toBool(
+                Preferences.Prefs.settings.value(
+                    self.PreferencesKey + "/" + key,  self.__defaults[key]
+                )
+            )
+        else:
+            return Preferences.Prefs.settings.value(
+                self.PreferencesKey + "/" + key,  self.__defaults[key]
+            )
 
         return None
 
Binary file PluginPipxInterface.zip has changed
--- a/changelog.md	Sat Jul 27 19:39:32 2024 +0200
+++ b/changelog.md	Sun Jul 28 11:46:18 2024 +0200
@@ -1,6 +1,11 @@
 ChangeLog
 ---------
 
+__Version 10.2.0__
+
+- Implemented some enhancements related to indicating outdated packages.
+- Implemented a check for executed apps before upgrading a package.
+
 __Version 10.1.1__
 
 - Added Russian translations provided by Alexander Barkoff.

eric ide

mercurial