Почему не отображается иконка?
Подскажите пожалуйста вот у меня есть проект:
Когда я запускаю модуль registration_window открывается окно с кнопкой, когда я нажимаю на кнопку открывается окно модуля main_window, но почему то не отображается иконка user.png, хотя если отдельно запустить окно модуля main_window, то иконка отображается нормально.
У меня большая программа будет в которой пользователь проходит регистрацию и открывается главное окно программы, я хочу чтобы иконка отображалась, как это можно сделать.
user.png:
registration_window.py
from PyQt5.QtWidgets import (QWidget, QPushButton, QVBoxLayout, QApplication)
from main_window import CentralWidget
import sys
class RegistrationWindow(QWidget):
def __init__(self, parent=None):
super(RegistrationWindow, self).__init__(parent)
self.resize(300, 300)
self.setWindowTitle("")
self.setObjectName('registration_window')
self.setStyleSheet('''#registration_window {
background-color: #4dffff;
}''')
self.main_window_app = CentralWidget()
self.btn = QPushButton('Открыть')
self.btn.clicked.connect(self.save_input_user_kbju)
layout = QVBoxLayout()
layout.setContentsMargins(30, 30, 30, 30)
layout.addWidget(self.btn)
self.setLayout(layout)
def save_input_user_kbju(self):
self.close()
self.main_window_app.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = RegistrationWindow()
win.show()
sys.exit(app.exec_())
main_window.py
from PyQt5.QtWidgets import (QWidget, QApplication, QFrame, QVBoxLayout, QLabel, QHBoxLayout)
from PyQt5.QtGui import QPixmap, QImage
import sys
class CentralWidget(QWidget):
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)
self.resize(300, 300)
self.setWindowTitle('КБЖУ')
self.setStyleSheet('background-color: #ffffff;')
self.frame_name = QFrame()
self.frame_name.setFrameStyle(QFrame.Box)
self.frame_name.setStyleSheet('''QFrame {
border: 0px;
background-color: #9EFFFF;
}''')
self.icon_user = QLabel()
self.icon_user.setPixmap(QPixmap.fromImage(QImage('icon_app/user.png')))
self.label_name = QLabel('Имя')
self.label_name.setStyleSheet('''QLabel {
color: #4f4a4a;
font-size: 20px;
}''')
# Верхнее меню и имя
self.name_layout = QHBoxLayout()
self.name_layout.setSpacing(10)
self.name_layout.addWidget(self.icon_user)
self.name_layout.addWidget(self.label_name)
self.name_layout.addStretch(1)
self.frame_name.setLayout(self.name_layout)
# Главная форма
self.layout_main_menu = QVBoxLayout()
self.layout_main_menu.setContentsMargins(0, 0, 0, 30)
self.layout_main_menu.addWidget(self.frame_name, stretch=2)
self.layout_main_menu.addStretch(1)
self.setLayout(self.layout_main_menu)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = CentralWidget()
win.show()
sys.exit(app.exec_())
Ответы (1 шт):
Попробуйте, так.
Обратите внимание, что запускать (откуда угодно) будем модуль q1388871_main_window.py:
C:\> python D:\_Qt\__Qt\q1388871_main_window.py
Проект у меня находится D:\_Qt\__Qt, изображения D:\_Qt\__Qt\icon_app
q1388871_main_window.py
import sys
import os
from PyQt5.QtWidgets import (QWidget, QApplication, QFrame,
QVBoxLayout, QLabel, QHBoxLayout)
from PyQt5.QtGui import QPixmap, QImage
from q1388871_registration_window import RegistrationWindow # +++
dir_path = os.path.dirname(os.path.abspath(__file__)) # !!! +++
directory = os.path.join(dir_path, 'icon_app') # !!! +++
print(f'\n{dir_path} \n{directory}')
class CentralWidget(QWidget):
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)
self.resize(300, 300)
self.setWindowTitle('КБЖУ')
self.setStyleSheet('background-color: #ffffff;')
self.frame_name = QFrame()
self.frame_name.setFrameStyle(QFrame.Box)
self.frame_name.setStyleSheet('''QFrame {
border: 0px;
background-color: #9EFFFF;
}''')
self.icon_user = QLabel()
# self.icon_user.setPixmap(QPixmap.fromImage(QImage('icon_app/user.png')))
self.icon_user.setPixmap(QPixmap.fromImage(QImage(f'{directory}/user.png'))) # +++
# +++ --> ^^^^^^^^^^^^^
self.label_name = QLabel('Имя')
self.label_name.setStyleSheet('''QLabel {
color: #4f4a4a;
font-size: 20px;
}''')
# Верхнее меню и имя
self.name_layout = QHBoxLayout()
self.name_layout.setSpacing(10)
self.name_layout.addWidget(self.icon_user)
self.name_layout.addWidget(self.label_name)
self.name_layout.addStretch(1)
self.frame_name.setLayout(self.name_layout)
# Главная форма
self.layout_main_menu = QVBoxLayout()
self.layout_main_menu.setContentsMargins(0, 0, 0, 30)
self.layout_main_menu.addWidget(self.frame_name, stretch=2)
self.layout_main_menu.addStretch(1)
self.setLayout(self.layout_main_menu)
self.registrationWindow = RegistrationWindow(self) # !!! +++
self.registrationWindow.show() # !!! +++
if __name__ == '__main__':
app = QApplication(sys.argv)
win = CentralWidget()
# win.show() # !!! ---
sys.exit(app.exec_())
q1388871_registration_window.py
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QVBoxLayout, QApplication)
# - from q1388871_main_window import CentralWidget
class RegistrationWindow(QWidget):
# def __init__(self, parent=None):
# super(RegistrationWindow, self).__init__(parent)
def __init__(self, parent): # +++
super().__init__() # +++
self.parent = parent # +++
self.resize(300, 300)
self.setWindowTitle("")
self.setObjectName('registration_window')
self.setStyleSheet('''#registration_window {
background-color: #4dffff;
}''')
#- self.main_window_app = CentralWidget()
self.btn = QPushButton('Открыть')
self.btn.clicked.connect(self.save_input_user_kbju)
layout = QVBoxLayout()
layout.setContentsMargins(30, 30, 30, 30)
layout.addWidget(self.btn)
self.setLayout(layout)
def save_input_user_kbju(self):
self.close()
#- self.main_window_app.show()
self.parent.show() # +++
if __name__ == '__main__':
app = QApplication(sys.argv)
win = RegistrationWindow()
win.show()
sys.exit(app.exec_())
Я понимаю, то что если я в один пакет положу все модули то все работает, но мне нужно чтобы работала так как у меня пакеты сделаны в проекте, и у меня запускается первым регистрация а потом главное окно, а вы просто все поняли местами и в один пакет положили, но у меня в настоящей программе будут десятки модулей в разных пакетах
Вы не поняли мой посыл. Да, я не разместил модули как у вас в проекте, но я предполагал, что вы это сделаете самостоятельно. Теперь я разместил все как у вас. Я изменил только одну строчку:
q1388871_main_window.py
import sys
import os
from PyQt5.QtWidgets import (QWidget, QApplication, QFrame,
QVBoxLayout, QLabel, QHBoxLayout)
from PyQt5.QtGui import QPixmap, QImage
from authentication_window.q1388871_registration_window import RegistrationWindow # +++
#--> ^^^^^^^^^^^^^^^^^^^^^^
dir_path = os.path.dirname(os.path.abspath(__file__)) # !!! +++
directory = os.path.join(dir_path, 'icon_app') # !!! +++
print(f'\n{dir_path} \n{directory}')
class CentralWidget(QWidget):
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)
self.setWindowTitle("main_window.py")
self.resize(300, 300)
self.setWindowTitle('КБЖУ')
self.setStyleSheet('background-color: #ffffff;')
self.frame_name = QFrame()
self.frame_name.setFrameStyle(QFrame.Box)
self.frame_name.setStyleSheet('''QFrame {
border: 0px;
background-color: #9EFFFF;
}''')
self.icon_user = QLabel()
# self.icon_user.setPixmap(QPixmap.fromImage(QImage('icon_app/user.png')))
self.icon_user.setPixmap(QPixmap.fromImage(QImage(f'{directory}/user.png'))) # +++
# +++ --> ^^^^^^^^^^^^^
self.label_name = QLabel('Имя')
self.label_name.setStyleSheet('''QLabel {
color: #4f4a4a;
font-size: 20px;
}''')
# Верхнее меню и имя
self.name_layout = QHBoxLayout()
self.name_layout.setSpacing(10)
self.name_layout.addWidget(self.icon_user)
self.name_layout.addWidget(self.label_name)
self.name_layout.addStretch(1)
self.frame_name.setLayout(self.name_layout)
# Главная форма
self.layout_main_menu = QVBoxLayout()
self.layout_main_menu.setContentsMargins(0, 0, 0, 30)
self.layout_main_menu.addWidget(self.frame_name, stretch=2)
self.layout_main_menu.addStretch(1)
self.setLayout(self.layout_main_menu)
self.registrationWindow = RegistrationWindow(self) # !!! +++
self.registrationWindow.show() # !!! +++
if __name__ == '__main__':
app = QApplication(sys.argv)
win = CentralWidget()
# win.show() # !!! ---
sys.exit(app.exec_())
Обратите внимание, что запускать (откуда угодно) будем модуль q1388871_main_window.py




