簡體   English   中英

AttributeError: 'bool' object 沒有屬性 'button'

[英]AttributeError: 'bool' object has no attribute 'button'

當我嘗試運行此代碼時,我得到了錯誤:

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

在 function fillLabel,當我單擊鼠標左鍵時,如何從 QLabel 圖像中獲取 position x,y (只要未單擊鼠標右鍵以終止位置選擇)? 我可以使用 QCrusor,但 position 值將來自整個 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_())
  • 解決方案是這樣的:首先我在 class 中添加了 x 和 y 變量,並將點擊 label 的事件連接到 function 選擇標簽:
        self.x         = None
        self.y         = None 
        self.LB_Image_Orig.mousePressEvent = self.choseLabel
  • 然后將 function 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()
  • position選擇function:
    def choseLabel(self,event):
        if(self.image is not None):
            self.x = event.pos().x()
            self.y = event.pos().y()
            self.fillLabel(event)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM