Необходимо вывести изображение без использования абсолютного пути на PyQt5

Мне необходимо вывести изображение без абсолютной ссылки, чтобы если другой пользователь откроет приложение, то картинка также отображалась в окне.

Как это сделать?

Вот пример кода, который я пытался реализовать, но он не выводит картинку на экран:

    relative_path = "PracticeMPT/PracticeApplication/designFile/logo.png"
    absolute_path = os.path.abspath(relative_path)

    image = QtGui.QImage(absolute_path)
    pixmap = QtGui.QPixmap.fromImage(image)
    self.label_2.setPixmap(pixmap)

Если указывать путь подобного формата: D:PracticeMPT/PracticeApplication/designFile/logo.png
(то есть в диском D:), то все работает.

Но мне надо без него, ведь пользователь может хранить приложение на другом диске или у него другая директория может быть.

Вот как выглядит мой код полностью:

import os
import sqlite3
import sys

from PyQt5.QtGui import QMovie
from PyQt5.QtWidgets import QMessageBox

from ManagerWindow_Staff import Ui_ManagerWindow_Staff


from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_AuthorizationWindow(object):

def setupUi(self, AuthorizationWindow):
    AuthorizationWindow.setObjectName("AuthorizationWindow")
    AuthorizationWindow.resize(340, 460)
    AuthorizationWindow.setFixedSize(AuthorizationWindow.size())
    self.centralwidget = QtWidgets.QWidget(AuthorizationWindow)
    self.centralwidget.setObjectName("centralwidget")
    # Создаем QLabel для отображения фона
    self.background_label = QtWidgets.QLabel(self.centralwidget)
    self.background_label.setGeometry(QtCore.QRect(0, 0, 340, 460))
    movie = QMovie("AnimCloud.gif")
    self.background_label.setMovie(movie)
    movie.start()
    self.background_label.setScaledContents(True)
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(0, 90, 340, 50))
    font = QtGui.QFont()
    font.setPointSize(14)
    font.setBold(True)
    font.setWeight(75)
    self.label.setFont(font)
    self.label.setAlignment(QtCore.Qt.AlignCenter)
    self.label.setObjectName("label")
    self.label_2 = QtWidgets.QLabel(self.centralwidget)
    self.label_2.setGeometry(QtCore.QRect(0, 25, 340, 90))

    # Относительный путь к файлу изображения
    relative_path = "PracticeMPT/PracticeApplication/designFile/logo.png"

    # Получение абсолютного пути
    absolute_path = os.path.abspath(relative_path)

    image = QtGui.QImage(absolute_path)
    pixmap = QtGui.QPixmap.fromImage(image)
    self.label_2.setPixmap(pixmap)
    self.label_2.setAlignment(QtCore.Qt.AlignCenter)
    self.label_2.setObjectName("label_2")
    self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEdit.setGeometry(QtCore.QRect(75, 200, 193, 31))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.lineEdit.setFont(font)
    self.lineEdit.setStyleSheet("Background-color: #fff; \n"
                                "border-radius: 7px;\n border: 2px solid black;")

    self.lineEdit.setObjectName("lineEdit_2")
    self.lineEdit.setObjectName("lineEdit")
    self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEdit_2.setGeometry(QtCore.QRect(75, 260, 193, 31))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.lineEdit_2.setFont(font)
    self.lineEdit_2.setStyleSheet("Background-color: #fff; \n"
                                  "border-radius: 7px;\n border: 2px solid black;")

    self.lineEdit_2.setObjectName("lineEdit_2")
    self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
    self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(93, 340, 150, 50))
    self.pushButton.setStyleSheet("Background-color: #fff;\nborder-radius: 25px;")
    font = QtGui.QFont()
    font.setPointSize(10)
    font.setBold(True)
    font.setWeight(75)
    self.pushButton.setFont(font)
    self.pushButton.setLayoutDirection(QtCore.Qt.LeftToRight)
    self.pushButton.setObjectName("pushButton")

    self.label_3 = QtWidgets.QLabel(self.centralwidget)
    self.label_3.setGeometry(QtCore.QRect(10, 230, 55, 16))
    self.label_3.setText("")
    self.label_3.setObjectName("label_3")
    AuthorizationWindow.setCentralWidget(self.centralwidget)

    self.retranslateUi(AuthorizationWindow)
    QtCore.QMetaObject.connectSlotsByName(AuthorizationWindow)

    self.manager_window = None

def retranslateUi(self, AuthorizationWindow):
    _translate = QtCore.QCoreApplication.translate
    AuthorizationWindow.setWindowTitle(_translate("AuthorizationWindow", "MainWindow"))
    self.label.setText(_translate("AuthorizationWindow", "Добро пожаловать!"))
    self.pushButton.setText(_translate("AuthorizationWindow", "Войти"))
    self.lineEdit.setPlaceholderText(_translate("AdminWindow_AdminPanel", "Введите логин"))
    self.lineEdit_2.setPlaceholderText(_translate("AdminWindow_AdminPanel", "Введите пароль"))

Использую библиотеку PyQt5 для реализации данного приложения.


Ответы (1 шт):

Автор решения: S. Nick

Первое о чем мы с вами договоримся, будет то, что все модули и изображения у вас находятся в ОДНОМ каталоге.
Пусть это будет, например, D:PracticeMPT/PracticeApplication/designFile

Далее делаем:

  1. Создаем файл ресурсов например

q1563982.qrc:

<RCC>
  <qresource prefix="/">
    <file>AnimCloud.gif</file>
    <file>logo.png</file>
  </qresource>
</RCC>
  1. Загрузить изображение из файла ресурсов:

В консоли/терминале/CMD выполняем: pyrcc5 q1563982.qrc -o q1563982_rc.py

Этот способ заключается в том, чтобы преобразовать файл q1563982.qrc в файл q1563982_rc.py
Все картинка в q1563982_rc.py

  1. В модуле main.py:

    import q1563982_rc # Здесь мы импортируем наше изображение

Внимание !!! Формат получения картинки из q1563982_rc.py:

...
# ------------> vv <------------------------------------------
movie = QMovie(":/AnimCloud.gif")
...
# --------------------> vv <----------------------------------
pixmap = QtGui.QPixmap(":/logo.png")
...

main.py:

import sys
#import os
#import sqlite3
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QMovie
from PyQt5.QtWidgets import QMessageBox
# ?from ManagerWindow_Staff import Ui_ManagerWindow_Staff

import q1563982_rc                                                 # !!! +++

class Ui_AuthorizationWindow(object):
    def setupUi(self, AuthorizationWindow):
        AuthorizationWindow.setObjectName("AuthorizationWindow")
        AuthorizationWindow.resize(340, 460)
        AuthorizationWindow.setFixedSize(AuthorizationWindow.size())
        self.centralwidget = QtWidgets.QWidget(AuthorizationWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        # Создаем QLabel для отображения фона
        self.background_label = QtWidgets.QLabel(self.centralwidget)
        self.background_label.setGeometry(QtCore.QRect(0, 0, 340, 460))

# --------------------> vv <-------------------------------------------  !!! +++
        movie = QMovie(":/AnimCloud.gif")
        
        self.background_label.setMovie(movie)
        movie.start()
        
        self.background_label.setScaledContents(True)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(0, 90, 340, 50))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
       
        self.label.setStyleSheet("color: #faa;")               # +
        
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(0, 25, 340, 90))
#
#        # Относительный путь к файлу изображения
#        relative_path = "PracticeMPT/PracticeApplication/designFile/logo.png"
#        # Получение абсолютного пути
#        absolute_path = os.path.abspath(relative_path)
#        image = QtGui.QImage(absolute_path)

# ----------------------------> vv <------------------------------------------
        pixmap = QtGui.QPixmap(":/logo.png")                #.fromImage(image)
#
        self.label_2.setPixmap(pixmap.scaled(340, 90))                    # ++
        
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(75, 200, 193, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.lineEdit.setFont(font)
        self.lineEdit.setStyleSheet("Background-color: #fff; \n"
            "border-radius: 7px;\n border: 2px solid black;")

        self.lineEdit.setObjectName("lineEdit_2")
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(75, 260, 193, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.lineEdit_2.setFont(font)
        self.lineEdit_2.setStyleSheet("Background-color: #fff; \n"
            "border-radius: 7px;\n border: 2px solid black;")

        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(93, 340, 150, 50))
# +++
        self.pushButton.setStyleSheet("""
            QPushButton {
                background-color: transparent;
                border: 2px solid #FFA6D5;
                border-radius: 25px;
            }
            QPushButton:hover {
                background-color: rgba(255, 255, 55, 110);
                border: 2px solid #55A6D5;
            }            
        """)
            
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.pushButton.setObjectName("pushButton")

        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(10, 230, 55, 16))
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        AuthorizationWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(AuthorizationWindow)
        QtCore.QMetaObject.connectSlotsByName(AuthorizationWindow)

        self.manager_window = None

    def retranslateUi(self, AuthorizationWindow):
        _translate = QtCore.QCoreApplication.translate
        AuthorizationWindow.setWindowTitle(_translate("AuthorizationWindow", "MainWindow"))
        self.label.setText(_translate("AuthorizationWindow", "Добро пожаловать!"))
        self.pushButton.setText(_translate("AuthorizationWindow", "Войти"))
        self.lineEdit.setPlaceholderText(_translate("AdminWindow_AdminPanel", "Введите логин"))
        self.lineEdit_2.setPlaceholderText(_translate("AdminWindow_AdminPanel", "Введите пароль"))


class AuthorizationWindow(QtWidgets.QMainWindow, Ui_AuthorizationWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        # тут логика вашей программы
        # ...
        
        
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    authorization_window = AuthorizationWindow()
    authorization_window.show()
    sys.exit(app.exec_())    

  1. Модули q1563982_rc.py и main.py передаете другим пользователям и пускай они их размещают в любую свою папку (только вместе, в ОДИН каталог).
    Запускаем python main.py
→ Ссылка