TypeError: 'list' object is not callable os pyqt5

Рейтинг: 0Ответов: 1Опубликовано: 01.02.2023

Не понимаю почему выдает ошибку TypeError

from PyQt5.QtWidgets import QApplication 
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import os 


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.cur_dir = ''
        self.resize(1000, 700)
        self.setWindowTitle('Easy Editor')

        self.image = QLabel('Картинка', self)

        self.left = QPushButton('Лево', self)
        self.right = QPushButton('Право', self)
        self.zerkalo = QPushButton('Зеркало', self)
        self.rezkost = QPushButton('Резкость', self)
        self.ch_b = QPushButton('Ч/б', self)
        self.papka = QPushButton('Папка', self)

        self.listwidget = QListWidget(self)

        self.listwidget.setGeometry(50, 80, 150, 600)

        self.image.setGeometry(250, 250, 100, 50)

        self.papka.setGeometry(50, 30, 150, 30)
        self.left.setGeometry(250, 600, 100, 30)
        self.right.setGeometry(400, 600, 100, 30)
        self.zerkalo.setGeometry(550, 600, 100, 30)
        self.rezkost.setGeometry(700, 600, 100, 30)
        self.ch_b.setGeometry(850, 600, 100, 30)
        self.papka.clicked.connect(self.showFilenameList)

        self.listwidget.itemClicked.connect(self.showImage)
        self.workdir = ''

    def showFilenameList(self):
        self.workdir = QFileDialog.getExistingDirectory()
        extensions1 = ['.jpg','.jpeg','.png','.gif','.bmp']
        filenames = filter(os.listdir(self.workdir),extensions1)
        self.listwidget.clear()
        for filename in filenames:
            self.listwidget.addItem(filename)
    def filter(self, files, extensions1):
        result = []
        for filename in files:
            for ext in extensions1:
                if filename.endswith(ext):
                    result.append(filename)
        return result
    def showImage(self,path):
        self.image.hide()
        pixmapimage = QPixmap(path)
        width,height = lb_image.width(),lb_image.height()
        pixmapimage = pixmapimage.scaled(w,h,Qt.KeepAspectRatio)
        self.image.setPixmap(pixmapimage)
        self.image.show()

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

Ответы

▲ 0Принят
    def showFilenameList(self):
        ...
        filenames = filter(os.listdir(self.workdir),extensions1)
                    ^^^^^^ встроенная функция питона
        ...

    def filter(self, files, extensions1):
        ^^^^^^ метод экземпляра вашего класса
        ...

Вы, видимо, ожидаете, что вызовется метод экземпляра вашего класса filter, но в данном коде вызывается встроенная функция питона filter, сигнатура которой выглядит так:

filter(function, iterable)

Таким образом, этот filter получает на вход первым аргументом список вместо функции и у него не получается вызвать этот список как функцию. Вызвать ваш метод экземпляра класса можно явно указав, что это метод экземпляра класса с помощью self:

    def showFilenameList(self):
        ...
        filenames = self.filter(os.listdir(self.workdir),extensions1)
                    ^^^^^^^^^^^ теперь вызывается метод экземпляра вашего класса
        ...