Как поставить условия на кнопки в PyQt5? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь наложить условия на кнопки, (кнопка обзора) будет просматривать изображение и (кнопка обрезки) будет обрезать это конкретное изображение. Просмотр выполнен хорошо, но я не знаю, как передать тот же файл изображения кнопке обрезки,Буду признателен, если кто-нибудь поможет мне в этом случае

from PyQt5 import QtGui,QtWidgets,QtCore,uic
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QMessageBox,QStatusBar
    from PyQt5.QtCore import QCoreApplication
    import sys
    import cv2
    fileName=0
    class Window(QtWidgets.QMainWindow):
        def __init__(self):
            super(Window,self).__init__()
            uic.loadUi('Welcome1.ui',self)
            self.title="Gender_Identifier"

            self.setWindowIcon(QtGui.QIcon("main-logo.png"))
            self.browse_button.clicked.connect(self.setimage)
            self.roi_button.clicked.connect(self.crop)

            button1=QPushButton("close",self)
            button1.clicked.connect(self.close)

            button2=QPushButton("file",self)
            button2.move(200,200)
            fileName=button2.clicked.connect(self.file)
            print(fileName)
            button3=QPushButton("set",self)
            button3.move(400,400)
            button3.clicked.connect(self.setimage)

            button4=QPushButton("set",self)
            button4.clicked.connect(self.crop)
            self.InitWindow()

            #IMAGE=self.set_image()
        def InitWindow(self):

            self.statusBar().showMessage("This is a simple status bar")
            self.setWindowTitle(self.title)

        def file(self):

            fileName ,_ =QtWidgets.QFileDialog.getOpenFileName(None,"Select Image", "D:\python_data\interface","Image Files (*.png *.jpg)")
            return fileName
        def setimage(fileName):
           # fileName ,_ =QtWidgets.QFileDialog.getOpenFileName(None,"Select Image", "D:\python_data\interface\images\preprocessed","Image Files (*.png *.jpg)")
            if fileName:
                #pixmap object
                pixmap=QtGui.QPixmap(fileName)
                #seting image inside that pixmap
                pixmap=pixmap.scaled(fileName.browse_label.width(),fileName.browse_label.height(),QtCore.Qt.KeepAspectRatio)
                fileName.browse_label.setPixmap(pixmap)
                fileName.browse_label.setAlignment(QtCore.Qt.AlignCenter)
                #return fileName

        def crop(fileName):
           # image=self.photo.getPixmap(QtGui.QPixmap(self.browse_label))
            img=cv2.imread(fileName,0)
            height,width=img.shape[:2]
            start_row,strt_col=int(height*.40),int(width*.15)
            end_row,end_col=int(height*.60),int(width*.90)
            croped=img[start_row:end_row,strt_col:end_col]
            pixmap=QtGui.QPixmap(croped)
            #cv2.imshow("img",croped)
            pixmap=pixmap.scaled(croped.browse_label.width(),croped.browse_label.height(),QtCore.Qt.KeepAspectRatio)
            croped.browse_label.setPixmap(pixmap)
            croped.browse_label.setAlignment(QtCore.Qt.AlignCenter)

            #cv2.waitKey(0)
            #cv2.destroyAllWindows()

    if __name__=='__main__':

        App=QtWidgets.QApplication(sys.argv)
        window=Window()
        window.show()
        sys.exit(App.exec_())

Я был бы очень благодарен за это. Я искал, как мог, но не нашел удовлетворительного решения

1 Ответ

2 голосов
/ 08 октября 2019

Есть несколько проблем с вашим кодом. Прежде всего, поскольку setimage и crop являются методами экземпляра, их первым параметром должен быть сам экземпляр класса, т.е. они должны быть определены как def setimage(self, filename) и def crop(self, filename).

Во-вторых, единственным параметром, передаваемым сигналом QPushButton.clicked, является атрибут QPushButton.checked, поэтому при подключении self.setimage к self.browse_button self.setimage будет фактически называться self.setimage(self.browse_button.checked()), чтонаверное не то что ты. Обходной путь - вместо предоставления filename в качестве аргумента self.setimage, чтобы сохранить его как переменную экземпляра, например,

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        ...
        self.fileName = ''
        ...
        self.self.browse_button.clicked.connect(self.setimage)

    def setimage(self):
         if self.fileName:
            #pixmap object
            pixmap=QtGui.QPixmap(self.fileName)
            #seting image inside that pixmap
            pixmap=pixmap.scaled(self.browse_label.width(), 
                                 self.browse_label.height(), 
                                 QtCore.Qt.KeepAspectRatio)
            self.browse_label.setPixmap(pixmap)
            self.browse_label.setAlignment(QtCore.Qt.AlignCenter)

Чтобы задать имя файла, Window.file станет чем-то вроде

def file(self):
    fileName ,_ = QtWidgets.QFileDialog.getOpenFileName(None,"Select Image", "D:\python_data\interface","Image Files (*.png *.jpg)")
    if fileName:
        self.fileName = fileName

self.crop будет похоже на self.setimage, т.е. вам нужно будет использовать self.fileName вместо предоставления fileName в качестве входного параметра. Кроме того, QPixmap не может иметь дело с массивными массивами напрямую AFAIK, поэтому вам нужно сначала создать QImage, прежде чем создавать QPixmap, например

def crop(self):
    if self.fileName:
        img = cv2.imread(self.fileName, 0)
        height, width = img.shape[:2]
        start_row, strt_col = int(height * .40), int(width * .15)
        end_row, end_col = int(height * .60), int(width * .90)
        croped = img[start_row:end_row, strt_col:end_col].copy()
        image = QtGui.QImage(croped, croped.shape[1], croped.shape[0], QtGui.QImage.Format_Indexed8)
        pixmap = QtGui.QPixmap(image)
        pixmap = pixmap.scaled(self.browse_label.width(), self.browse_label.height(), QtCore.Qt.KeepAspectRatio)
        self.browse_label.setPixmap(pixmap)
        self.browse_label.setAlignment(QtCore.Qt.AlignCenter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...