def __build_lcd_number_widget(self): """Build a LCD Number widget.""" lcdnumber = QLCDNumber(self) lcdnumber.setSegmentStyle(QLCDNumber.Filled) lcdnumber.setFixedHeight(40) lcdnumber.setFrameStyle(QFrame.NoFrame) return lcdnumber
def makeLCD(self,s): lcd = QLCDNumber() lcd.setSegmentStyle(2) lcd.setFrameStyle(QFrame.Plain) lcd.setSmallDecimalPoint(False) lcd.setStyleSheet("QLCDNumber { color: %s; background-color: %s;}"%(self.aw.lcdpaletteF[s],self.aw.lcdpaletteB[s])) return lcd
class CountDownWidget(QWidget): def __init__(self, parent=None): # コンストラクタ QWidget.__init__(self, parent=parent) self.interval = 10 self.setup_ui() def setup_ui(self): self.setAutoFillBackground(True) p = self.palette() p.setColor(self.backgroundRole(), QtCore.Qt.white) self.setPalette(p) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.timer = QtCore.QTimer(parent=self) self.timer.setInterval(self.interval) self.timer.timeout.connect(self.do_countdown) self.lcd_number = QLCDNumber(parent=self) self.lcd_number.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.lcd_number.setFrameStyle(QFrame.NoFrame) self.lcd_number.setSegmentStyle(QLCDNumber.Flat) self.lcd_number.setDigitCount(6) layout = QVBoxLayout() layout.addWidget(self.lcd_number) self.setLayout(layout) self.reset_count() def update_display(self): self.lcd_number.display("%6.2f" % (self.count / 100)) self.lcd_number.update() def do_countdown(self): self.count -= 1 self.update_display() if self.count <= 0: self.stop_countdown() def start_countdown(self): if self.count > 0: self.timer.start() def stop_countdown(self): self.timer.stop() def reset_count(self): self.count = 18000 self.update_display()
class CountDownWidget(QWidget): ''' classdocs ''' def __init__(self, parent=None): ''' Constructor ''' QWidget.__init__(self, parent=parent) self.interval = 10 self.setup_ui() ''' 実際の初期化関数 ''' def setup_ui(self): self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.timer = QTimer(parent=self) self.timer.setInterval(self.interval) self.timer.timeout.connect(self.do_countdown) self.lcd_number = QLCDNumber(parent=self) self.lcd_number.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.lcd_number.setFrameStyle(QFrame.NoFrame) self.lcd_number.setSegmentStyle(QLCDNumber.Flat) self.lcd_number.setDigitCount(6) layout = QVBoxLayout() layout.addWidget(self.lcd_number) self.setLayout(layout) self.reset_count() def update_display(self): self.lcd_number.display("%6.2f" % (self.count / 100)) self.lcd_number.update() def do_countdown(self): self.count -= 1 self.update_display() if self.count <= 0: self.stopcountdown() def start_countdown(self): if self.count > 0: self.timer.start() def stop_countdown(self): self.timer.stop() def reset_count(self): self.count = 18000 self.update_display()
class Timer: initsec = 30 gosec = 10 def __init__(self, maingo, layout, turn): self.lcd = QLCDNumber() self.sec = self.initsec self.turn = turn self.updui() self.lcd.setFrameStyle(QFrame.NoFrame) self.maingo = maingo self.timer = QTimer(self.maingo.goui) self.timer.timeout.connect(self.count_time) self.timer.start(1000) layout.addWidget(self.lcd) def get_stime(self, seconds): min = seconds // 60 sec = seconds % 60 return '{:0>2}'.format(min) + ':' + '{:0>2}'.format(sec) def updui(self): self.lcd.display(self.get_stime(self.sec)) def count_time(self): if not self.turn: return self.sec -= 1 self.updui() #hack if self.sec == 0 and self.maingo.protor.step == self.turn: self.maingo.protor.surrender() self.timer.stop() def go(self): self.turn = not self.turn if self.turn: self.sec += self.gosec
class MainWindow(QWidget): def __init__(self, ser, sio): super().__init__() # Setup the colour palette palette = self.palette() palette.setColor(QPalette.Window, QColor(40, 40, 40)) palette.setColor(QPalette.WindowText, QColor(230, 230, 230)) palette.setColor(QPalette.Base, QColor(252, 252, 252)) palette.setColor(QPalette.AlternateBase, QColor(239, 240, 241)) palette.setColor(QPalette.ToolTipBase, QColor(239, 240, 241)) palette.setColor(QPalette.ToolTipText, QColor(49, 54, 59)) palette.setColor(QPalette.Text, QColor(0, 0, 0)) palette.setColor(QPalette.Button, QColor(85, 90, 95)) palette.setColor(QPalette.ButtonText, QColor(50, 50, 50)) palette.setColor(QPalette.BrightText, QColor(255, 255, 255)) palette.setColor(QPalette.Link, QColor(41, 128, 185)) palette.setColor(QPalette.Highlight, QColor(136, 136, 136)) palette.setColor(QPalette.HighlightedText, QColor(239, 240, 241)) palette.setColor(QPalette.Disabled, QPalette.Light, Qt.white) palette.setColor(QPalette.Disabled, QPalette.Shadow, QColor(234, 234, 234)) self.setPalette(palette) self.ser = ser self.sio = sio self.start = 1 self.maxforce = 0000.00 self.oldforce = 0.0 self.force = 0.0 self.initUI() def initUI(self): self.grid = QGridLayout() self.teams = {} self.currentteam = [QListWidgetItem_Team()] self.chartView = QChartView() self.loadNewGraph = True # LCD Widget to display the force self.forcelcd = QLCDNumber(7, self) self.forcelcd.setStyleSheet( "color: rgb(0, 210, 0); border-image: url(background3.png) stretch; background-repeat: no-repeat;" ) lcdpalette = self.forcelcd.palette() lcdpalette.setColor(lcdpalette.Light, QtGui.QColor(0, 255, 0)) lcdpalette.setColor(lcdpalette.Dark, QtGui.QColor(0, 0, 0)) self.forcelcd.setPalette(lcdpalette) self.forcelcd.setFrameStyle(0) # Push buttons zero = QPushButton('Zero Scale', self) clearmax = QPushButton('Reset', self) clearmax.clicked.connect(self.reset) export = QPushButton('Export', self) togglestart = QPushButton('Start/Stop', self) # Push Button Functions zero.clicked.connect(self.zero_scale) clearmax.clicked.connect(self.reset) export.clicked.connect(self.exportTeams) togglestart.clicked.connect(self.toggle) # Textbox to enter in team name self.teaminput = QLineEdit() self.teaminput.setText('Enter team here') self.teaminput.returnPressed.connect(self.addTeam) # Current highest force text self.maxforce = 0000.00 self.maxforcetxt = QLabel() self.maxforcetxt.setFont(QtGui.QFont("Quartz", 62)) self.maxforcetxt.setText("Maximum Force: %.2f N" % self.maxforce) self.maxforcetxt.setStyleSheet( "color: rgb(0, 210, 0); background-image: url(maxbackground.png); background-attachment: fixed" ) self.maxforcetxt.setAlignment(QtCore.Qt.AlignCenter) # List of teams and scores self.teamlist = QListWidget() self.teamlist.setStyleSheet("background-color: rgb(85, 90, 100);") self.teamlist.setSortingEnabled(True) self.teamlist.itemDoubleClicked.connect(self.selectTeam) # EGBC Logo self.EGBC = QLabel() img = QPixmap('EGBC_Logo_Mod2.png') self.EGBC.setPixmap(img) # Add widgets to grid and format self.grid.setColumnStretch(1, 2) self.grid.setColumnStretch(2, 2) self.grid.setColumnStretch(3, 2) self.grid.setColumnStretch(4, 2) self.grid.setColumnStretch(5, 1) self.grid.setColumnStretch(6, 2) self.grid.setRowStretch(1, 6) self.grid.setRowStretch(0, 1) self.grid.addWidget(self.maxforcetxt, 0, 1, 1, 4) self.grid.addWidget(self.EGBC, 0, 5, 1, 2) self.grid.addWidget(self.forcelcd, 1, 1, 1, 5) self.grid.addWidget(zero, 2, 1) self.grid.addWidget(clearmax, 2, 2) self.grid.addWidget(export, 2, 3) self.grid.addWidget(togglestart, 2, 4) self.grid.addWidget(self.teamlist, 1, 6) self.grid.addWidget(self.teaminput, 2, 6) self.updateforce() self.setLayout(self.grid) print(self.teaminput.width()) self.showFullScreen() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: reply = QMessageBox.question(self, 'PyQt5 message', "Do you want to exit the program?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.close() else: e.ignore() def zero_scale(self): self.ser.write(b'x\r\n') self.sio.flush() trunk = self.sio.readline() self.ser.write(b'1\r\n') self.sio.flush() for line in self.sio.readlines(): if line == '>\r\n': break self.ser.write(b'x\r\nx\r\n') self.sio.flush() self.reset() return def reset(self): self.maxforce = 0.0 self.force = 0.0 self.maxforcetxt.setText(str("Maximum Force: %.2f N" % self.maxforce)) self.forcelcd.display(self.force) def toggle(self): self.start ^= 1 if self.start: self.chartView.hide() #self.grid.removeWidget(self.chartView) self.forcelcd.show() else: self.loadNewGraph = True self.forcelcd.hide() def addTeam(self): self.grid.removeWidget(self.chartView) team = self.teaminput.text() print(team) if team and team != "Enter team here": self.teaminput.setText("") self.teams[team] = [ 0.00, ] item = QListWidgetItem_Team() item.setText(team + " - " + str(self.teams[team])) item.setFont(QtGui.QFont("Times", 32)) self.teamlist.addItem(item) with open(os.path.join(csv_path, team + '.csv'), 'w', newline='') as csvfileout: writer = csv.DictWriter(csvfileout, fieldnames=['Sample', 'Force']) writer.writeheader() csvfileout.close() def selectTeam(self): self.chartView.hide() self.currentteam = self.teamlist.selectedItems() if not self.start: self.loadNewGraph = True def exportTeams(self): for team in self.teams: sample = 0 with open(os.path.join(csv_path, team + '.csv'), 'w', newline='') as csvfileout: writer = csv.DictWriter(csvfileout, fieldnames=['Sample', 'Force']) writer.writeheader() for samples in self.teams[team]: writer.writerow({'Sample': sample, 'Force': samples}) sample += 1 csvfileout.close() def get_force(self): self.ser.flushOutput() self.ser.flushInput() output = self.sio.readline() print(output) if 'Exiting' not in output and len(output) in range(10, 12): end = output.rfind(',kg') value = output[0:end] else: value = self.oldforce / 9.81 return value def updateforce(self): self.grid.removeWidget(self.chartView) if self.start: # Generate some random force values for testing #self.force = random.randrange(1,5000,1) #self.force += 0.01 self.force = round(float(self.get_force()) * 9.81, 2) self.forcelcd.display(self.force) self.oldforce = self.force # Update team dictionary and CSV file if self.currentteam[0].name(): self.teams[self.currentteam[0].name()].append(self.force) start = time.time() with open(os.path.join(csv_path, self.currentteam[0].name() + ".csv"), "a+", newline='') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=['Sample', 'Force']) csvfile.seek(0) writer.writerow({ 'Sample': self.currentteam[0].samples, 'Force': self.force }) self.currentteam[0].samples += 1 csvfile.close() end = time.time() print(end - start) # New max force found, update the force label and list if self.force > self.maxforce: self.maxforce = self.force self.maxforcetxt.setText("Maximum Force: %.2f N" % self.force) self.currentteam[0].setForce(self.force) if not self.start and self.loadNewGraph: data = QSplineSeries() data.setName(self.currentteam[0].name()) with open(os.path.join(csv_path, self.currentteam[0].name() + '.csv'), "r", newline='') as file: for line in file: if "Sample" not in line: s = line.split(",") data.append(float(s[0]), float(s[1])) file.close() maxForceline = QLineSeries() maxForceline.setName("Maxiumum Force") maxForceline.append(0.0, self.currentteam[0].force()) maxForceline.append(self.currentteam[0].samples, self.currentteam[0].force()) force_chart = QChart() force_chart.addSeries(data) force_chart.addSeries(maxForceline) force_chart.setToolTip("{}".format(self.maxforce)) force_chart.setTitle("Force vs. Time Graph for {}".format( self.currentteam[0].name())) force_chart.createDefaultAxes() force_chart.axisY().setRange(0, self.currentteam[0].force() + 10) force_chart.setTheme(2) self.chartView = QChartView(force_chart) self.chartView.setRenderHint(QPainter.Antialiasing) # self.grid.removeWidget(self.chartView) self.grid.addWidget(self.chartView, 1, 1, 1, 5) print(self.grid.children()) self.chartView.show() self.loadNewGraph = False QtCore.QTimer.singleShot(200, lambda: self.updateforce())
class OperationalPlanning(QWidget): signal_gameover = Signal.get_signal().signal_gameover def __init__(self): super(OperationalPlanning, self).__init__() self.setObjectName('OperationalPlanning') self.setStyleSheet(GetQssFile.readQss('../resource/qss/operationalPlanning.qss')) self.log = logging.getLogger('StarCraftII') # test fix algorithm self.algorithm = None self.algorithmThread = None # font font = QFont() font.setWeight(50) font.setPixelSize(15) # set widget of layout self.frame = QFrame(self) self.frame.setGeometry(QDesktopWidget().screenGeometry()) self.main_layout = QHBoxLayout(self) self.main_layout.setSpacing(20) self.setLayout(self.main_layout) # start action self.start = QPushButton() self.start.setObjectName('start') self.startLabel = QLabel('start') self.startLabel.setFont(font) self.start_layout = QVBoxLayout() self.start_layout.addWidget(self.start, alignment=Qt.AlignCenter) self.start_layout.addWidget(self.startLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.start_layout) # pause action # self.pause = QPushButton() # self.pause.setObjectName('pause') # self.pauseLabel = QLabel('pause') # self.pauseLabel.setFont(font) # self.pause_layout = QVBoxLayout() # self.pause_layout.addWidget(self.pause, alignment=Qt.AlignCenter) # self.pause_layout.addWidget(self.pauseLabel, alignment=Qt.AlignCenter) # self.main_layout.addLayout(self.pause_layout) # stop action self.stop = QPushButton() self.stop.setObjectName('stop') self.stopLabel = QLabel('stop') self.stopLabel.setFont(font) self.stop_layout = QVBoxLayout() self.stop_layout.addWidget(self.stop, alignment=Qt.AlignCenter) self.stop_layout.addWidget(self.stopLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.stop_layout) # switch policy action self.switch = QPushButton() self.switch.setObjectName('switch') self.switchLabel = QLabel('switch policy') self.switchLabel.setFont(font) self.switch_layout = QVBoxLayout() self.switch_layout.addWidget(self.switch, alignment=Qt.AlignCenter) self.switch_layout.addWidget(self.switchLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.switch_layout) # simulation time self.lcd = QLCDNumber() self.lcd.setObjectName('lcd') self.lcd.setDigitCount(10) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) self.lcd.setFrameStyle(QFrame.Panel | QFrame.Raised) self.lcd.display(time.strftime("%X", time.localtime())) self.lcdLabel = QLabel('simulation time') self.lcdLabel.setFont(font) self.lcd_layout = QVBoxLayout() self.lcd_layout.addWidget(self.lcd, alignment=Qt.AlignBottom) self.lcd_layout.addWidget(self.lcdLabel, alignment=Qt.AlignBottom) self.main_layout.addLayout(self.lcd_layout) # define time self.qtime = QTimer() self.qtime.timeout.connect(self.refresh) # define global variable global interval interval = 0 global start_or_pause start_or_pause = False global stop stop = True # map description self.map = QPushButton() self.map.setObjectName('map') self.mapLabel = QLabel('map description') self.mapLabel.setFont(font) self.map_layout = QVBoxLayout() self.map_layout.addWidget(self.map, alignment=Qt.AlignCenter) self.map_layout.addWidget(self.mapLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.map_layout) # add stretch self.main_layout.addStretch(1) # popup window self.dialog = None # initialization self.initUI() def refresh(self): timeworker = TimeWorker(self.lcd, OperationalPlanning.interval) OperationalPlanning.interval += 1 timeworker.run() def initUI(self): # connect the slot function self.start.clicked.connect(self.buttonEvent) # self.pause.clicked.connect(self.buttonEvent) self.stop.clicked.connect(self.buttonEvent) self.switch.clicked.connect(self.buttonEvent) self.map.clicked.connect(self.buttonEvent) self.signal_gameover.connect(self.stopEvent) def buttonEvent(self): sender = self.sender() if sender == self.start: self.startEvent() # elif sender == self.pause: # self.pauseEvent() elif sender == self.stop: self.stopEvent() elif sender == self.switch: self.switchEvent() elif sender == self.map: self.mapEvent() # start simulation def startEvent(self): message = 'start the simulation' self.log.info(message) Signal.get_signal().emit_signal_str(message) # fix rl algorithm globalInformation.set_value(strings.IS_STOP, False) OperationalPlanning.interval = 0 OperationalPlanning.start_or_pause = True OperationalPlanning.stop = False self.qtime.start(1000) def playWithHuman(): subprocess.Popen(strings.PLAY_WITH_HUMAN) def playWithMachine(): """ map_name = '3m' difficulty = '3' param_set = {} param_set['gamma'] = 0.99 param_set['td_lambda'] = 0.8 param_set['learning_rate'] = 0.0005 param_set['alpha'] = 0.99 param_set['eps'] = 1e-05 param_set['epsilon_start'] = 1 param_set['epsilon_end'] = 0.01 param_set['time_length'] = 100000 param_set['grad_norm_clip'] = 10 param_set['before_learn'] = 50 param_set['batch_size'] = 16 param_set['target_update_interval'] = 400 # # # iql set # param_set['algorithm'] = 'iql_CT' # path = '../model/' + map_name + '_iql_CT_3/' # COMA set param_set['algorithm'] = 'COMA' path = '../model/' + map_name + '_COMA_3/' param_set['map_name'] = map_name param_set['difficulty'] = difficulty param_set['path'] = path param_set['load_model'] = True param_set['test'] = True # self.algorithm = MARL() # self.algorithmThread = threading.Thread( # target=self.algorithm.algorithm(param_set), # name='StarCraft2Thread') """ # self.algorithm = AlgorithmAgent() # self.algorithm.start() self.algorithm = MasterAgent() self.algorithm.start() if globalInformation.get_value('pattern') == strings.HUMAN_VS_MACHINE: playWithHuman() elif globalInformation.get_value('pattern') == strings.MACHINE_VS_MACHINE: playWithMachine() # Signal.get_signal().emit_signal_none() # pause simulation def pauseEvent(self): message = 'pause the simulation' self.log.info(message) Signal.get_signal().emit_signal_str(message) if OperationalPlanning.stop: return if OperationalPlanning.start_or_pause: self.qtime.stop() OperationalPlanning.start_or_pause = False else: self.qtime.start(1000) OperationalPlanning.start_or_pause = True # stop simulation def stopEvent(self): message = 'stop the simulation' self.log.info(message) Signal.get_signal().emit_signal_str(message) self.qtime.stop() OperationalPlanning.start_or_pause = False OperationalPlanning.stop = True globalInformation.set_value(strings.IS_STOP, True) # a description of current map def mapEvent(self): message = 'open the map description' self.log.info(message) Signal.get_signal().emit_signal_str(message) self.window = FramelessWindow('map description') self.dialog = QDialog() mapDialog = MapDescriptionDialog() mapDialog.setupUi(self.dialog) self.dialog.setModal(True) self.window.setWidget(self.dialog) self.initFrameLessWindow( QSize(700, 600), 'Operational Planning', QIcon('../resource/drawable/logo.png') ) self.window.show() # self.dialog.show() # switch policy of a dialog # there is a description of each algorithm def switchEvent(self): message = 'switch policy' self.log.info(message) Signal.get_signal().emit_signal_str(message) self.window = FramelessWindow('switch policy') self.dialog = QDialog() # tab item name list_str = [ strings.ALGORITHM_COMA, strings.ALGORITHM_COMMNET_COMA, strings.ALGORITHM_QMIX, strings.ALGORITHM_QTRAN_ALT, strings.ALGORITHM_QTRAN_BASE, strings.ALGORITHM_VDN ] # item content list_item = [ strings.CLASS_ALGORITHM_COMA, strings.CLASS_ALGORITHM_COMMNET_COMA, strings.CLASS_ALGORITHM_QMIX, strings.CLASS_ALGORITHM_QTRAN_ALT, strings.CLASS_ALGORITHM_QTRAN_BASE, strings.CLASS_ALGORITHM_VDN ] # title name self.listDialog = ListDialog(list_str, list_item, strings.OPERATIONAL_PLANNING_TITLE, strings.TYPE_POLICY) self.listDialog.setupUi(self.dialog, self.window) self.window.setWidget(self.dialog) self.initFrameLessWindow( QSize(700, 600), 'Operational Planning', QIcon('../resource/drawable/logo.png') ) self.window.show() # self.dialog.setModal(True) # self.dialog.show() def initFrameLessWindow(self, size, title, icon): self.window.resize(size) self.window.setWindowTitle(title) self.window.setWindowIcon(icon)
class Rpm(QWidget): def __init__(self, parent): super(Rpm, self).__init__(parent) self.arguments = Arg_Class() self.rpmValue = 0 self.rpmLCD = QLCDNumber(self) self.rpmLCD.display(str(10*int(self.rpmValue/10)).zfill(4)) self.rpmLCD.move(200,130) self.rpmLCD.resize(260,180) self.rpmLCD.setFrameStyle(QFrame.NoFrame) self.rpmLCD.setSegmentStyle(QLCDNumber.Flat) self.rpmLabelFont = QFont("Helvetica", 14) self.rpmLabel = QLabel(self) self.rpmLabel.setText("x1000 r/min") self.rpmLabel.setFont(self.rpmLabelFont) self.rpmLabel.move(4.0, 4.0) self.rpmLabel.show() self.labelFont = QFont("Helvetica", 20, QFont.Bold, QFont.StyleItalic) x = 4.0 y = 200.0 #bar1 xb = 4.0 yb = 280.0 self.leftx1 = xb self.lefty1 = yb self.bar1 = QPainterPath() self.bar1.moveTo(xb, yb) self.bar1.lineTo(xb, y + 8.0) xb += 32.0 yb -= 38.0 self.rightx1 = xb self.righty1 = yb self.bar1.lineTo(xb, y - 38.0 + 8.0) self.bar1.lineTo(xb, yb) self.bar1.lineTo(xb - 32.0, yb + 38.0) self.bar1.closeSubpath() #1st seg x = 4.0 y = 200.0 self.guage1 = QPainterPath() self.guage1.moveTo(x, y) self.guage1.moveTo(x, y - 8.0) x += 32.0 y -= 38.0 self.guage1.lineTo(x , y - 8.0) self.guage1.lineTo(x, y) self.guage1.lineTo(x - 32.0, y + 38.0) self.guage1.closeSubpath() self.label1 = QLabel(self) self.label1.setText("1") self.label1.setFont(self.labelFont) self.label1.move(x - 10.0, y - 40.0) self.label1.show() #bar2 x += 4.0 y -= 3.0 xb += 4.0 yb -= 3.0 self.leftx2 = xb self.lefty2 = yb self.bar2 = QPainterPath() self.bar2.moveTo(xb, yb) self.bar2.lineTo(xb, y + 8.0) xb += 42.0 yb -= 36.0 self.rightx2 = xb self.righty2 = yb self.bar2.lineTo(xb, y - 36.0 + 8.0) self.bar2.lineTo(xb, yb) self.bar2.lineTo(xb - 42.0, yb + 36.0) self.bar2.closeSubpath() #2nd seg self.guage2 = QPainterPath() self.guage2.moveTo(x, y) self.guage2.moveTo(x, y - 8.0) x += 42.0 y -= 36.0 self.guage2.lineTo(x , y - 8.0) self.guage2.lineTo(x, y) self.guage2.lineTo(x - 42.0, y + 38.0) self.guage2.closeSubpath() self.label2 = QLabel(self) self.label2.setText("2") self.label2.setFont(self.labelFont) self.label2.move(x - 10.0, y - 40.0) self.label2.show() #bar3 x += 4.0 y -= 3.0 xb += 4.0 yb -= 3.0 self.leftx3 = xb self.lefty3 = yb self.bar3 = QPainterPath() self.bar3.moveTo(xb, yb) self.bar3.lineTo(xb, y + 8.0) xb += 54.0 yb -= 32.0 self.rightx3 = xb self.righty3 = yb self.bar3.lineTo(xb, y - 32.0 + 8.0) self.bar3.lineTo(xb, yb) self.bar3.lineTo(xb - 54.0, yb + 32.0) self.bar3.closeSubpath() #3rd seg self.guage3 = QPainterPath() self.guage3.moveTo(x, y) self.guage3.moveTo(x, y - 8.0) x += 54.0 y -= 32.0 self.guage3.lineTo(x , y - 8.0) self.guage3.lineTo(x, y) self.guage3.lineTo(x - 54.0, y + 32.0) self.guage3.closeSubpath() self.label3 = QLabel(self) self.label3.setText("3") self.label3.setFont(self.labelFont) self.label3.move(x - 10.0, y - 40.0) self.label3.show() #bar4 x += 4.0 y -= 1.0 xb += 4.0 yb -= 1.0 self.leftx4 = xb self.lefty4 = yb self.bar4 = QPainterPath() self.bar4.moveTo(xb, yb) self.bar4.lineTo(xb, y + 8.0) xb += 70.0 yb -= 30.0 self.rightx4 = xb self.righty4 = yb self.bar4.lineTo(xb, y - 30.0 + 8.0) self.bar4.lineTo(xb, yb) self.bar4.lineTo(xb - 70.0, yb + 30.0) self.bar4.closeSubpath() #4th seg self.guage4 = QPainterPath() self.guage4.moveTo(x, y) self.guage4.moveTo(x, y - 8.0) x += 70.0 y -= 30.0 self.guage4.lineTo(x , y - 8.0) self.guage4.lineTo(x, y) self.guage4.lineTo(x - 70.0, y + 30.0) self.guage4.closeSubpath() self.label4 = QLabel(self) self.label4.setText("4") self.label4.setFont(self.labelFont) self.label4.move(x - 10.0, y - 40.0) self.label4.show() #bar5 x += 4.0 y -= 1.0 xb += 4.0 yb -= 1.0 self.leftx5 = xb self.lefty5 = yb self.bar5 = QPainterPath() self.bar5.moveTo(xb, yb) self.bar5.lineTo(xb, y + 8.0) xb += 108.0 yb -= 16.0 self.rightx5 = xb self.righty5 = yb self.bar5.lineTo(xb, y - 16.0 + 8.0) self.bar5.lineTo(xb, yb) self.bar5.lineTo(xb - 108.0, yb + 16.0) self.bar5.closeSubpath() #5th seg self.guage5 = QPainterPath() self.guage5.moveTo(x, y) self.guage5.moveTo(x, y - 8.0) x += 108.0 y -= 16.0 self.guage5.lineTo(x , y - 8.0) self.guage5.lineTo(x, y) self.guage5.lineTo(x - 108.0, y + 16.0) self.guage5.closeSubpath() self.label5 = QLabel(self) self.label5.setText("5") self.label5.setFont(self.labelFont) self.label5.move(x - 8.0, y - 40.0) self.label5.show() #bar6 x += 4.0 y -= 0.0 xb += 4.0 yb -= 0.0 self.leftx6 = xb self.lefty6 = yb self.bar6 = QPainterPath() self.bar6.moveTo(xb, yb) self.bar6.lineTo(xb, y + 8.0) xb += 132.0 yb -= 0.0 self.rightx6 = xb self.righty6 = yb self.bar6.lineTo(xb, y - 0.0 + 8.0) self.bar6.lineTo(xb, yb) self.bar6.lineTo(xb - 132.0, yb + 0.0) self.bar6.closeSubpath() #6th seg self.guage6 = QPainterPath() self.guage6.moveTo(x, y) self.guage6.moveTo(x, y - 8.0) x += 132.0 y -= 0.0 self.guage6.lineTo(x , y - 8.0) self.guage6.lineTo(x, y) self.guage6.lineTo(x - 132.0, y + 0.0) self.guage6.closeSubpath() self.label6 = QLabel(self) self.label6.setText("6") self.label6.setFont(self.labelFont) self.label6.move(x - 6.0, y - 40.0) self.label6.show() #bar7 x += 4.0 y -= 0.0 xb += 4.0 yb -= 0.0 self.leftx7 = xb self.lefty7 = yb self.bar7 = QPainterPath() self.bar7.moveTo(xb, yb) self.bar7.lineTo(xb, y + 8.0) xb += 128.0 yb -= 0.0 self.rightx7 = xb self.righty7 = yb self.bar7.lineTo(xb, y - 0.0 + 8.0) self.bar7.lineTo(xb, yb) self.bar7.lineTo(xb - 128.0, yb + 0.0) self.bar7.closeSubpath() #7th seg self.guage7 = QPainterPath() self.guage7.moveTo(x, y) self.guage7.moveTo(x, y - 8.0) x += 128.0 y -= 0.0 self.guage7.lineTo(x , y - 8.0) self.guage7.lineTo(x, y) self.guage7.lineTo(x - 128.0, y + 0.0) self.guage7.closeSubpath() self.label7 = QLabel(self) self.label7.setText("7") self.label7.setFont(self.labelFont) self.label7.move(x - 6.0, y - 40.0) self.label7.show() #bar8 x += 4.0 y -= 0.0 xb += 4.0 yb -= 0.0 self.leftx8 = xb self.lefty8 = yb self.bar8 = QPainterPath() self.bar8.moveTo(xb, yb) self.bar8.lineTo(xb, y + 8.0) xb += 96.0 yb -= 0.0 self.rightx8 = xb self.righty8 = yb self.bar8.lineTo(xb, y - 0.0 + 8.0) self.bar8.lineTo(xb, yb) self.bar8.lineTo(xb - 96.0, yb + 0.0) self.bar8.closeSubpath() #8th seg self.guage8 = QPainterPath() self.guage8.moveTo(x, y) self.guage8.moveTo(x, y - 8.0) x += 96.0 y -= 0.0 self.guage8.lineTo(x , y - 8.0) self.guage8.lineTo(x, y) self.guage8.lineTo(x - 96.0, y + 0.0) self.guage8.closeSubpath() self.label8 = QLabel(self) self.label8.setText("8") self.label8.setFont(self.labelFont) self.label8.move(x - 6.0, y - 40.0) self.label8.show() #bar9 x += 4.0 y -= 0.0 xb += 4.0 yb -= 0.0 self.leftx9 = xb self.lefty9 = yb self.bar9 = QPainterPath() self.bar9.moveTo(xb, yb) self.bar9.lineTo(xb, y + 8.0) xb += 96.0 yb -= 0.0 self.rightx9 = xb self.righty9 = yb self.bar9.lineTo(xb, y - 0.0 + 8.0) self.bar9.lineTo(xb, yb) self.bar9.lineTo(xb - 96.0, yb + 0.0) self.bar9.closeSubpath() #9th seg self.guage9 = QPainterPath() self.guage9.moveTo(x, y) self.guage9.moveTo(x, y - 8.0) x += 96.0 y -= 0.0 self.guage9.lineTo(x , y - 8.0) self.guage9.lineTo(x, y) self.guage9.lineTo(x - 96.0, y + 0.0) self.guage9.closeSubpath() @pyqtSlot(float) def rpm_update(self, value): #self.rpmValue = value self.rpmValue = (800 * int(self.rpmValue) + (1024 - 800) * int(value)) >> 10 if self.rpmValue < 0: self.rpmValue = 0 self.rpmLCD.display(str(10*int(self.rpmValue/10)).zfill(4))#displays rpm, reduces precision to imporve readablity self.update() def paintEvent(self, event): qp = QPainter(self) #Antialiasing smooths the edges of the graphics, TODO: add a flag so its not set everytime, should help preformence qp.setRenderHints(QPainter.Antialiasing) qp.setPen(Qt.white) qp.setBrush(Qt.white) qp.drawPath(self.guage1) qp.drawPath(self.guage2) qp.drawPath(self.guage3) qp.drawPath(self.guage4) qp.drawPath(self.guage5) qp.drawPath(self.guage6) qp.drawPath(self.guage7) qp.drawPath(self.guage8) qp.drawPath(self.guage9) if self.rpmValue > 0.0 and self.rpmValue <= 999: rightx = self.leftx1 + (self.rpmValue / 1000.0 * (self.rightx1 - self.leftx1)) righty = self.lefty1 - (self.rpmValue / 1000.0 * (self.lefty1 - self.righty1)) bar = QPainterPath() bar.moveTo(self.leftx1, self.lefty1) bar.lineTo(self.leftx1, self.lefty1 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx1, self.lefty1) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 1000 and self.rpmValue <= 1999: qp.drawPath(self.bar1) rightx = self.leftx2 + ((self.rpmValue - 1000.0) / 1000.0 * (self.rightx2 - self.leftx2)) righty = self.lefty2 - ((self.rpmValue - 1000.0) / 1000.0 * (self.lefty2 - self.righty2)) bar = QPainterPath() bar.moveTo(self.leftx2, self.lefty2) bar.lineTo(self.leftx2, self.lefty2 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx2, self.lefty2) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 2000 and self.rpmValue <= 2999: qp.drawPath(self.bar1) qp.drawPath(self.bar2) rightx = self.leftx3 + ((self.rpmValue - 2000.0) / 1000.0 * (self.rightx3 - self.leftx3)) righty = self.lefty3 - ((self.rpmValue - 2000.0) / 1000.0 * (self.lefty3 - self.righty3)) bar = QPainterPath() bar.moveTo(self.leftx3, self.lefty3) bar.lineTo(self.leftx3, self.lefty3 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx3, self.lefty3) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 3000 and self.rpmValue <= 3999: qp.drawPath(self.bar1) qp.drawPath(self.bar2) qp.drawPath(self.bar3) rightx = self.leftx4 + ((self.rpmValue - 3000.0) / 1000.0 * (self.rightx4 - self.leftx4)) righty = self.lefty4 - ((self.rpmValue - 3000.0) / 1000.0 * (self.lefty4 - self.righty4)) bar = QPainterPath() bar.moveTo(self.leftx4, self.lefty4) bar.lineTo(self.leftx4, self.lefty4 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx4, self.lefty4) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 4000 and self.rpmValue <= 4999: qp.drawPath(self.bar1) qp.drawPath(self.bar2) qp.drawPath(self.bar3) qp.drawPath(self.bar4) rightx = self.leftx5 + ((self.rpmValue - 4000.0) / 1000.0 * (self.rightx5 - self.leftx5)) righty = self.lefty5 - ((self.rpmValue - 4000.0) / 1000.0 * (self.lefty5 - self.righty5)) bar = QPainterPath() bar.moveTo(self.leftx5, self.lefty5) bar.lineTo(self.leftx5, self.lefty5 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx5, self.lefty5) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 5000 and self.rpmValue <= 5999: qp.drawPath(self.bar1) qp.drawPath(self.bar2) qp.drawPath(self.bar3) qp.drawPath(self.bar4) qp.drawPath(self.bar5) rightx = self.leftx6 + ((self.rpmValue - 5000.0) / 1000.0 * (self.rightx6 - self.leftx6)) righty = self.righty6 bar = QPainterPath() bar.moveTo(self.leftx6, self.lefty6) bar.lineTo(self.leftx6, self.lefty6 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx6, self.lefty6) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 6000 and self.rpmValue <= 6999: qp.drawPath(self.bar1) qp.drawPath(self.bar2) qp.drawPath(self.bar3) qp.drawPath(self.bar4) qp.drawPath(self.bar5) qp.drawPath(self.bar6) rightx = self.leftx7 + ((self.rpmValue - 6000.0) / 1000.0 * (self.rightx7 - self.leftx7)) righty = self.righty7 bar = QPainterPath() bar.moveTo(self.leftx7, self.lefty7) bar.lineTo(self.leftx7, self.lefty7 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx7, self.lefty7) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 7000 and self.rpmValue <= 7999: qp.drawPath(self.bar1) qp.drawPath(self.bar2) qp.drawPath(self.bar3) qp.drawPath(self.bar4) qp.drawPath(self.bar5) qp.drawPath(self.bar6) qp.drawPath(self.bar7) rightx = self.leftx8 + ((self.rpmValue - 7000.0) / 1000.0 * (self.rightx8 - self.leftx8)) righty = self.righty8 bar = QPainterPath() bar.moveTo(self.leftx8, self.lefty8) bar.lineTo(self.leftx8, self.lefty8 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx8, self.lefty8) bar.closeSubpath() qp.drawPath(bar) elif self.rpmValue >= 8000: qp.drawPath(self.bar1) qp.drawPath(self.bar2) qp.drawPath(self.bar3) qp.drawPath(self.bar4) qp.drawPath(self.bar5) qp.drawPath(self.bar6) qp.drawPath(self.bar7) qp.drawPath(self.bar8) rightx = self.leftx9 + ((self.rpmValue - 8000.0) / 1000.0 * (self.rightx9 - self.leftx9)) righty = self.righty9 bar = QPainterPath() bar.moveTo(self.leftx9, self.lefty9) bar.lineTo(self.leftx9, self.lefty9 - 72.0) bar.lineTo(rightx, righty - 72.0) bar.lineTo(rightx, righty) bar.lineTo(self.leftx9, self.lefty9) bar.closeSubpath() qp.drawPath(bar)