Implemented actions to show the dependencies of a package and upgrade them using 'runpip' because 'pipx' doesn't upgrade them when upgrading the package. release-10.3.0

Tue, 30 Jul 2024 17:45:46 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 30 Jul 2024 17:45:46 +0200
changeset 49
ec976c5b88ae
parent 48
9d656b3845c1
child 50
f7cc0338b322

Implemented actions to show the dependencies of a package and upgrade them using 'runpip' because 'pipx' doesn't upgrade them when upgrading the package.

PKGLIST 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.PipxDependenciesDialog.html file | annotate | diff | comparison | revisions
PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html file | annotate | diff | comparison | revisions
PipxInterface/Documentation/Source/index-Plugin_Pipx_Interface.PipxInterface.html file | annotate | diff | comparison | revisions
PipxInterface/Pipx.py file | annotate | diff | comparison | revisions
PipxInterface/PipxDependenciesDialog.py file | annotate | diff | comparison | revisions
PipxInterface/PipxDependenciesDialog.ui file | annotate | diff | comparison | revisions
PipxInterface/PipxWidget.py file | annotate | diff | comparison | revisions
PipxInterface/Ui_PipxDependenciesDialog.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.epj 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/PKGLIST	Mon Jul 29 11:58:31 2024 +0200
+++ b/PKGLIST	Tue Jul 30 17:45:46 2024 +0200
@@ -6,6 +6,8 @@
 PipxInterface/Pipx.py
 PipxInterface/PipxAppStartDialog.py
 PipxInterface/PipxAppStartDialog.ui
+PipxInterface/PipxDependenciesDialog.py
+PipxInterface/PipxDependenciesDialog.ui
 PipxInterface/PipxExecDialog.py
 PipxInterface/PipxExecDialog.ui
 PipxInterface/PipxInterpretersDialog.py
@@ -19,6 +21,7 @@
 PipxInterface/PipxWidget.py
 PipxInterface/PipxWidget.ui
 PipxInterface/Ui_PipxAppStartDialog.py
+PipxInterface/Ui_PipxDependenciesDialog.py
 PipxInterface/Ui_PipxExecDialog.py
 PipxInterface/Ui_PipxInterpretersDialog.py
 PipxInterface/Ui_PipxPackagesInputDialog.py
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.Pipx.html	Tue Jul 30 17:45:46 2024 +0200
@@ -56,6 +56,10 @@
 <td>Constructor</td>
 </tr>
 <tr>
+<td><a href="#Pipx.__getPackageDependencies">__getPackageDependencies</a></td>
+<td>Private method to get a list of dependencies of a given package.</td>
+</tr>
+<tr>
 <td><a href="#Pipx.__getPipxExecutable">__getPipxExecutable</a></td>
 <td>Private method to get the path name of the pipx executable.</td>
 </tr>
@@ -76,10 +80,18 @@
 <td>Public method to ensure that the directory where pipx stores apps is in your PATH environment variable.</td>
 </tr>
 <tr>
+<td><a href="#Pipx.getAllPackageDependencies">getAllPackageDependencies</a></td>
+<td>Public method to get the list of package dependencies.</td>
+</tr>
+<tr>
 <td><a href="#Pipx.getInstalledPackages">getInstalledPackages</a></td>
 <td>Public method to get the installed packages.</td>
 </tr>
 <tr>
+<td><a href="#Pipx.getOutdatedPackageDependencies">getOutdatedPackageDependencies</a></td>
+<td>Public method to get the list of outdated package dependencies.</td>
+</tr>
+<tr>
 <td><a href="#Pipx.getPipxInterpretersList">getPipxInterpretersList</a></td>
 <td>Public method returning a list all standalone interpreters.</td>
 </tr>
@@ -100,6 +112,10 @@
 <td>Public method to get the version tuple of the installed pipx package.</td>
 </tr>
 <tr>
+<td><a href="#Pipx.getUptodatePackageDependencies">getUptodatePackageDependencies</a></td>
+<td>Public method to get the list of up-to-date package dependencies.</td>
+</tr>
+<tr>
 <td><a href="#Pipx.installAllPackages">installAllPackages</a></td>
 <td>Public method to install all packages define by a given spec metadata file with given options.</td>
 </tr>
@@ -144,6 +160,10 @@
 <td>Public method to upgrade the given package.</td>
 </tr>
 <tr>
+<td><a href="#Pipx.upgradePackageDependencies">upgradePackageDependencies</a></td>
+<td>Public method to upgrade the dependencies of the given package.</td>
+</tr>
+<tr>
 <td><a href="#Pipx.upgradeSharedLibraries">upgradeSharedLibraries</a></td>
 <td>Public method to upgrade shared libraries.</td>
 </tr>
@@ -169,6 +189,40 @@
 reference to the user interface object
 </dd>
 </dl>
+<a NAME="Pipx.__getPackageDependencies" ID="Pipx.__getPackageDependencies"></a>
+<h4>Pipx.__getPackageDependencies</h4>
+<b>__getPackageDependencies</b>(<i>package, uptodate=False, outdated=False</i>)
+<p>
+        Private method to get a list of dependencies of a given package.
+</p>
+
+<dl>
+
+<dt><i>package</i> (str)</dt>
+<dd>
+name of the package
+</dd>
+<dt><i>uptodate</i> (TYPE (optional))</dt>
+<dd>
+DESCRIPTION (defaults to False)
+</dd>
+<dt><i>outdated</i> (TYPE (optional))</dt>
+<dd>
+DESCRIPTION (defaults to False)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+list of dictionaries as returned by 'pip'
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list[dict[str: str]]
+</dd>
+</dl>
 <a NAME="Pipx.__getPipxExecutable" ID="Pipx.__getPipxExecutable"></a>
 <h4>Pipx.__getPipxExecutable</h4>
 <b>__getPipxExecutable</b>(<i></i>)
@@ -277,6 +331,32 @@
         in your PATH environment variable.
 </p>
 
+<a NAME="Pipx.getAllPackageDependencies" ID="Pipx.getAllPackageDependencies"></a>
+<h4>Pipx.getAllPackageDependencies</h4>
+<b>getAllPackageDependencies</b>(<i>package</i>)
+<p>
+        Public method to get the list of package dependencies.
+</p>
+
+<dl>
+
+<dt><i>package</i> (str)</dt>
+<dd>
+name of the package
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+list of tuples containing the dependency name and version
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list of tuple of (str, str)
+</dd>
+</dl>
 <a NAME="Pipx.getInstalledPackages" ID="Pipx.getInstalledPackages"></a>
 <h4>Pipx.getInstalledPackages</h4>
 <b>getInstalledPackages</b>(<i></i>)
@@ -296,6 +376,33 @@
 list of dict[str, str | list]
 </dd>
 </dl>
+<a NAME="Pipx.getOutdatedPackageDependencies" ID="Pipx.getOutdatedPackageDependencies"></a>
+<h4>Pipx.getOutdatedPackageDependencies</h4>
+<b>getOutdatedPackageDependencies</b>(<i>package</i>)
+<p>
+        Public method to get the list of outdated package dependencies.
+</p>
+
+<dl>
+
+<dt><i>package</i> (str)</dt>
+<dd>
+name of the package
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+list of tuples containing the dependency name, version and latest
+            version
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list of tuple of (str, str, str)
+</dd>
+</dl>
 <a NAME="Pipx.getPipxInterpretersList" ID="Pipx.getPipxInterpretersList"></a>
 <h4>Pipx.getPipxInterpretersList</h4>
 <b>getPipxInterpretersList</b>(<i></i>)
@@ -393,6 +500,32 @@
 tuple of (int, int, int)
 </dd>
 </dl>
+<a NAME="Pipx.getUptodatePackageDependencies" ID="Pipx.getUptodatePackageDependencies"></a>
+<h4>Pipx.getUptodatePackageDependencies</h4>
+<b>getUptodatePackageDependencies</b>(<i>package</i>)
+<p>
+        Public method to get the list of up-to-date package dependencies.
+</p>
+
+<dl>
+
+<dt><i>package</i> (str)</dt>
+<dd>
+name of the package
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+list of tuples containing the dependency name and version
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list of tuple of (str, str)
+</dd>
+</dl>
 <a NAME="Pipx.installAllPackages" ID="Pipx.installAllPackages"></a>
 <h4>Pipx.installAllPackages</h4>
 <b>installAllPackages</b>(<i>specFile, interpreterVersion="", fetchMissingInterpreter=False, forceVenvModification=False, systemSitePackages=False, </i>)
@@ -609,6 +742,20 @@
 name of the package
 </dd>
 </dl>
+<a NAME="Pipx.upgradePackageDependencies" ID="Pipx.upgradePackageDependencies"></a>
+<h4>Pipx.upgradePackageDependencies</h4>
+<b>upgradePackageDependencies</b>(<i>package</i>)
+<p>
+        Public method to upgrade the dependencies of the given package.
+</p>
+
+<dl>
+
+<dt><i>package</i> (str)</dt>
+<dd>
+name of the package
+</dd>
+</dl>
 <a NAME="Pipx.upgradeSharedLibraries" ID="Pipx.upgradeSharedLibraries"></a>
 <h4>Pipx.upgradeSharedLibraries</h4>
 <b>upgradeSharedLibraries</b>(<i></i>)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog.html	Tue Jul 30 17:45:46 2024 +0200
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html><head>
+<title>Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog</h1>
+<p>
+Module implementing a dialog to show the package dependencies.
+</p>
+
+<h3>Global Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#PipxDependenciesDialog">PipxDependenciesDialog</a></td>
+<td>Class implementing a dialog to show the package dependencies.</td>
+</tr>
+</table>
+
+<h3>Functions</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<hr />
+<hr />
+<a NAME="PipxDependenciesDialog" ID="PipxDependenciesDialog"></a>
+<h2>PipxDependenciesDialog</h2>
+<p>
+    Class implementing a dialog to show the package dependencies.
+</p>
+
+<h3>Derived from</h3>
+QDialog, Ui_PipxDependenciesDialog
+<h3>Class Attributes</h3>
+<table>
+<tr><td>AllMode</td></tr>
+<tr><td>AvailableVersionColumn</td></tr>
+<tr><td>DependencyColumn</td></tr>
+<tr><td>InstalledVersionColumn</td></tr>
+<tr><td>OutdatedMode</td></tr>
+<tr><td>UptodateMode</td></tr>
+</table>
+
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#PipxDependenciesDialog.__init__">PipxDependenciesDialog</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#PipxDependenciesDialog.__resizeColumns">__resizeColumns</a></td>
+<td>Private method to resize the columns of the dependencies list.</td>
+</tr>
+</table>
+
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+
+
+<a NAME="PipxDependenciesDialog.__init__" ID="PipxDependenciesDialog.__init__"></a>
+<h4>PipxDependenciesDialog (Constructor)</h4>
+<b>PipxDependenciesDialog</b>(<i>package, dependencies, mode, parent=None</i>)
+<p>
+        Constructor
+</p>
+
+<dl>
+
+<dt><i>package</i> (str)</dt>
+<dd>
+name of the package
+</dd>
+<dt><i>dependencies</i> (list of tuple of (str, str, str) or list of tuple of (str, str))</dt>
+<dd>
+list of package dependency data
+</dd>
+<dt><i>mode</i> (int)</dt>
+<dd>
+dialog mode
+</dd>
+<dt><i>parent</i> (QWidget (optional))</dt>
+<dd>
+reference to the parent widget (defaults to None)
+</dd>
+</dl>
+<a NAME="PipxDependenciesDialog.__resizeColumns" ID="PipxDependenciesDialog.__resizeColumns"></a>
+<h4>PipxDependenciesDialog.__resizeColumns</h4>
+<b>__resizeColumns</b>(<i></i>)
+<p>
+        Private method to resize the columns of the dependencies list.
+</p>
+
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html	Tue Jul 30 17:45:46 2024 +0200
@@ -142,14 +142,26 @@
 <td>Private method to determine the list of selected packages.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__showDependencies">__showDependencies</a></td>
+<td>Private slot to show a dialog with the dependencies of the selected package.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__showInterpreters">__showInterpreters</a></td>
 <td>Private slot to show a list of standalone Python interpreters.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__showOutdatedDependencies">__showOutdatedDependencies</a></td>
+<td>Private slot to show a dialog with the outdated dependencies of the selected package.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__showPipxVersion">__showPipxVersion</a></td>
 <td>Private method to show the pipx version in the widget header.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__showUptodateDependencies">__showUptodateDependencies</a></td>
+<td>Private slot to show a dialog with the up-to-date dependencies of the selected package.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__uninstallAllPackages">__uninstallAllPackages</a></td>
 <td>Private slot to uninstall all packages.</td>
 </tr>
@@ -162,6 +174,10 @@
 <td>Private slot to upgrade all packages.</td>
 </tr>
 <tr>
+<td><a href="#PipxWidget.__upgradeDependencies">__upgradeDependencies</a></td>
+<td>Private slot to upgrade the outdated dependencies of the selected package.</td>
+</tr>
+<tr>
 <td><a href="#PipxWidget.__upgradePackage">__upgradePackage</a></td>
 <td>Private slot to upgrade the selected package.</td>
 </tr>
@@ -459,6 +475,13 @@
 list of str
 </dd>
 </dl>
+<a NAME="PipxWidget.__showDependencies" ID="PipxWidget.__showDependencies"></a>
+<h4>PipxWidget.__showDependencies</h4>
+<b>__showDependencies</b>(<i></i>)
+<p>
+        Private slot to show a dialog with the dependencies of the selected package.
+</p>
+
 <a NAME="PipxWidget.__showInterpreters" ID="PipxWidget.__showInterpreters"></a>
 <h4>PipxWidget.__showInterpreters</h4>
 <b>__showInterpreters</b>(<i></i>)
@@ -466,6 +489,14 @@
         Private slot to show a list of standalone Python interpreters.
 </p>
 
+<a NAME="PipxWidget.__showOutdatedDependencies" ID="PipxWidget.__showOutdatedDependencies"></a>
+<h4>PipxWidget.__showOutdatedDependencies</h4>
+<b>__showOutdatedDependencies</b>(<i></i>)
+<p>
+        Private slot to show a dialog with the outdated dependencies of the selected
+        package.
+</p>
+
 <a NAME="PipxWidget.__showPipxVersion" ID="PipxWidget.__showPipxVersion"></a>
 <h4>PipxWidget.__showPipxVersion</h4>
 <b>__showPipxVersion</b>(<i></i>)
@@ -473,6 +504,14 @@
         Private method to show the pipx version in the widget header.
 </p>
 
+<a NAME="PipxWidget.__showUptodateDependencies" ID="PipxWidget.__showUptodateDependencies"></a>
+<h4>PipxWidget.__showUptodateDependencies</h4>
+<b>__showUptodateDependencies</b>(<i></i>)
+<p>
+        Private slot to show a dialog with the up-to-date dependencies of the selected
+        package.
+</p>
+
 <a NAME="PipxWidget.__uninstallAllPackages" ID="PipxWidget.__uninstallAllPackages"></a>
 <h4>PipxWidget.__uninstallAllPackages</h4>
 <b>__uninstallAllPackages</b>(<i></i>)
@@ -494,6 +533,13 @@
         Private slot to upgrade all packages.
 </p>
 
+<a NAME="PipxWidget.__upgradeDependencies" ID="PipxWidget.__upgradeDependencies"></a>
+<h4>PipxWidget.__upgradeDependencies</h4>
+<b>__upgradeDependencies</b>(<i></i>)
+<p>
+        Private slot to upgrade the outdated dependencies of the selected package.
+</p>
+
 <a NAME="PipxWidget.__upgradePackage" ID="PipxWidget.__upgradePackage"></a>
 <h4>PipxWidget.__upgradePackage</h4>
 <b>__upgradePackage</b>(<i></i>)
--- a/PipxInterface/Documentation/Source/index-Plugin_Pipx_Interface.PipxInterface.html	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/Documentation/Source/index-Plugin_Pipx_Interface.PipxInterface.html	Tue Jul 30 17:45:46 2024 +0200
@@ -32,6 +32,10 @@
 <td>Module implementing a dialog to enter the application command line parameters and to execute the app.</td>
 </tr>
 <tr>
+<td><a href="Plugin_Pipx_Interface.PipxInterface.PipxDependenciesDialog.html">PipxDependenciesDialog</a></td>
+<td>Module implementing a dialog to show the package dependencies.</td>
+</tr>
+<tr>
 <td><a href="Plugin_Pipx_Interface.PipxInterface.PipxExecDialog.html">PipxExecDialog</a></td>
 <td>Module implementing a dialog showing the output of a pip command.</td>
 </tr>
--- a/PipxInterface/Pipx.py	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/Pipx.py	Tue Jul 30 17:45:46 2024 +0200
@@ -435,40 +435,6 @@
         if res:
             dia.exec()
 
-    def checkPackageOutdated(self, package):
-        """
-        Public method to check, if a given package is outdated.
-
-        @param package name of the package
-        @type str
-        @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"):
-            indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
-            args += ["--index-url", indexUrl]
-        ok, output = self.runPipxProcess(args)
-        if not ok:
-            EricMessageBox.information(
-                None,
-                self.tr("Check Outdated Package"),
-                self.tr(
-                    "<p>The status of package <b>{0}</b> could not be determined.</p>"
-                    "<p>Reason: {1}</p>"
-                ).format(package, output),
-            )
-            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"], len(outdatedList) > 1
-
-        return None, bool(outdatedList)
-
     def upgradePackage(self, package):
         """
         Public method to upgrade the given package.
@@ -543,3 +509,143 @@
         res = dia.startProcess(self.__getPipxExecutable(), args)
         if res:
             dia.exec()
+
+    ############################################################################
+    ## Special methods based on 'runpip'
+    ############################################################################
+
+    def checkPackageOutdated(self, package):
+        """
+        Public method to check, if a given package is outdated.
+
+        @param package name of the package
+        @type str
+        @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"):
+            indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
+            args += ["--index-url", indexUrl]
+        ok, output = self.runPipxProcess(args)
+        if not ok:
+            EricMessageBox.information(
+                None,
+                self.tr("Check Outdated Package"),
+                self.tr(
+                    "<p>The status of package <b>{0}</b> could not be determined.</p>"
+                    "<p>Reason: {1}</p>"
+                ).format(package, output),
+            )
+            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"], len(outdatedList) > 1
+
+        return None, bool(outdatedList)
+
+    def __getPackageDependencies(self, package, uptodate=False, outdated=False):
+        """
+        Private method to get a list of dependencies of a given package.
+
+        @param package name of the package
+        @type str
+        @param uptodate DESCRIPTION (defaults to False)
+        @type TYPE (optional)
+        @param outdated DESCRIPTION (defaults to False)
+        @type TYPE (optional)
+        @return list of dictionaries as returned by 'pip'
+        @rtype list[dict[str: str]]
+        """
+        if outdated:
+            args = ["runpip", package, "list", "--format", "json", "--outdated"]
+        elif uptodate:
+            args = ["runpip", package, "list", "--format", "json", "--uptodate"]
+        else:
+            args = ["runpip", package, "list", "--format", "json"]
+        if Preferences.getPip("PipSearchIndex"):
+            indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
+            args += ["--index-url", indexUrl]
+        ok, output = self.runPipxProcess(args)
+        if not ok:
+            EricMessageBox.information(
+                None,
+                self.tr("Get Package Dependencies"),
+                self.tr(
+                    "<p>The status of dependencies of package <b>{0}</b> could not"
+                    " be determined.</p><p>Reason: {1}</p>"
+                ).format(package, output),
+            )
+            return []
+
+        return json.loads(output)
+
+    def getOutdatedPackageDependencies(self, package):
+        """
+        Public method to get the list of outdated package dependencies.
+
+        @param package name of the package
+        @type str
+        @return list of tuples containing the dependency name, version and latest
+            version
+        @rtype list of tuple of (str, str, str)
+        """
+        outdatedList = self.__getPackageDependencies(package=package, outdated=True)
+        return [
+            (d["name"], d["version"], d["latest_version"])
+            for d in outdatedList
+            if d["name"] != package
+        ]
+
+    def getUptodatePackageDependencies(self, package):
+        """
+        Public method to get the list of up-to-date package dependencies.
+
+        @param package name of the package
+        @type str
+        @return list of tuples containing the dependency name and version
+        @rtype list of tuple of (str, str)
+        """
+        uptodateList = self.__getPackageDependencies(package=package, uptodate=True)
+        return [(d["name"], d["version"]) for d in uptodateList if d["name"] != package]
+
+    def getAllPackageDependencies(self, package):
+        """
+        Public method to get the list of package dependencies.
+
+        @param package name of the package
+        @type str
+        @return list of tuples containing the dependency name and version
+        @rtype list of tuple of (str, str)
+        """
+        dependenciesList = self.__getPackageDependencies(package=package)
+        return [
+            (d["name"], d["version"]) for d in dependenciesList if d["name"] != package
+        ]
+
+    def upgradePackageDependencies(self, package):
+        """
+        Public method to upgrade the dependencies of the given package.
+
+        @param package name of the package
+        @type str
+        """
+        outdatedDependencies = [
+            d[0] for d in self.getOutdatedPackageDependencies(package=package)
+        ]
+        args = [
+            "runpip",
+            package,
+            "install",
+            "--upgrade",
+            "--prefer-binary",
+        ] + outdatedDependencies
+
+        dia = PipxExecDialog(self.tr("Upgrade Dependencies"))
+        res = dia.startProcess(self.__getPipxExecutable(), args)
+        if res:
+            dia.exec()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PipxInterface/PipxDependenciesDialog.py	Tue Jul 30 17:45:46 2024 +0200
@@ -0,0 +1,78 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to show the package dependencies.
+"""
+
+from PyQt6.QtCore import Qt
+from PyQt6.QtWidgets import QDialog, QTreeWidgetItem
+
+from .Ui_PipxDependenciesDialog import Ui_PipxDependenciesDialog
+
+
+class PipxDependenciesDialog(QDialog, Ui_PipxDependenciesDialog):
+    """
+    Class implementing a dialog to show the package dependencies.
+    """
+
+    AllMode = 0
+    UptodateMode = 1
+    OutdatedMode = 2
+
+    DependencyColumn = 0
+    InstalledVersionColumn = 1
+    AvailableVersionColumn = 2
+
+    def __init__(self, package, dependencies, mode, parent=None):
+        """
+        Constructor
+
+        @param package name of the package
+        @type str
+        @param dependencies list of package dependency data
+        @type list of tuple of (str, str, str) or list of tuple of (str, str)
+        @param mode dialog mode
+        @type int
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+
+        if mode != PipxDependenciesDialog.OutdatedMode:
+            self.dependenciesList.hideColumn(
+                PipxDependenciesDialog.AvailableVersionColumn
+            )
+
+        if mode == PipxDependenciesDialog.OutdatedMode:
+            headerMsg = self.tr("Outdated Dependencies of package <b>{0}</b>")
+        elif mode == PipxDependenciesDialog.UptodateMode:
+            headerMsg = self.tr("Up-to-date Dependencies of package <b>{0}</b>")
+        else:
+            headerMsg = self.tr("Dependencies of package <b>{0}</b>")
+        self.headerLabel.setText(headerMsg.format(package))
+
+        for dependency in dependencies:
+            QTreeWidgetItem(self.dependenciesList, list(dependency))
+
+        self.dependenciesList.sortItems(
+            PipxDependenciesDialog.DependencyColumn, Qt.SortOrder.AscendingOrder
+        )
+        self.__resizeColumns()
+
+    def __resizeColumns(self):
+        """
+        Private method to resize the columns of the dependencies list.
+        """
+        self.dependenciesList.header().setStretchLastSection(True)
+        self.dependenciesList.resizeColumnToContents(
+            PipxDependenciesDialog.DependencyColumn
+        )
+        self.dependenciesList.resizeColumnToContents(
+            PipxDependenciesDialog.InstalledVersionColumn
+        )
+        self.dependenciesList.resizeColumnToContents(
+            PipxDependenciesDialog.AvailableVersionColumn
+        )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PipxInterface/PipxDependenciesDialog.ui	Tue Jul 30 17:45:46 2024 +0200
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PipxDependenciesDialog</class>
+ <widget class="QDialog" name="PipxDependenciesDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>498</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Package Dependencies</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="headerLabel">
+     <property name="text">
+      <string notr="true">Header</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTreeWidget" name="dependenciesList">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::NoSelection</enum>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <property name="itemsExpandable">
+      <bool>false</bool>
+     </property>
+     <property name="allColumnsShowFocus">
+      <bool>true</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string>Dependency</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Installed Version</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Available Version</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PipxDependenciesDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>PipxDependenciesDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- a/PipxInterface/PipxWidget.py	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/PipxWidget.py	Tue Jul 30 17:45:46 2024 +0200
@@ -23,6 +23,7 @@
 
 from .Pipx import Pipx
 from .PipxAppStartDialog import PipxAppStartDialog
+from .PipxDependenciesDialog import PipxDependenciesDialog
 from .Ui_PipxWidget import Ui_PipxWidget
 
 
@@ -146,7 +147,7 @@
         )
 
         ###################################################################
-        ## Menu with upinstall related actions
+        ## Menu with uninstall related actions
         ###################################################################
 
         self.__uninstallSubmenu = QMenu(self.tr("Uninstall"))
@@ -158,6 +159,25 @@
         )
 
         ###################################################################
+        ## Menu with dependencies related actions
+        ###################################################################
+
+        self.__dependenciseSubmenu = QMenu(self.tr("Dependencies"))
+        self.__showDependenciesAct = self.__dependenciseSubmenu.addAction(
+            self.tr("Show All Dependencies"), self.__showDependencies
+        )
+        self.__showOutdatedDependenciesAct = self.__dependenciseSubmenu.addAction(
+            self.tr("Show Outdated Dependencies"), self.__showOutdatedDependencies
+        )
+        self.__showUptodateDependenciesAct = self.__dependenciseSubmenu.addAction(
+            self.tr("Show Up-to-date Dependencies"), self.__showUptodateDependencies
+        )
+        self.__dependenciseSubmenu.addSeparator()
+        self.__upgradeDependenciesAct = self.__dependenciseSubmenu.addAction(
+            self.tr("Upgrade Dependencies"), self.__upgradeDependencies
+        )
+
+        ###################################################################
         ## Main menu
         ###################################################################
 
@@ -168,6 +188,10 @@
         self.__pipxMenu.addSeparator()
         self.__uninstallSubmenuAct = self.__pipxMenu.addMenu(self.__uninstallSubmenu)
         self.__pipxMenu.addSeparator()
+        self.__dependenciseSubmenuAct = self.__pipxMenu.addMenu(
+            self.__dependenciseSubmenu
+        )
+        self.__pipxMenu.addSeparator()
         self.__pipxMenu.addAction(
             self.tr("Standalone Interpreters"), self.__showInterpreters
         )
@@ -467,6 +491,62 @@
         """
         self.__pipx.ensurePath()
 
+    @pyqtSlot()
+    def __showDependencies(self):
+        """
+        Private slot to show a dialog with the dependencies of the selected package.
+        """
+        package = self.__selectedPackages()[0]
+        dependencies = self.__pipx.getAllPackageDependencies(package=package)
+
+        dlg = PipxDependenciesDialog(
+            package=package,
+            dependencies=dependencies,
+            mode=PipxDependenciesDialog.AllMode,
+        )
+        dlg.exec()
+
+    @pyqtSlot()
+    def __showOutdatedDependencies(self):
+        """
+        Private slot to show a dialog with the outdated dependencies of the selected
+        package.
+        """
+        package = self.__selectedPackages()[0]
+        dependencies = self.__pipx.getOutdatedPackageDependencies(package=package)
+
+        dlg = PipxDependenciesDialog(
+            package=package,
+            dependencies=dependencies,
+            mode=PipxDependenciesDialog.OutdatedMode,
+        )
+        dlg.exec()
+
+    @pyqtSlot()
+    def __showUptodateDependencies(self):
+        """
+        Private slot to show a dialog with the up-to-date dependencies of the selected
+        package.
+        """
+        package = self.__selectedPackages()[0]
+        dependencies = self.__pipx.getUptodatePackageDependencies(package=package)
+
+        dlg = PipxDependenciesDialog(
+            package=package,
+            dependencies=dependencies,
+            mode=PipxDependenciesDialog.UptodateMode,
+        )
+        dlg.exec()
+
+    @pyqtSlot()
+    def __upgradeDependencies(self):
+        """
+        Private slot to upgrade the outdated dependencies of the selected package.
+        """
+        package = self.__selectedPackages()[0]
+        self.__pipx.upgradePackageDependencies(package=package)
+        self.on_refreshButton_clicked()
+
     #######################################################################
     ## Main widget related methods below
     #######################################################################
@@ -632,10 +712,25 @@
         Private slot to handle a change of selected packages and apps.
         """
         selectedPackages = self.__selectedPackages()
+        selectedPackageItems = self.__selectedPackageItems()
 
         self.upgradeButton.setEnabled(bool(selectedPackages))
         self.uninstallButton.setEnabled(len(selectedPackages) == 1)
 
+        self.__dependenciseSubmenuAct.setEnabled(len(selectedPackages) == 1)
+        self.__showOutdatedDependenciesAct.setEnabled(
+            len(selectedPackages) == 1
+            and bool(
+                selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole)
+            )
+        )
+        self.__upgradeDependenciesAct.setEnabled(
+            len(selectedPackages) == 1
+            and bool(
+                selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole)
+            )
+        )
+
     def __selectedPackages(self):
         """
         Private method to determine the list of selected packages.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PipxInterface/Ui_PipxDependenciesDialog.py	Tue Jul 30 17:45:46 2024 +0200
@@ -0,0 +1,48 @@
+# Form implementation generated from reading ui file 'PipxInterface/PipxDependenciesDialog.ui'
+#
+# 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.
+
+
+from PyQt6 import QtCore, QtGui, QtWidgets
+
+
+class Ui_PipxDependenciesDialog(object):
+    def setupUi(self, PipxDependenciesDialog):
+        PipxDependenciesDialog.setObjectName("PipxDependenciesDialog")
+        PipxDependenciesDialog.resize(498, 700)
+        PipxDependenciesDialog.setSizeGripEnabled(True)
+        self.verticalLayout = QtWidgets.QVBoxLayout(PipxDependenciesDialog)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.headerLabel = QtWidgets.QLabel(parent=PipxDependenciesDialog)
+        self.headerLabel.setText("Header")
+        self.headerLabel.setObjectName("headerLabel")
+        self.verticalLayout.addWidget(self.headerLabel)
+        self.dependenciesList = QtWidgets.QTreeWidget(parent=PipxDependenciesDialog)
+        self.dependenciesList.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
+        self.dependenciesList.setAlternatingRowColors(True)
+        self.dependenciesList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection)
+        self.dependenciesList.setRootIsDecorated(False)
+        self.dependenciesList.setItemsExpandable(False)
+        self.dependenciesList.setAllColumnsShowFocus(True)
+        self.dependenciesList.setObjectName("dependenciesList")
+        self.verticalLayout.addWidget(self.dependenciesList)
+        self.buttonBox = QtWidgets.QDialogButtonBox(parent=PipxDependenciesDialog)
+        self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
+        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Close)
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout.addWidget(self.buttonBox)
+
+        self.retranslateUi(PipxDependenciesDialog)
+        self.buttonBox.accepted.connect(PipxDependenciesDialog.accept) # type: ignore
+        self.buttonBox.rejected.connect(PipxDependenciesDialog.reject) # type: ignore
+        QtCore.QMetaObject.connectSlotsByName(PipxDependenciesDialog)
+
+    def retranslateUi(self, PipxDependenciesDialog):
+        _translate = QtCore.QCoreApplication.translate
+        PipxDependenciesDialog.setWindowTitle(_translate("PipxDependenciesDialog", "Package Dependencies"))
+        self.dependenciesList.headerItem().setText(0, _translate("PipxDependenciesDialog", "Dependency"))
+        self.dependenciesList.headerItem().setText(1, _translate("PipxDependenciesDialog", "Installed Version"))
+        self.dependenciesList.headerItem().setText(2, _translate("PipxDependenciesDialog", "Available Version"))
Binary file PipxInterface/i18n/pipx_de.qm has changed
--- a/PipxInterface/i18n/pipx_de.ts	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/i18n/pipx_de.ts	Tue Jul 30 17:45:46 2024 +0200
@@ -54,45 +54,60 @@
       <translation>Alle Pakete deinstallieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
-      <source>Check Outdated Package</source>
-      <translation>Prüfe veraltete Pakete</translation>
-    </message>
-    <message>
-      <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="484" />
+      <location filename="../Pipx.py" line="450" />
       <source>Upgrade Package</source>
       <translation>Paket aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="494" />
+      <location filename="../Pipx.py" line="460" />
       <source>Upgrade All Packages</source>
       <translation>Alle Pakete aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="504" />
+      <location filename="../Pipx.py" line="470" />
       <source>Upgrade Shared Libraries</source>
       <translation>Gemeinsame Bibliotheken aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="518" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Interpreters</source>
       <translation>Interpreter aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="531" />
+      <location filename="../Pipx.py" line="497" />
       <source>Prune Unused Interpreters</source>
       <translation>Ungenutzte Interpreter entfernen</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="542" />
+      <location filename="../Pipx.py" line="508" />
       <source>Ensure PATH Modifications</source>
       <translation>PATH-Änderungen sicherstellen</translation>
     </message>
+    <message>
+      <location filename="../Pipx.py" line="535" />
+      <source>Check Outdated Package</source>
+      <translation>Prüfe veraltete Pakete</translation>
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="536" />
+      <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="577" />
+      <source>Get Package Dependencies</source>
+      <translation>Paketabhängigkeiten abrufen</translation>
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="578" />
+      <source>&lt;p&gt;The status of dependencies 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 der Abhängigkeiten des Pakets &lt;b&gt;{0}&lt;/b&gt; konnte nicht ermittelt werden.&lt;/p&gt;&lt;p&gt;Ursache: {1}&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="648" />
+      <source>Upgrade Dependencies</source>
+      <translation>Abhängigkeiten aktualisieren</translation>
+    </message>
   </context>
   <context>
     <name>PipxAppStartDialog</name>
@@ -148,6 +163,44 @@
     </message>
   </context>
   <context>
+    <name>PipxDependenciesDialog</name>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="50" />
+      <source>Outdated Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation>Veraltete Abhängigkeiten des Pakets &lt;b&gt;{0}&lt;/b&gt;</translation>
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="52" />
+      <source>Up-to-date Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation>Aktuelle Abhängigkeiten des Pakets &lt;b&gt;{0}&lt;/b&gt;</translation>
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="54" />
+      <source>Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation>Abhängigkeiten des Pakets &lt;b&gt;{0}&lt;/b&gt;</translation>
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Package Dependencies</source>
+      <translation>Paketabhängigkeiten</translation>
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Dependency</source>
+      <translation>Abhängigkeit</translation>
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Installed Version</source>
+      <translation>Installierte Version</translation>
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Available Version</source>
+      <translation>Verfügbare Version</translation>
+    </message>
+  </context>
+  <context>
     <name>PipxExecDialog</name>
     <message>
       <location filename="../PipxExecDialog.ui" line="0" />
@@ -459,184 +512,209 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="108" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install</source>
       <translation>Installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="202" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="227" />
+      <location filename="../PipxWidget.py" line="112" />
       <source>Install Packages</source>
       <translation>Pakete installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="221" />
-      <location filename="../PipxWidget.py" line="113" />
+      <location filename="../PipxWidget.py" line="246" />
+      <location filename="../PipxWidget.py" line="115" />
       <source>Install All Packages</source>
       <translation>Alle Pakete installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="119" />
       <source>Re-Install Selected Package</source>
       <translation>Ausgewähltes Paket neu installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="319" />
-      <location filename="../PipxWidget.py" line="120" />
+      <location filename="../PipxWidget.py" line="344" />
+      <location filename="../PipxWidget.py" line="122" />
       <source>Re-Install All Packages</source>
       <translation>Alle Pakete neu installieren</translation>
     </message>
     <message>
-      <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" />
+      <location filename="../PipxWidget.py" line="302" />
+      <location filename="../PipxWidget.py" line="293" />
+      <location filename="../PipxWidget.py" line="281" />
+      <location filename="../PipxWidget.py" line="265" />
+      <location filename="../PipxWidget.py" line="126" />
       <source>Create Spec Metadata File</source>
       <translation>Erzeuge Spec-Metadaten-Datei</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="131" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Upgrade</source>
       <translation>Aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="133" />
+      <location filename="../PipxWidget.py" line="135" />
       <source>Check Outdated Packages</source>
       <translation>Prüfe veraltete Pakete</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="364" />
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="398" />
+      <location filename="../PipxWidget.py" line="139" />
       <source>Upgrade Selected Package</source>
       <translation>Ausgewähltes Paket aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="385" />
-      <location filename="../PipxWidget.py" line="140" />
+      <location filename="../PipxWidget.py" line="419" />
+      <location filename="../PipxWidget.py" line="142" />
       <source>Upgrade All Packages</source>
       <translation>Alle Pakete aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="144" />
+      <location filename="../PipxWidget.py" line="146" />
       <source>Upgrade Shared Libraries</source>
       <translation>Gemeinsame Bibliotheken aktualisieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="151" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall</source>
       <translation>Deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="155" />
       <source>Uninstall Selected Package</source>
       <translation>Ausgewähltes Paket deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="427" />
-      <location filename="../PipxWidget.py" line="156" />
+      <location filename="../PipxWidget.py" line="462" />
+      <location filename="../PipxWidget.py" line="158" />
       <source>Uninstall All Packages</source>
       <translation>Alle Pakete deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="171" />
+      <location filename="../PipxWidget.py" line="165" />
+      <source>Dependencies</source>
+      <translation>Abhängigkeiten</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="167" />
+      <source>Show All Dependencies</source>
+      <translation>Zeige Alle Abhängigkeiten</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="170" />
+      <source>Show Outdated Dependencies</source>
+      <translation>Zeige Veraltete Abhängigkeiten</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="173" />
+      <source>Show Up-to-date Dependencies</source>
+      <translation>Zeige Aktuelle Abhängigkeiten</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="177" />
+      <source>Upgrade Dependencies</source>
+      <translation>Abhängigkeiten aktualisieren</translation>
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="196" />
       <source>Standalone Interpreters</source>
       <translation>Eigenständige Interpreter</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="200" />
       <source>Ensure PATH Modifications</source>
       <translation>PATH-Änderungen sicherstellen</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="178" />
+      <location filename="../PipxWidget.py" line="203" />
       <source>Configure...</source>
       <translation>Einstellungen...</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="242" />
+      <location filename="../PipxWidget.py" line="267" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation>JSON Dateien (*.json);;Alle Dateien (*)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="243" />
+      <location filename="../PipxWidget.py" line="268" />
       <source>JSON Files (*.json)</source>
       <translation>JSON-Dateien (*.json)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="257" />
+      <location filename="../PipxWidget.py" line="282" />
       <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="269" />
+      <location filename="../PipxWidget.py" line="294" />
       <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="278" />
+      <location filename="../PipxWidget.py" line="303" />
       <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="294" />
+      <location filename="../PipxWidget.py" line="319" />
       <source>Re-Install Package</source>
       <translation>Paket neu installieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="295" />
+      <location filename="../PipxWidget.py" line="320" />
       <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="320" />
+      <location filename="../PipxWidget.py" line="345" />
       <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="365" />
+      <location filename="../PipxWidget.py" line="399" />
       <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" />
+      <location filename="../PipxWidget.py" line="420" />
       <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" />
+      <location filename="../PipxWidget.py" line="446" />
       <source>Uninstall Package</source>
       <translation>Paket deinstallieren</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="412" />
+      <location filename="../PipxWidget.py" line="447" />
       <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="428" />
+      <location filename="../PipxWidget.py" line="463" />
       <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="468" />
+      <location filename="../PipxWidget.py" line="559" />
       <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="494" />
+      <location filename="../PipxWidget.py" line="588" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation>{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="523" />
+      <location filename="../PipxWidget.py" line="631" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation>{0}{1}</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="525" />
+      <location filename="../PipxWidget.py" line="633" />
       <source> (standalone)</source>
       <translation> (eigenständig)</translation>
     </message>
--- a/PipxInterface/i18n/pipx_empty.ts	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/i18n/pipx_empty.ts	Tue Jul 30 17:45:46 2024 +0200
@@ -54,45 +54,60 @@
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
-      <source>Check Outdated Package</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <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="484" />
+      <location filename="../Pipx.py" line="450" />
       <source>Upgrade Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="494" />
+      <location filename="../Pipx.py" line="460" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="504" />
+      <location filename="../Pipx.py" line="470" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="518" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="531" />
+      <location filename="../Pipx.py" line="497" />
       <source>Prune Unused Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="542" />
+      <location filename="../Pipx.py" line="508" />
       <source>Ensure PATH Modifications</source>
       <translation type="unfinished" />
     </message>
+    <message>
+      <location filename="../Pipx.py" line="535" />
+      <source>Check Outdated Package</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="536" />
+      <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="577" />
+      <source>Get Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="578" />
+      <source>&lt;p&gt;The status of dependencies 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="648" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
   </context>
   <context>
     <name>PipxAppStartDialog</name>
@@ -148,6 +163,44 @@
     </message>
   </context>
   <context>
+    <name>PipxDependenciesDialog</name>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="50" />
+      <source>Outdated Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="52" />
+      <source>Up-to-date Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="54" />
+      <source>Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Dependency</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Installed Version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Available Version</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>PipxExecDialog</name>
     <message>
       <location filename="../PipxExecDialog.ui" line="0" />
@@ -459,184 +512,209 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="108" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="202" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="227" />
+      <location filename="../PipxWidget.py" line="112" />
       <source>Install Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="221" />
-      <location filename="../PipxWidget.py" line="113" />
+      <location filename="../PipxWidget.py" line="246" />
+      <location filename="../PipxWidget.py" line="115" />
       <source>Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="119" />
       <source>Re-Install Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="319" />
-      <location filename="../PipxWidget.py" line="120" />
+      <location filename="../PipxWidget.py" line="344" />
+      <location filename="../PipxWidget.py" line="122" />
       <source>Re-Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <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" />
+      <location filename="../PipxWidget.py" line="302" />
+      <location filename="../PipxWidget.py" line="293" />
+      <location filename="../PipxWidget.py" line="281" />
+      <location filename="../PipxWidget.py" line="265" />
+      <location filename="../PipxWidget.py" line="126" />
       <source>Create Spec Metadata File</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="131" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Upgrade</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="133" />
+      <location filename="../PipxWidget.py" line="135" />
       <source>Check Outdated Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="364" />
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="398" />
+      <location filename="../PipxWidget.py" line="139" />
       <source>Upgrade Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="385" />
-      <location filename="../PipxWidget.py" line="140" />
+      <location filename="../PipxWidget.py" line="419" />
+      <location filename="../PipxWidget.py" line="142" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="144" />
+      <location filename="../PipxWidget.py" line="146" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="151" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="155" />
       <source>Uninstall Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="427" />
-      <location filename="../PipxWidget.py" line="156" />
+      <location filename="../PipxWidget.py" line="462" />
+      <location filename="../PipxWidget.py" line="158" />
       <source>Uninstall All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="171" />
+      <location filename="../PipxWidget.py" line="165" />
+      <source>Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="167" />
+      <source>Show All Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="170" />
+      <source>Show Outdated Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="173" />
+      <source>Show Up-to-date Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="177" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="196" />
       <source>Standalone Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="200" />
       <source>Ensure PATH Modifications</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="178" />
+      <location filename="../PipxWidget.py" line="203" />
       <source>Configure...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="242" />
+      <location filename="../PipxWidget.py" line="267" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="243" />
+      <location filename="../PipxWidget.py" line="268" />
       <source>JSON Files (*.json)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="257" />
+      <location filename="../PipxWidget.py" line="282" />
       <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="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="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="294" />
+      <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="303" />
+      <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="319" />
       <source>Re-Install Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="295" />
+      <location filename="../PipxWidget.py" line="320" />
       <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="320" />
+      <location filename="../PipxWidget.py" line="345" />
       <source>Do you really want to reinstall all packages?</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="365" />
+      <location filename="../PipxWidget.py" line="399" />
       <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" />
+      <location filename="../PipxWidget.py" line="420" />
       <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" />
+      <location filename="../PipxWidget.py" line="446" />
       <source>Uninstall Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="412" />
+      <location filename="../PipxWidget.py" line="447" />
       <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="428" />
+      <location filename="../PipxWidget.py" line="463" />
       <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="468" />
+      <location filename="../PipxWidget.py" line="559" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="494" />
+      <location filename="../PipxWidget.py" line="588" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="523" />
+      <location filename="../PipxWidget.py" line="631" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="525" />
+      <location filename="../PipxWidget.py" line="633" />
       <source> (standalone)</source>
       <translation type="unfinished" />
     </message>
--- a/PipxInterface/i18n/pipx_en.ts	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/i18n/pipx_en.ts	Tue Jul 30 17:45:46 2024 +0200
@@ -54,45 +54,60 @@
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
-      <source>Check Outdated Package</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <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="484" />
+      <location filename="../Pipx.py" line="450" />
       <source>Upgrade Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="494" />
+      <location filename="../Pipx.py" line="460" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="504" />
+      <location filename="../Pipx.py" line="470" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="518" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="531" />
+      <location filename="../Pipx.py" line="497" />
       <source>Prune Unused Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Pipx.py" line="542" />
+      <location filename="../Pipx.py" line="508" />
       <source>Ensure PATH Modifications</source>
       <translation type="unfinished" />
     </message>
+    <message>
+      <location filename="../Pipx.py" line="535" />
+      <source>Check Outdated Package</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="536" />
+      <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="577" />
+      <source>Get Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="578" />
+      <source>&lt;p&gt;The status of dependencies 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="648" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
   </context>
   <context>
     <name>PipxAppStartDialog</name>
@@ -148,6 +163,44 @@
     </message>
   </context>
   <context>
+    <name>PipxDependenciesDialog</name>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="50" />
+      <source>Outdated Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="52" />
+      <source>Up-to-date Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="54" />
+      <source>Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Dependency</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Installed Version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Available Version</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>PipxExecDialog</name>
     <message>
       <location filename="../PipxExecDialog.ui" line="0" />
@@ -459,184 +512,209 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="108" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="202" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="227" />
+      <location filename="../PipxWidget.py" line="112" />
       <source>Install Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="221" />
-      <location filename="../PipxWidget.py" line="113" />
+      <location filename="../PipxWidget.py" line="246" />
+      <location filename="../PipxWidget.py" line="115" />
       <source>Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="119" />
       <source>Re-Install Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="319" />
-      <location filename="../PipxWidget.py" line="120" />
+      <location filename="../PipxWidget.py" line="344" />
+      <location filename="../PipxWidget.py" line="122" />
       <source>Re-Install All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <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" />
+      <location filename="../PipxWidget.py" line="302" />
+      <location filename="../PipxWidget.py" line="293" />
+      <location filename="../PipxWidget.py" line="281" />
+      <location filename="../PipxWidget.py" line="265" />
+      <location filename="../PipxWidget.py" line="126" />
       <source>Create Spec Metadata File</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="131" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Upgrade</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="133" />
+      <location filename="../PipxWidget.py" line="135" />
       <source>Check Outdated Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="364" />
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="398" />
+      <location filename="../PipxWidget.py" line="139" />
       <source>Upgrade Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="385" />
-      <location filename="../PipxWidget.py" line="140" />
+      <location filename="../PipxWidget.py" line="419" />
+      <location filename="../PipxWidget.py" line="142" />
       <source>Upgrade All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="144" />
+      <location filename="../PipxWidget.py" line="146" />
       <source>Upgrade Shared Libraries</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="151" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="155" />
       <source>Uninstall Selected Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="427" />
-      <location filename="../PipxWidget.py" line="156" />
+      <location filename="../PipxWidget.py" line="462" />
+      <location filename="../PipxWidget.py" line="158" />
       <source>Uninstall All Packages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="171" />
+      <location filename="../PipxWidget.py" line="165" />
+      <source>Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="167" />
+      <source>Show All Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="170" />
+      <source>Show Outdated Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="173" />
+      <source>Show Up-to-date Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="177" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="196" />
       <source>Standalone Interpreters</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="200" />
       <source>Ensure PATH Modifications</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="178" />
+      <location filename="../PipxWidget.py" line="203" />
       <source>Configure...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="242" />
+      <location filename="../PipxWidget.py" line="267" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="243" />
+      <location filename="../PipxWidget.py" line="268" />
       <source>JSON Files (*.json)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="257" />
+      <location filename="../PipxWidget.py" line="282" />
       <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="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="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="294" />
+      <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="303" />
+      <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="319" />
       <source>Re-Install Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="295" />
+      <location filename="../PipxWidget.py" line="320" />
       <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="320" />
+      <location filename="../PipxWidget.py" line="345" />
       <source>Do you really want to reinstall all packages?</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="365" />
+      <location filename="../PipxWidget.py" line="399" />
       <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" />
+      <location filename="../PipxWidget.py" line="420" />
       <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" />
+      <location filename="../PipxWidget.py" line="446" />
       <source>Uninstall Package</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="412" />
+      <location filename="../PipxWidget.py" line="447" />
       <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="428" />
+      <location filename="../PipxWidget.py" line="463" />
       <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="468" />
+      <location filename="../PipxWidget.py" line="559" />
       <source>&lt;b&gt;pipx Version {0}&lt;/b&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="494" />
+      <location filename="../PipxWidget.py" line="588" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="523" />
+      <location filename="../PipxWidget.py" line="631" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="525" />
+      <location filename="../PipxWidget.py" line="633" />
       <source> (standalone)</source>
       <translation type="unfinished" />
     </message>
--- a/PipxInterface/i18n/pipx_es.ts	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/i18n/pipx_es.ts	Tue Jul 30 17:45:46 2024 +0200
@@ -54,45 +54,60 @@
       <translation>Desinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
-      <source>Check Outdated Package</source>
-      <translation>Comprobar Package Desactualizado</translation>
-    </message>
-    <message>
-      <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="484" />
+      <location filename="../Pipx.py" line="450" />
       <source>Upgrade Package</source>
       <translation>Actualizar Package</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="494" />
+      <location filename="../Pipx.py" line="460" />
       <source>Upgrade All Packages</source>
       <translation>Actualizar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="504" />
+      <location filename="../Pipx.py" line="470" />
       <source>Upgrade Shared Libraries</source>
       <translation>Actualizar Bibliotecas Compartidas</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="518" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Interpreters</source>
       <translation>Actualizar Intérpretes</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="531" />
+      <location filename="../Pipx.py" line="497" />
       <source>Prune Unused Interpreters</source>
       <translation>Limpiar Intérpretes no Utililizados</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="542" />
+      <location filename="../Pipx.py" line="508" />
       <source>Ensure PATH Modifications</source>
       <translation>Asegurar modificaciones de PATH</translation>
     </message>
+    <message>
+      <location filename="../Pipx.py" line="535" />
+      <source>Check Outdated Package</source>
+      <translation>Comprobar Package Desactualizado</translation>
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="536" />
+      <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="577" />
+      <source>Get Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="578" />
+      <source>&lt;p&gt;The status of dependencies 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="648" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
   </context>
   <context>
     <name>PipxAppStartDialog</name>
@@ -148,6 +163,44 @@
     </message>
   </context>
   <context>
+    <name>PipxDependenciesDialog</name>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="50" />
+      <source>Outdated Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="52" />
+      <source>Up-to-date Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="54" />
+      <source>Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Dependency</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Installed Version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Available Version</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>PipxExecDialog</name>
     <message>
       <location filename="../PipxExecDialog.ui" line="0" />
@@ -459,184 +512,209 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="109" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install</source>
       <translation>Instalar</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="203" />
-      <location filename="../PipxWidget.py" line="111" />
+      <location filename="../PipxWidget.py" line="227" />
+      <location filename="../PipxWidget.py" line="112" />
       <source>Install Packages</source>
       <translation>Instalar Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="222" />
-      <location filename="../PipxWidget.py" line="114" />
+      <location filename="../PipxWidget.py" line="246" />
+      <location filename="../PipxWidget.py" line="115" />
       <source>Install All Packages</source>
       <translation>Instalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="118" />
+      <location filename="../PipxWidget.py" line="119" />
       <source>Re-Install Selected Package</source>
       <translation>Reinstalar Package Seleccionado</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="320" />
-      <location filename="../PipxWidget.py" line="121" />
+      <location filename="../PipxWidget.py" line="344" />
+      <location filename="../PipxWidget.py" line="122" />
       <source>Re-Install All Packages</source>
       <translation>Reinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="278" />
-      <location filename="../PipxWidget.py" line="269" />
-      <location filename="../PipxWidget.py" line="257" />
-      <location filename="../PipxWidget.py" line="241" />
-      <location filename="../PipxWidget.py" line="125" />
+      <location filename="../PipxWidget.py" line="302" />
+      <location filename="../PipxWidget.py" line="293" />
+      <location filename="../PipxWidget.py" line="281" />
+      <location filename="../PipxWidget.py" line="265" />
+      <location filename="../PipxWidget.py" line="126" />
       <source>Create Spec Metadata File</source>
       <translation>Crear Archivo de Metadatos de Spec</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="132" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Upgrade</source>
       <translation>Actualizar</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="134" />
+      <location filename="../PipxWidget.py" line="135" />
       <source>Check Outdated Packages</source>
       <translation>Comprobar Packages Desactualizados</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="367" />
-      <location filename="../PipxWidget.py" line="138" />
+      <location filename="../PipxWidget.py" line="398" />
+      <location filename="../PipxWidget.py" line="139" />
       <source>Upgrade Selected Package</source>
       <translation>Actualizar Package Seleccionado</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="388" />
-      <location filename="../PipxWidget.py" line="141" />
+      <location filename="../PipxWidget.py" line="419" />
+      <location filename="../PipxWidget.py" line="142" />
       <source>Upgrade All Packages</source>
       <translation>Actualizar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="145" />
+      <location filename="../PipxWidget.py" line="146" />
       <source>Upgrade Shared Libraries</source>
       <translation>Actualizar Bibliotecas Compartidas</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="152" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall</source>
       <translation>Desinstalar</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="154" />
+      <location filename="../PipxWidget.py" line="155" />
       <source>Uninstall Selected Package</source>
       <translation>Desinstalar Package Seleccionado</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="431" />
-      <location filename="../PipxWidget.py" line="157" />
+      <location filename="../PipxWidget.py" line="462" />
+      <location filename="../PipxWidget.py" line="158" />
       <source>Uninstall All Packages</source>
       <translation>Desinstalar Todos los Packages</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="172" />
+      <location filename="../PipxWidget.py" line="165" />
+      <source>Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="167" />
+      <source>Show All Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="170" />
+      <source>Show Outdated Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="173" />
+      <source>Show Up-to-date Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="177" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="196" />
       <source>Standalone Interpreters</source>
       <translation>Intérpretes Independientes</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="176" />
+      <location filename="../PipxWidget.py" line="200" />
       <source>Ensure PATH Modifications</source>
       <translation>Asegurar modificaciones de PATH</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="179" />
+      <location filename="../PipxWidget.py" line="203" />
       <source>Configure...</source>
       <translation>Configurar...</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="243" />
+      <location filename="../PipxWidget.py" line="267" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation>Archivos JSON (*.json);;Todos los Archivos (*)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="244" />
+      <location filename="../PipxWidget.py" line="268" />
       <source>JSON Files (*.json)</source>
       <translation>Archivos JSON (*.json)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="258" />
+      <location filename="../PipxWidget.py" line="282" />
       <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="270" />
+      <location filename="../PipxWidget.py" line="294" />
       <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="279" />
+      <location filename="../PipxWidget.py" line="303" />
       <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="295" />
+      <location filename="../PipxWidget.py" line="319" />
       <source>Re-Install Package</source>
       <translation>Reinstalar Package</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="296" />
+      <location filename="../PipxWidget.py" line="320" />
       <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="321" />
+      <location filename="../PipxWidget.py" line="345" />
       <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="368" />
+      <location filename="../PipxWidget.py" line="399" />
       <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;El package seleccionado no se puede actualizar porque algunas de sus apps están en ejecución.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Detener estasapps e intentar de nuevo.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="389" />
+      <location filename="../PipxWidget.py" line="420" />
       <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;Los packages no se pueden actualizar porque algunas de sus apps están en ejecución.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Detener estas apps e intentar de nuevo.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="415" />
+      <location filename="../PipxWidget.py" line="446" />
       <source>Uninstall Package</source>
       <translation>Desinstalar Package</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="416" />
+      <location filename="../PipxWidget.py" line="447" />
       <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="432" />
+      <location filename="../PipxWidget.py" line="463" />
       <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="472" />
+      <location filename="../PipxWidget.py" line="559" />
       <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="501" />
+      <location filename="../PipxWidget.py" line="588" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation>{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="544" />
+      <location filename="../PipxWidget.py" line="631" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation>{0}{1}</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="546" />
+      <location filename="../PipxWidget.py" line="633" />
       <source> (standalone)</source>
       <translation> (independiente)</translation>
     </message>
--- a/PipxInterface/i18n/pipx_ru.ts	Mon Jul 29 11:58:31 2024 +0200
+++ b/PipxInterface/i18n/pipx_ru.ts	Tue Jul 30 17:45:46 2024 +0200
@@ -54,45 +54,60 @@
       <translation>Деинсталировать все пакеты</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="456" />
-      <source>Check Outdated Package</source>
-      <translation>Проверить устаревшие пакеты</translation>
-    </message>
-    <message>
-      <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="484" />
+      <location filename="../Pipx.py" line="450" />
       <source>Upgrade Package</source>
       <translation>Обновить пакет</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="494" />
+      <location filename="../Pipx.py" line="460" />
       <source>Upgrade All Packages</source>
       <translation>Обновить все пакеты</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="504" />
+      <location filename="../Pipx.py" line="470" />
       <source>Upgrade Shared Libraries</source>
       <translation>Обновить общие библиотеки</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="518" />
+      <location filename="../Pipx.py" line="484" />
       <source>Upgrade Interpreters</source>
       <translation>Обновить интерпретаторы</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="531" />
+      <location filename="../Pipx.py" line="497" />
       <source>Prune Unused Interpreters</source>
       <translation>Удалить неиспользуемые интерпретаторы</translation>
     </message>
     <message>
-      <location filename="../Pipx.py" line="542" />
+      <location filename="../Pipx.py" line="508" />
       <source>Ensure PATH Modifications</source>
       <translation>Обеспечьте внесение изменений в ПУТЬ</translation>
     </message>
+    <message>
+      <location filename="../Pipx.py" line="535" />
+      <source>Check Outdated Package</source>
+      <translation>Проверить устаревшие пакеты</translation>
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="536" />
+      <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="577" />
+      <source>Get Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Pipx.py" line="578" />
+      <source>&lt;p&gt;The status of dependencies 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="648" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
   </context>
   <context>
     <name>PipxAppStartDialog</name>
@@ -148,6 +163,44 @@
     </message>
   </context>
   <context>
+    <name>PipxDependenciesDialog</name>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="50" />
+      <source>Outdated Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="52" />
+      <source>Up-to-date Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.py" line="54" />
+      <source>Dependencies of package &lt;b&gt;{0}&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Package Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Dependency</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Installed Version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxDependenciesDialog.ui" line="0" />
+      <source>Available Version</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>PipxExecDialog</name>
     <message>
       <location filename="../PipxExecDialog.ui" line="0" />
@@ -459,184 +512,209 @@
   <context>
     <name>PipxWidget</name>
     <message>
-      <location filename="../PipxWidget.py" line="108" />
+      <location filename="../PipxWidget.py" line="110" />
       <source>Install</source>
       <translation>Установить</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="202" />
-      <location filename="../PipxWidget.py" line="110" />
+      <location filename="../PipxWidget.py" line="227" />
+      <location filename="../PipxWidget.py" line="112" />
       <source>Install Packages</source>
       <translation>Установить пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="221" />
-      <location filename="../PipxWidget.py" line="113" />
+      <location filename="../PipxWidget.py" line="246" />
+      <location filename="../PipxWidget.py" line="115" />
       <source>Install All Packages</source>
       <translation>Установить все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="117" />
+      <location filename="../PipxWidget.py" line="119" />
       <source>Re-Install Selected Package</source>
       <translation>Переустановить выбранный пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="319" />
-      <location filename="../PipxWidget.py" line="120" />
+      <location filename="../PipxWidget.py" line="344" />
+      <location filename="../PipxWidget.py" line="122" />
       <source>Re-Install All Packages</source>
       <translation>Переустановить все пакеты</translation>
     </message>
     <message>
-      <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" />
+      <location filename="../PipxWidget.py" line="302" />
+      <location filename="../PipxWidget.py" line="293" />
+      <location filename="../PipxWidget.py" line="281" />
+      <location filename="../PipxWidget.py" line="265" />
+      <location filename="../PipxWidget.py" line="126" />
       <source>Create Spec Metadata File</source>
       <translation>Создайть файл метаданных спецификации</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="131" />
+      <location filename="../PipxWidget.py" line="133" />
       <source>Upgrade</source>
       <translation>Обновлять</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="133" />
+      <location filename="../PipxWidget.py" line="135" />
       <source>Check Outdated Packages</source>
       <translation>Проверить устаревшие пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="373" />
-      <location filename="../PipxWidget.py" line="137" />
+      <location filename="../PipxWidget.py" line="398" />
+      <location filename="../PipxWidget.py" line="139" />
       <source>Upgrade Selected Package</source>
       <translation>Обновить выбранный пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="394" />
-      <location filename="../PipxWidget.py" line="140" />
+      <location filename="../PipxWidget.py" line="419" />
+      <location filename="../PipxWidget.py" line="142" />
       <source>Upgrade All Packages</source>
       <translation>Обновить все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="144" />
+      <location filename="../PipxWidget.py" line="146" />
       <source>Upgrade Shared Libraries</source>
       <translation>Обновить общие библиотеки</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="151" />
+      <location filename="../PipxWidget.py" line="153" />
       <source>Uninstall</source>
       <translation>Деинсталировать</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="153" />
+      <location filename="../PipxWidget.py" line="155" />
       <source>Uninstall Selected Package</source>
       <translation>Деинсталировать выбранный пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="437" />
-      <location filename="../PipxWidget.py" line="156" />
+      <location filename="../PipxWidget.py" line="462" />
+      <location filename="../PipxWidget.py" line="158" />
       <source>Uninstall All Packages</source>
       <translation>Деинсталировать все пакеты</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="171" />
+      <location filename="../PipxWidget.py" line="165" />
+      <source>Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="167" />
+      <source>Show All Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="170" />
+      <source>Show Outdated Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="173" />
+      <source>Show Up-to-date Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="177" />
+      <source>Upgrade Dependencies</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PipxWidget.py" line="196" />
       <source>Standalone Interpreters</source>
       <translation>Автономные интерпретаторы</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="175" />
+      <location filename="../PipxWidget.py" line="200" />
       <source>Ensure PATH Modifications</source>
       <translation>Обеспечьте внесение изменений в ПУТЬ</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="178" />
+      <location filename="../PipxWidget.py" line="203" />
       <source>Configure...</source>
       <translation>Настроить...</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="242" />
+      <location filename="../PipxWidget.py" line="267" />
       <source>JSON Files (*.json);;All Files (*)</source>
       <translation>Файлы JSON (*.json);;Все файлы (*)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="243" />
+      <location filename="../PipxWidget.py" line="268" />
       <source>JSON Files (*.json)</source>
       <translation>Файлы JSON (*.json)</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="257" />
+      <location filename="../PipxWidget.py" line="282" />
       <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="269" />
+      <location filename="../PipxWidget.py" line="294" />
       <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="278" />
+      <location filename="../PipxWidget.py" line="303" />
       <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="294" />
+      <location filename="../PipxWidget.py" line="319" />
       <source>Re-Install Package</source>
       <translation>Переустановить пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="295" />
+      <location filename="../PipxWidget.py" line="320" />
       <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="320" />
+      <location filename="../PipxWidget.py" line="345" />
       <source>Do you really want to reinstall all packages?</source>
       <translation>Вы действительно хотите переустановить все пакеты?</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="374" />
+      <location filename="../PipxWidget.py" line="399" />
       <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;Выбранный пакет не может быть обновлен, поскольку некоторые из его приложений запущены.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Остановите эти приложения и повторите попытку.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="395" />
+      <location filename="../PipxWidget.py" line="420" />
       <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;Обновление пакетов невозможно, поскольку некоторые из их приложений запущены.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{0}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Остановите эти приложения и повторите попытку.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="421" />
+      <location filename="../PipxWidget.py" line="446" />
       <source>Uninstall Package</source>
       <translation>Деинсталировать пакет</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="422" />
+      <location filename="../PipxWidget.py" line="447" />
       <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="438" />
+      <location filename="../PipxWidget.py" line="463" />
       <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="478" />
+      <location filename="../PipxWidget.py" line="559" />
       <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="507" />
+      <location filename="../PipxWidget.py" line="588" />
       <source>{0} ({1})</source>
       <comment>current version, latest version</comment>
       <translation>{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="550" />
+      <location filename="../PipxWidget.py" line="631" />
       <source>{0}{1}</source>
       <comment>Python version, standalone indicator</comment>
       <translation />
     </message>
     <message>
-      <location filename="../PipxWidget.py" line="552" />
+      <location filename="../PipxWidget.py" line="633" />
       <source> (standalone)</source>
       <translation> (автономный)</translation>
     </message>
--- a/PluginPipxInterface.epj	Mon Jul 29 11:58:31 2024 +0200
+++ b/PluginPipxInterface.epj	Tue Jul 30 17:45:46 2024 +0200
@@ -202,6 +202,7 @@
     "FORMS": [
       "PipxInterface/ConfigurationPage/PipxPage.ui",
       "PipxInterface/PipxAppStartDialog.ui",
+      "PipxInterface/PipxDependenciesDialog.ui",
       "PipxInterface/PipxExecDialog.ui",
       "PipxInterface/PipxInterpretersDialog.ui",
       "PipxInterface/PipxPackagesInputDialog.ui",
@@ -236,6 +237,8 @@
       "PipxInterface/icons/pipx22.svg",
       "PipxInterface/icons/pipx48.svg",
       "PipxInterface/icons/pipx96.svg",
+      "PipxInterface/icons/pipxOutdated22.svg",
+      "PipxInterface/icons/pipxOutdated96.svg",
       "PluginPipxInterface.epj",
       "PluginPipxInterface.zip",
       "changelog.md",
@@ -299,6 +302,7 @@
       "PipxInterface/ConfigurationPage/__init__.py",
       "PipxInterface/Pipx.py",
       "PipxInterface/PipxAppStartDialog.py",
+      "PipxInterface/PipxDependenciesDialog.py",
       "PipxInterface/PipxExecDialog.py",
       "PipxInterface/PipxInterpretersDialog.py",
       "PipxInterface/PipxPackagesInputDialog.py",
@@ -306,6 +310,7 @@
       "PipxInterface/PipxSpecInputDialog.py",
       "PipxInterface/PipxWidget.py",
       "PipxInterface/Ui_PipxAppStartDialog.py",
+      "PipxInterface/Ui_PipxDependenciesDialog.py",
       "PipxInterface/Ui_PipxExecDialog.py",
       "PipxInterface/Ui_PipxInterpretersDialog.py",
       "PipxInterface/Ui_PipxPackagesInputDialog.py",
--- a/PluginPipxInterface.py	Mon Jul 29 11:58:31 2024 +0200
+++ b/PluginPipxInterface.py	Tue Jul 30 17:45:46 2024 +0200
@@ -36,7 +36,7 @@
     "author": "Detlev Offenbach <detlev@die-offenbachs.de>",
     "autoactivate": True,
     "deactivateable": True,
-    "version": "10.2.4",
+    "version": "10.3.0",
     "className": "PluginPipxInterface",
     "packageName": "PipxInterface",
     "shortDescription": "Graphical interface to the 'pipx' command.",
Binary file PluginPipxInterface.zip has changed
--- a/changelog.md	Mon Jul 29 11:58:31 2024 +0200
+++ b/changelog.md	Tue Jul 30 17:45:46 2024 +0200
@@ -1,6 +1,11 @@
 ChangeLog
 ---------
 
+__Version 10.3.0__
+
+- Implemented actions to show the dependencies of a package and upgrade them
+  using 'runpip' because 'pipx' doesn't upgrade them when upgrading the package.
+
 __Version 10.2.4__
 
 - bug fixes

eric ide

mercurial