Почему на кнопке 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 шт):

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

Вы запускаете программу из другого каталога. Зайдите в каталог где лежать изображения и запустите модуль от туда.

я вам очень советую запускать программы из терминала/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_())
→ Ссылка
Автор решения: gil9red

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

Решением может быть указание полного пути к картинкам относительно текущей папки файла.

Берем специальную функцию:

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)
→ Ссылка