URD360.py:
#!/usr/bin/python3.5
import func
import sys
import os
#引入模块,基本控件位于pyqt5.qtwidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
from PyQt5 import QtCore, QtGui, QtWidgets
class QMainWindow(QtWidgets.QMainWindow):
"""对QMainWindow类重写,实现一些功能"""
def closeEvent(self, event):
"""
重写closeEvent方法,实现dialog窗体关闭时执行一些代码
:param event: close()触发的事件
:return: None
"""
reply = QtWidgets.QMessageBox.question(self,
'Exit',
"Do you really want to exit 'URD360'?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
event.accept()
os.system("killall -2 ./driver.elf")
else:
event.ignore()
if __name__ == "__main__":
getcmd = os.popen("ps -aux |grep 'URD360.py'", "r")
getcmd_read = getcmd.read()
#print(getcmd_read)
app = QApplication(sys.argv)
#file = open("res-css-black.css", 'r')
#app.setStyleSheet(file.read())
app.setStyleSheet("QScrollBar:vertical"
"{"
"width:8px;"
"background:#565656;"
"margin:0px,0px,0px,0px;"
"padding-top:9px;"
"padding-bottom:9px;"
"}"
"QScrollBar::handle:vertical"
"{"
"width:8px;"
"background:#6b6b6b;"
" border-radius:4px;"
"min-height:20;"
"}"
"QScrollBar::handle:vertical:hover"
"{"
"width:8px;"
"background:#b9b9b9;"
" border-radius:4px;"
"min-height:20;"
"}"
"QTextBrowser{background-color: #2f2f2f;color: #adadad}"
)
MainWindow = QMainWindow()
screen = QApplication.desktop().screenGeometry()
#print(screen.width())
MainWindow.move((screen.width()-1220)/2, (screen.height()-700)/2)
if getcmd_read.count("/usr/bin/python3.5 ./URD360.py") > 1:
#print(getcmd_read.count("/usr/bin/python3.5 ./URD360.py"))
msgBox = QtWidgets.QMessageBox.about(MainWindow, 'Warninig', "'URD360' is running")
sys.exit(0)
else:
ui = func.func_ui(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
func.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'func.ui'
#
# Created by: PyQt5 UI code generator 5.5.1
#
# WARNING! All changes made in this file will be lost!
from subprocess import Popen
from threading import Thread
import time
from PyQt5 import QtCore, QtGui, QtWidgets
import subprocess
from PyQt5.QtWidgets import QFrame
from PyQt5.QtGui import QColor
from PyQt5.QtCore import *
Driver_process = 0
Arm_process = None
class Ui_MainWindow(object):
def __init__(self,MainWindow):
self.MainWindow = MainWindow
super().__init__()
self.setupUi(self.MainWindow)
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1220, 700)
# self.ads = QtWidgets.QWidget(MainWindow)
# self.ads.setObjectName("ads")
self.horizontalLayoutWidget = QtWidgets.QWidget()
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(50, 80, 871, 521))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout_5 = QtWidgets.QVBoxLayout()
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.driverWin_label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.driverWin_label.setObjectName("driverWin_label")
self.verticalLayout_5.addWidget(self.driverWin_label, 0, QtCore.Qt.AlignHCenter)
self.driver_win = QtWidgets.QTextBrowser(self.horizontalLayoutWidget)
self.driver_win.setObjectName("textBrowser")
self.verticalLayout_5.addWidget(self.driver_win)
self.horizontalLayout.addLayout(self.verticalLayout_5)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label.setText("")
self.label.setObjectName("label")
self.verticalLayout_3.addWidget(self.label)
self.start_button = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.start_button.setObjectName("start_button")
self.verticalLayout_3.addWidget(self.start_button)
self.stop_button = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.stop_button.setObjectName("stop_button")
self.verticalLayout_3.addWidget(self.stop_button)
self.update_button = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.update_button.setObjectName("update_button")
self.verticalLayout_3.addWidget(self.update_button)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_3.addItem(spacerItem)
self.horizontalLayout.addLayout(self.verticalLayout_3)
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.armWin_label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.armWin_label.setObjectName("armWin_label")
self.verticalLayout_4.addWidget(self.armWin_label, 0, QtCore.Qt.AlignHCenter)
self.armWin = QtWidgets.QTextBrowser(self.horizontalLayoutWidget)
self.armWin.setObjectName("armWin")
self.verticalLayout_4.addWidget(self.armWin)
self.transmitWin_label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.transmitWin_label.setObjectName("transmitWin_label")
self.verticalLayout_4.addWidget(self.transmitWin_label, 0, QtCore.Qt.AlignHCenter)
self.transmitWin = QtWidgets.QTextBrowser(self.horizontalLayoutWidget)
self.transmitWin.setObjectName("transmitWin")
self.verticalLayout_4.addWidget(self.transmitWin)
self.horizontalLayout.addLayout(self.verticalLayout_4)
MainWindow.setCentralWidget(self.horizontalLayoutWidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1014, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
#self.driver_win.append("%s" % '111')
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "URD360"))
self.driverWin_label.setText(_translate("MainWindow", "driver window"))
self.start_button.setText(_translate("MainWindow", "start"))
self.start_button.setToolTip("start scanning")
self.stop_button.setText(_translate("MainWindow", "stop"))
self.stop_button.setToolTip("stop scanning")
self.update_button.setText(_translate("MainWindow", "update"))
self.update_button.setToolTip("update 'GPS' and 'SystemAzimuth'")
self.armWin_label.setText(_translate("MainWindow", "arm window"))
self.transmitWin_label.setText(_translate("MainWindow", "monitor window"))
'''col = QColorDialog.getColor()
print(col.name())'''
self.start_button.setStyleSheet("QPushButton{font-weight: bold}"
"QPushButton:hover{background-color:#aaffff; color:black;}"
"QPushButton:pressed{background-color: #ffd2ca}")
self.stop_button.setStyleSheet("QPushButton{font-weight: bold}"
"QPushButton:hover{background-color:#aaffff; color:black;}"
"QPushButton:pressed{background-color: #ffd2ca}")
self.update_button.setStyleSheet("QPushButton{font-weight: bold}"
"QPushButton:hover{background-color:#aaffff; color:black;}"
"QPushButton:pressed{background-color: #ffd2ca}")
self.driverWin_label.setStyleSheet("QLabel{color: #cccccc}")
self.transmitWin_label.setStyleSheet("color: #cccccc")
self.armWin_label.setStyleSheet("color: #cccccc")
MainWindow.setStyleSheet("#MainWindow{background-color: #565656}")
'''self.driver_win.setStyleSheet("QTextBrowser{background-color: #2f2f2f;color: #cccccc}")
self.transmitWin.setStyleSheet("background-color: #2f2f2f;color: #cccccc")
self.armWin.setStyleSheet("background-color: #2f2f2f;color: #cccccc")'''
self.driver_win.setFrameShape(QFrame.Box) #set box
self.armWin.setFrameShape(QFrame.Box)
self.transmitWin.setFrameShape(QFrame.Box)
self.driver_win.document().setMaximumBlockCount(100) #set max
self.transmitWin.document().setMaximumBlockCount(100)
self.armWin.document().setMaximumBlockCount(100)
class show_thred(QThread):
sinOut = pyqtSignal(str)
def __init__(self, data, flag):
self.data = data
self.flag = flag
super().__init__()
def run(self):
while True:
if self.data.poll() is None:
if self.flag == 2:
print(self.data.poll())
outputdata = self.data.stdout.readline()
self.sinOut.emit(str(outputdata, 'utf-8'))
elif self.data.poll() is not None:
if self.flag == 1:
self.data = Popen('./arm_control "101;;;qt"', stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
global Arm_process
Arm_process = self.data
class func_ui(Ui_MainWindow):
driver_thread = ... # type: Thread
data = ... # type: Popen
driver_show = ...
def __init__(self, MainWindow):
self.MainWindow = MainWindow
super().__init__(self.MainWindow)
self.commander_process = subprocess.Popen('./commander >>/dev/null 2>/dev/null &', stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
self.monitor_process = subprocess.Popen('./monitor', stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
self.monitor_show = show_thred(self.monitor_process, 0)
self.monitor_show.Daemon = True
self.monitor_show.sinOut.connect(self.show_monitor_text)
self.monitor_show.start()
self.start_button.clicked.connect(self.start_button_click)
self.start_button.setProperty("default_style", True)
self.stop_button.clicked.connect(self.stop_button_click)
self.stop_button.setProperty("default_style", True)
self.update_button.clicked.connect(self.update_button_click)
self.update_button.setProperty("default_style", True)
global Driver_process
Driver_process = subprocess.Popen('./driver.elf "qt"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
self.driver_show = show_thred(Driver_process, 0)
self.driver_show.Daemon = True
self.driver_show.sinOut.connect(self.show_driver_text)
self.driver_show.start()
#time.sleep(2)
global Arm_process
Arm_process = subprocess.Popen('./arm_control "101;;;qt"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
self.arm_show = show_thred(Arm_process, 1)
self.arm_show.Daemon = True
self.arm_show.sinOut.connect(self.show_arm_text)
self.arm_show.start()
Driver_process.stdin.write(("start\n").encode())
Driver_process.stdin.flush()
#self.start_button.clicked.connect(self.start_button_click)
#self.stop_button.clicked.connect(self.stop_button_click)
@pyqtSlot()
def start_button_click(self):
global Arm_process
Arm_process.stdin.write(("2\n").encode())
Arm_process.stdin.flush()
@pyqtSlot()
def stop_button_click(self):
global Arm_process
Arm_process.stdin.write(("3\n").encode())
Arm_process.stdin.flush()
@pyqtSlot()
def update_button_click(self):
global Arm_process
Arm_process.stdin.write(("5\n").encode())
Arm_process.stdin.flush()
def show_driver_text(self, msg):
msg = msg.replace('\033[31m', "<font color='#e24640'>")
msg = msg.replace('\033[32m', "<font color='green'>")
msg = msg.replace('\033[33m', "<font color='Goldenrod'>")
msg = msg.replace('\033[34m', "<font color='blue'>")
msg = msg.replace('\033[0m', '')
if '<font' in msg:
self.driver_win.append(msg.rstrip('\n') + "</font> ")
else:
self.driver_win.append(msg.rstrip('\n'))
def show_arm_text(self, msg):
msg = msg.replace('\033[31m', "<font color='#e24640'>")
msg = msg.replace('\033[32m', "<font color='green'>")
msg = msg.replace('\033[33m', "<font color='Goldenrod'>")
msg = msg.replace('\033[34m', "<font color='blue'>")
msg = msg.replace('\033[0m', '')
if '<font' in msg:
self.armWin.append(msg.rstrip('\n') + "</font> ")
else:
self.armWin.append(msg.rstrip('\n'))
def show_monitor_text(self, msg):
msg = msg.replace('\033[31m', "<font color='#e24640'>")
msg = msg.replace('\033[32m', "<font color='green'>")
msg = msg.replace('\033[33m', "<font color='Goldenrod'>")
msg = msg.replace('\033[34m', "<font color='blue'>")
msg = msg.replace('\033[0m', '')
if '<font' in msg:
self.transmitWin.append(msg.rstrip('\n') + "</font> ")
else:
self.transmitWin.append(msg.rstrip('\n'))
效果

本博客介绍了一个名为URD360的GUI应用程序的设计与实现,该程序使用Python和PyQt5库构建。URD360包含三个主要窗口:驱动窗口、ARM控制窗口和监控窗口,分别用于显示不同子系统的实时信息。文章详细描述了如何通过子进程管理和线程通信来实现实时数据更新,并展示了如何优雅地处理程序关闭事件。
616

被折叠的 条评论
为什么被折叠?



