Почему на кнопке PyQt5 не появляется заданное изображение?(Python 3)
У меня есть список, в котором хранятся изображения, которые я хочу разместить на кнопках.
Когда пытаюсь прикрепить эти изображения к кнопкам, кнопки остаются пустыми. Картинки с такими названиями есть и расположены в папке с кодом.
Пожалуйста, подскажите, что я делаю неправильно?
from PyQt5 import QtCore, QtWidgets, QtGui
list1 = ['picture1.png', 'picture2.png']
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.button = QtWidgets.QPushButton("Button")
self.box1 = QtWidgets.QVBoxLayout()
self.box1.addWidget(self.button)
self.setLayout(self.box1)
self.pictures()
def pictures(self):
self.box2 = QtWidgets.QHBoxLayout()
for picture in list1:
self.button_picture = QtWidgets.QPushButton(self)
self.button_picture.setIcon(QtGui.QIcon(picture))
self.button_picture.setIconSize(QtCore.QSize(100, 100))
self.box2.addWidget(self.button_picture)
self.box1.addLayout(self.box2)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
Ответы (2 шт):
Вы запускаете программу из другого каталога. Зайдите в каталог где лежать изображения и запустите модуль от туда.
я вам очень советую запускать программы из терминала/CMD и еще уберите self из названия переменной self.button_picture
чтобы убедиться откуда вы запускаете программу добавьте в самом начале модуля
import os
print(os.getcwd())
import os
print(os.getcwd())
from PyQt5 import QtCore, QtWidgets, QtGui
list1 = ['im.png', 'Ok.png']
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.button = QtWidgets.QPushButton("Button")
self.box1 = QtWidgets.QVBoxLayout()
self.box1.addWidget(self.button)
self.setLayout(self.box1)
self.pictures()
def pictures(self):
self.box2 = QtWidgets.QHBoxLayout()
for picture in list1:
button_picture = QtWidgets.QPushButton(self)
button_picture.setIcon(QtGui.QIcon(picture))
button_picture.setIconSize(QtCore.QSize(100, 100))
self.box2.addWidget(button_picture)
self.box1.addLayout(self.box2)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
Как уже вам написали, проблема в относительном пути к картинкам и т.к. активная директория у вас была другая, то и картинки не нашлись.
Решением может быть указание полного пути к картинкам относительно текущей папки файла.
Берем специальную функцию:
import inspect
import os
import sys
def get_current_script_dir(follow_symlinks=True, normcase=False) -> str:
# py2exe, PyInstaller, cx_Freeze
if getattr(sys, 'frozen', False):
path = os.path.abspath(sys.executable)
else:
# Analog inspect.getabsfile without os.path.normcase
path = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.abspath(path)
if follow_symlinks:
path = os.path.realpath(path)
if normcase:
path = os.path.normcase(path)
return os.path.dirname(path)
И используем ее так, чтобы получить полный путь к картинкам:
DIR = get_current_script_dir()
list1 = [DIR + '/picture1.png', DIR + '/picture2.png']
# Проверьте пути
print(list1)


