简体   繁体   中英

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

When I tried to run this code I had got the Error:

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

in the function fillLabel how can I get the position x,y from the QLabel image when I click the left mouse button (as long as right mouse button isn't clicked to terminate the positions selection)? I can use QCrusor, but the position value will come from the whole MainWindow, I just want the positions coming from QLabel image.

The image used here is this:

原来的

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_())
  • The solution was like this: first I added x, and y variables to the class, and connected the event ov clicking on the label to the function choseLabel:
        self.x         = None
        self.y         = None 
        self.LB_Image_Orig.mousePressEvent = self.choseLabel
  • Then changed the function fillLabel to be:
    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()
  • The position selection function:
    def choseLabel(self,event):
        if(self.image is not None):
            self.x = event.pos().x()
            self.y = event.pos().y()
            self.fillLabel(event)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM