AttributeError: объект 'bool' не имеет атрибута 'button' - PullRequest
0 голосов
/ 25 апреля 2020

Когда я пытался запустить этот код, я получил сообщение об ошибке:

AttributeError: 'bool' object has no attribute 'button'

в функции fillLabel как я могу получить позицию x, y из изображение QLabel, когда я щелкаю левой кнопкой мыши (если правая кнопка мыши не нажата , чтобы прекратить выбор позиций)? Я могу использовать QCrusor, но значение позиции будет исходить из всего главного окна, я просто хочу, чтобы позиции исходили из изображения QLabel.

Здесь используется следующее изображение:

original

import sys
import os
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imsave

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QCoreApplication, Qt, QDir
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1009, 577)        
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        #------- Initialization --------------------------
        self.directory = None
        self.label     = None
        self.image     = None
        #------- Seed PB ---------------------------------------       
        font = QtGui.QFont()
        font.setFamily("Rockwell")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)

        self.PB_Seeds_Button = QtWidgets.QPushButton(self.centralwidget)
        self.PB_Seeds_Button.setGeometry(QtCore.QRect(90, 440, 151, 41))        
        self.PB_Seeds_Button.setFont(font)
        self.PB_Seeds_Button.setObjectName("PB_Seeds_Button")
        #------- LB_Image_Frame ---------------------------------------
        self.frame_4 = QtWidgets.QFrame(self.centralwidget)
        self.frame_4.setGeometry(QtCore.QRect(20, 20, 361, 361))
        font = QtGui.QFont()
        font.setFamily("Rockwell")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.frame_4.setFont(font)
        self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_4.setObjectName("frame_4")
        self.frame_4.setAcceptDrops(True)

        self.LB_Image_Orig = QtWidgets.QLabel(self.frame_4)
        self.LB_Image_Orig.setGeometry(QtCore.QRect(20, 20, 361, 361))
        self.LB_Image_Orig.setObjectName("LB_Image_Orig")

        #------- LB_Seg_Frame ---------------------------------------
        self.frame_5 = QtWidgets.QFrame(self.centralwidget)
        self.frame_5.setGeometry(QtCore.QRect(400, 20, 361, 361))
        font = QtGui.QFont()
        font.setFamily("Rockwell")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.frame_5.setFont(font)
        self.frame_5.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_5.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_5.setObjectName("frame_5")

        self.LB_Image_Seg = QtWidgets.QLabel(self.frame_5)
        self.LB_Image_Seg.setGeometry(QtCore.QRect(20, 20, 361, 361))
        self.LB_Image_Seg.setObjectName("LB_Image_Seg")

        #------- LB_Combo_Box ---------------------------------------
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(250, 440, 69, 22))
        font = QtGui.QFont()
        font.setFamily("Rockwell")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.comboBox.setFont(font)
        self.comboBox.setMaxVisibleItems(7)
        self.comboBox.setMaxCount(7)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")

        self.retranslateUi(MainWindow)
        self.comboBox.setCurrentIndex(0)
        MainWindow.setCentralWidget(self.centralwidget)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.PB_Seeds_Button.clicked.connect(self.fillLabel)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Dicom"))

        self.PB_Seeds_Button.setText(_translate("MainWindow", "Label Areas"))

        self.comboBox.setItemText(0, _translate("MainWindow", "0"))
        self.comboBox.setItemText(1, _translate("MainWindow", "1"))
        self.comboBox.setItemText(2, _translate("MainWindow", "2"))
        self.comboBox.setItemText(3, _translate("MainWindow", "3"))
        self.comboBox.setItemText(4, _translate("MainWindow", "4"))
        self.comboBox.setItemText(5, _translate("MainWindow", "5"))
        self.comboBox.setItemText(6, _translate("MainWindow", "6"))

        Image = imread('image.png')    
        self.label = np.zeros_like(Image)

        self.image = QPixmap('image.png').copy()
        self.LB_Image_Orig.setPixmap(self.image)
        self.LB_Image_Orig.adjustSize()
        QApplication.processEvents()
        if os.path.exists("image.png"):
           os.remove("image.png") 
    #-----------------------------------------------------------------------------------------

    def fillLabel(self,event):
        while( event.button() != QtCore.Qt.RightButton)):
            if(event.button() == QtCore.Qt.LeftButton):
                x = event.pos().x()
                y = event.pos().y()

                if(self.label is not None):
                    x = round(self.posx*(self.label.shape[0] / self.LB_Image_Orig.geometry().height()))
                    y = round(self.posy*(self.label.shape[1] / self.LB_Image_Orig.geometry().width()))
                    self.label[x,y] = self.comboBox.currentIndex()
                    if(np.sum(self.label)):
                        self.mask = QPixmap(self.label)
                        self.LB_Image_Seg.setPixmap(self.mask)
                        #self.LB_Image_Seg.resize(pixmap2.width(),pixmap2.height())
                        self.LB_Image_Seg.adjustSize()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    screenShape = QtWidgets.QDesktopWidget().screenGeometry()
    MainWindow.resize(screenShape.width(), screenShape.height())
    MainWindow.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 27 апреля 2020
  • Решение было таким: сначала я добавил переменные x и y в класс и связал событие или щелкнув метку с функцией selectedLabel:
        self.x         = None
        self.y         = None 
        self.LB_Image_Orig.mousePressEvent = self.choseLabel
  • Затем изменили функцию fillLabel на:
    def fillLabel(self,event):
        if(self.label is not None):        
                if(self.x is not None):
                    y = round(self.y*(self.label.shape[1] / self.LB_Image_Orig.geometry().height()))
                    x = round(self.x*(self.label.shape[0] / self.LB_Image_Orig.geometry().width()))
                    print(x,y)
                    self.label[x,y] = self.comboBox.currentIndex()
  • Функция выбора позиции:
    def choseLabel(self,event):
        if(self.image is not None):
            self.x = event.pos().x()
            self.y = event.pos().y()
            self.fillLabel(event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...