[当我尝试运行此代码时,出现错误:
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_())
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)