Необходимо вывести изображение без использования абсолютного пути на 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 шт):
Первое о чем мы с вами договоримся, будет то, что все модули и изображения у вас находятся в ОДНОМ каталоге.
Пусть это будет, например, D:PracticeMPT/PracticeApplication/designFile
Далее делаем:
- Создаем файл ресурсов например
q1563982.qrc:
<RCC>
<qresource prefix="/">
<file>AnimCloud.gif</file>
<file>logo.png</file>
</qresource>
</RCC>
- Загрузить изображение из файла ресурсов:
В консоли/терминале/CMD выполняем: pyrcc5 q1563982.qrc -o q1563982_rc.py
Этот способ заключается в том, чтобы преобразовать файл q1563982.qrc в файл q1563982_rc.py
Все картинка в q1563982_rc.py
В модуле 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_())
- Модули q1563982_rc.py и main.py передаете другим пользователям и пускай они их размещают в любую свою папку (только вместе, в ОДИН каталог).
Запускаемpython main.py