我有一个python代码,在图像上绘制一个圆圈。我想用滑块的输入来更新圆的位置。移动滑块将圆移动到对角线位置。
第一次调用代码时会画圆圈。但是在更新滑块位置时不会更新圆。
控制台打印输出:
QPainter::begin: Painter already active
实例化QPainter对象时。不知道这是否是问题的原因。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPainter, QFont, QColor, QPixmap, QPen, QBrush
from PyQt5.QtCore import Qt, QRect, QPoint
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from DUI import Ui_MainWindow
class BubbleCalc():
def __init__(self,xpos,ypos,travel):
super().__init__()
self.zx = xpos
self.zy = ypos
self.travel = travel
def CalcBubblePosition(self,Tilt):
import math
vector = math.sqrt(Tilt[0]*Tilt[0]+Tilt[1]*Tilt[1])
try:
angle = math.atan(Tilt[1]/Tilt[0])
except:
#deivide by zero
if(Tilt[1] <0):
angle = -90
else:
angle = 90
print(f"Vector Length: {vector}")
#setup the different zoom color
if(vector > 30):
#limit the maximum angle
Tilt[0] = 30 * math.cos(angle)
Tilt[1] = 30 * math.sin(angle)
Color = (255,43,0,255)
#print(f"limit maximum range vector = {vector}Angle{angle},xpos={xp},ypos={yp}")
elif vector>10:
Color = (255,69,0,127)
elif vector >5:
Color = (153,153,0,127)
else:
Color = (21,171,0,127)
xpos = Tilt[0] *self.travel/30 + self.zx
ypos = Tilt[1] *self.travel/30 + self.zy
return xpos,ypos,Color
class DUI(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.xpos =30
self.ypos =30
self.bubble_size = 200
self.calc_bubble = BubbleCalc(431,431,100)
self.sldBubble.valueChanged.connect(self.UpdateBubble)
self.sldBubble.setValue(30)
def UpdateBubble(self):
self.xpos = self.sldBubble.value()
self.ypos = self.sldBubble.value()
self.update()
def paintEvent(self, event):
qp = QPainter(self.lblbubble.pixmap())
qp.begin(self)
self.drawBubble(qp,[self.xpos,self.ypos])
print("paint Event")
qp.end()
def drawBubble(self, qp,Tilt):
xpos,ypos,color = self.calc_bubble.CalcBubblePosition(Tilt)
print(f"Position :{xpos},{ypos} Color :{color}")
pen = QPen(Qt.white)
pen.setWidth(3)
brush = QBrush()
qp.setBrush(brush)
qp.setPen(pen)
brush.setColor(QColor(*color))
brush.setStyle(Qt.SolidPattern)
qp.setBrush(brush)
qp.drawEllipse(xpos,ypos, self.bubble_size, self.bubble_size)
def main():
app = QtWidgets.QApplication(sys.argv)
D = DUI()
D.showFullScreen()
D.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
此文件是使用QT创建者生成的UI文件通过pyuic5命令创建的。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Digirod.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(800, 480)
MainWindow.setWindowTitle("DigirRod")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lblMain = QtWidgets.QLabel(self.centralwidget)
self.lblMain.setGeometry(QtCore.QRect(0, 0, 681, 481))
self.lblMain.setText("")
self.lblMain.setPixmap(QtGui.QPixmap("BM.jpg"))
self.lblMain.setScaledContents(True)
self.lblMain.setObjectName("lblMain")
self.ButtonSim = QtWidgets.QPushButton(self.centralwidget)
self.ButtonSim.setGeometry(QtCore.QRect(690, 80, 101, 41))
self.ButtonSim.setObjectName("ButtonSim")
self.ButtonDRO = QtWidgets.QPushButton(self.centralwidget)
self.ButtonDRO.setGeometry(QtCore.QRect(690, 130, 101, 41))
self.ButtonDRO.setObjectName("ButtonDRO")
self.ButtonTilt = QtWidgets.QPushButton(self.centralwidget)
self.ButtonTilt.setGeometry(QtCore.QRect(690, 180, 101, 41))
self.ButtonTilt.setObjectName("ButtonTilt")
self.ButtonEDM = QtWidgets.QPushButton(self.centralwidget)
self.ButtonEDM.setGeometry(QtCore.QRect(690, 230, 101, 41))
self.ButtonEDM.setObjectName("ButtonEDM")
self.ButtonBM = QtWidgets.QPushButton(self.centralwidget)
self.ButtonBM.setGeometry(QtCore.QRect(740, 310, 51, 41))
self.ButtonBM.setStyleSheet("background-color:red;\n"
"color:white;\n"
"border-style:outset;\n"
"border-width:2px;\n"
"border-radius:10px;\n"
"border-color:black;\n"
"")
self.ButtonBM.setCheckable(False)
self.ButtonBM.setAutoRepeat(False)
self.ButtonBM.setObjectName("ButtonBM")
self.ButtonPT = QtWidgets.QPushButton(self.centralwidget)
self.ButtonPT.setGeometry(QtCore.QRect(740, 380, 51, 41))
self.ButtonPT.setStyleSheet("background-color:black;\n"
"color:white;\n"
"border-style:outset;\n"
"border-width:2px;\n"
"border-radius:10px;\n"
"border-color:black;\n"
"")
self.ButtonPT.setCheckable(False)
self.ButtonPT.setAutoRepeat(False)
self.ButtonPT.setObjectName("ButtonPT")
self.lblPointImage = QtWidgets.QLabel(self.centralwidget)
self.lblPointImage.setGeometry(QtCore.QRect(700, 380, 31, 81))
self.lblPointImage.setText("")
self.lblPointImage.setPixmap(QtGui.QPixmap("PT_icon.bmp"))
self.lblPointImage.setScaledContents(True)
self.lblPointImage.setObjectName("lblPointImage")
self.lblDGR = QtWidgets.QLabel(self.centralwidget)
self.lblDGR.setGeometry(QtCore.QRect(260, 60, 121, 31))
font = QtGui.QFont()
font.setPointSize(24)
self.lblDGR.setFont(font)
self.lblDGR.setStyleSheet("color:red;\n"
"border-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));")
self.lblDGR.setObjectName("lblDGR")
self.lblBM = QtWidgets.QLabel(self.centralwidget)
self.lblBM.setGeometry(QtCore.QRect(240, 330, 61, 20))
self.lblBM.setText("")
self.lblBM.setObjectName("lblBM")
self.lblTiltValue = QtWidgets.QLabel(self.centralwidget)
self.lblTiltValue.setGeometry(QtCore.QRect(290, 280, 131, 21))
font = QtGui.QFont()
font.setPointSize(20)
self.lblTiltValue.setFont(font)
self.lblTiltValue.setObjectName("lblTiltValue")
self.lblBMImage = QtWidgets.QLabel(self.centralwidget)
self.lblBMImage.setGeometry(QtCore.QRect(690, 310, 41, 41))
self.lblBMImage.setText("")
self.lblBMImage.setPixmap(QtGui.QPixmap("BM_icon.bmp"))
self.lblBMImage.setScaledContents(True)
self.lblBMImage.setObjectName("lblBMImage")
self.btnConnectBT = QtWidgets.QPushButton(self.centralwidget)
self.btnConnectBT.setGeometry(QtCore.QRect(690, 30, 101, 41))
self.btnConnectBT.setObjectName("btnConnectBT")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(260, 40, 121, 21))
font = QtGui.QFont()
font.setPointSize(14)
self.label.setFont(font)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(330, 250, 31, 21))
font = QtGui.QFont()
font.setPointSize(14)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.lblEDM = QtWidgets.QLabel(self.centralwidget)
self.lblEDM.setGeometry(QtCore.QRect(360, 130, 111, 31))
font = QtGui.QFont()
font.setPointSize(24)
self.lblEDM.setFont(font)
self.lblEDM.setObjectName("lblEDM")
self.lblbubble = QtWidgets.QLabel(self.centralwidget)
self.lblbubble.setGeometry(QtCore.QRect(250, 310, 151, 151))
self.lblbubble.setText("")
self.lblbubble.setPixmap(QtGui.QPixmap("circuilarvial.jpeg"))
self.lblbubble.setScaledContents(True)
self.lblbubble.setObjectName("lblbubble")
self.sldBubble = QtWidgets.QSlider(self.centralwidget)
self.sldBubble.setGeometry(QtCore.QRect(60, 410, 160, 22))
self.sldBubble.setMaximum(30)
self.sldBubble.setOrientation(QtCore.Qt.Horizontal)
self.sldBubble.setObjectName("sldBubble")
MainWindow.setCentralWidget(self.centralwidget)
self.actionProject = QtWidgets.QAction(MainWindow)
self.actionProject.setObjectName("actionProject")
self.actionFile = QtWidgets.QAction(MainWindow)
self.actionFile.setObjectName("actionFile")
self.actionsave = QtWidgets.QAction(MainWindow)
self.actionsave.setObjectName("actionsave")
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
self.ButtonSim.setText(_translate("MainWindow", "DGR Sim"))
self.ButtonDRO.setText(_translate("MainWindow", "Stream DRO"))
self.ButtonTilt.setText(_translate("MainWindow", "Stream Tilt"))
self.ButtonEDM.setText(_translate("MainWindow", "Stream EDM"))
self.ButtonBM.setText(_translate("MainWindow", "BM"))
self.ButtonPT.setText(_translate("MainWindow", "Point"))
self.lblDGR.setText(_translate("MainWindow", "00.000"))
self.lblTiltValue.setText(_translate("MainWindow", "0.00,0.00"))
self.btnConnectBT.setText(_translate("MainWindow", "Connect BT"))
self.label.setText(_translate("MainWindow", "DGR Reading:"))
self.label_2.setText(_translate("MainWindow", "Tilt"))
self.lblEDM.setText(_translate("MainWindow", "00.000"))
self.actionProject.setText(_translate("MainWindow", "Project"))
self.actionFile.setText(_translate("MainWindow", "File"))
self.actionsave.setText(_translate("MainWindow", "save"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())