python - 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_())
解决方案
- 解决方案是这样的:首先我在类中添加了 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)
推荐阅读
- html - 如何优先考虑颜色而不是图像背景
- jsf - p:dataTable 的“rowkey”属性错误
- android - 按钮缩放动画制作背景剪辑
- thymeleaf - Thymeleaf:结合#strings函数
- openstack - 关于用neutron的dhcp分配ip地址
- php - 在 laravel 中使用用户提供的模型名称动态制作模型
- php - 在php上解码base64图像得到空白图像
- c# - 如何将不同的 ViewModel 传递给通用方法?
- symfony - Symfony 4.1 功能测试中的环境变量/隔离环境变量
- javascript - 在反应中使用 dispatchEvent 时不会触发复选框更改事件