首页 > 解决方案 > AttributeError:“布尔”对象没有属性“按钮”

问题描述

当我尝试运行此代码时,我得到了错误:

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

在函数中,当我单击鼠标左键时,fillLabel如何从 QLabel 图像中获取位置 x,y (只要未单击鼠标右键来终止位置选择)?我可以使用 QCrusor,但位置值将来自整个 MainWindow,我只想要来自 QLabel 图像的位置。

这里使用的图像是这样的:

原来的

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_())

标签: pythonpython-3.xpyqtpyqt5

解决方案


  • 解决方案是这样的:首先我在类中添加了 x 和 y 变量,并将点击标签的事件 ov 连接到函数选择标签:
        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)

推荐阅读