PYQT + flask httpserver 服务器提供简单的MES服务

main.py

cpp 复制代码
import sys
# 导入创建的文件模块
import test
import dcservice
from PyQt5.QtWidgets import QApplication, QMainWindow


if __name__ =='__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = test.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

test.py

cpp 复制代码
# -*- coding: utf-8 -*-
import sys
import time

# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.



from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QTableWidgetItem, QHeaderView, QMessageBox, QMainWindow, QApplication
import dcservice

openflag = 1
class QMainWindow():
    """
    重写closeEvent方法
    """
    def closeEvent(self, event):
        result = QtWidgets.QMessageBox.question(self, "标题", "亲,你确定想关闭我?别后悔!!!'_'",
                                            QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        if (result == QtWidgets.QMessageBox.Yes):
            event.accept()
        # 通知服务器的代码省略,这里不是重点...
        else:
            event.ignore()
class Ui_MainWindow(QMainWindow):
    def closeEvent(self, event):
        result = QMainWindow.QMessageBox.question(self, "标题", "亲,你确定想关闭我?别后悔!!!'_'",
                                                QMainWindow.QMessageBox.Yes | QMainWindow.QMessageBox.No)
        if (result == QMainWindow.QMessageBox.Yes):
            event.accept()
        # 通知服务器的代码省略,这里不是重点...
        else:
            event.ignore()
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(867, 700)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(10, 10, 851, 581))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(560, 600, 271, 51))

        self.pushButton1 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton1.setGeometry(QtCore.QRect(30, 600, 271, 51))


        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(18)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")

        self.pushButton1.setFont(font)
        self.pushButton1.setObjectName("pushButton1")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 867, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        MainWindow.destroyed.connect(self.close) # type: ignore
        self.pushButton.clicked.connect(self.CloseService) # type: ignore
        self.pushButton1.clicked.connect(self.OpenService)  # type: ignore
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.InitTableWdiget()

    def InitTableWdiget(self):
        self.tableWidget.setRowCount(7)  # 设置表格行数
        self.tableWidget.setColumnCount(4)  # 设置表格列数
        self.tableWidget.verticalHeader().setVisible(False)
        self.tableWidget.horizontalHeader().setVisible(False)
        self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        # self.tableWidget.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)



        # 合并相同数据单元格
        # 合并第3列的第1-5行
        # (0表示第1行,2表示第3列,5表示跨越5行<1、2、3、4、5行>,1表示跨越1列)
        self.tableWidget.setSpan(2, 1, 1, 3)
        self.tableWidget.setSpan(3, 1, 1, 3)
        self.tableWidget.setSpan(4, 1, 1, 3)
        self.tableWidget.setSpan(5, 1, 1, 3)
        self.tableWidget.setSpan(6, 1, 1, 3)

        self.tableWidget.setRowHeight(0, 60)
        self.tableWidget.setRowHeight(1, 60)
        self.tableWidget.setRowHeight(2, 60)
        self.tableWidget.setRowHeight(3, 60)
        self.tableWidget.setRowHeight(4, 60)
        self.tableWidget.setRowHeight(5, 60)
        self.tableWidget.setRowHeight(6, 120)



        data = QTableWidgetItem(str('1状态'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        self.tableWidget.setItem(0, 0, data)

        data = QTableWidgetItem(str('2状态'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        self.tableWidget.setItem(1, 0, data)

        data = QTableWidgetItem(str('1产量'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        self.tableWidget.setItem(2, 0, data)

        data = QTableWidgetItem(str('2产量'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        self.tableWidget.setItem(3, 0, data)



        # data.setBackground(QtGui.QBrush(QtGui.QColor("yellow")))
        data = QTableWidgetItem(str('上传数据状态:'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        self.tableWidget.setItem(4, 0, data)

        data = QTableWidgetItem(str('服务状态:'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        self.tableWidget.setItem(5, 0, data)

        data = QTableWidgetItem(str('已启动'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 25))
        data.setForeground(QtGui.QBrush(QtGui.QColor("green")))  # 设置单元格文本颜色
        self.tableWidget.setItem(5, 1, data)

        data = QTableWidgetItem(str('已连接'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        data.setForeground(QtGui.QBrush(QtGui.QColor("green")))  # 设置单元格文本颜色
        self.tableWidget.setItem(0, 1, data)

        data = QTableWidgetItem(str('已断开'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setFont(QFont("Arial", 20))
        data.setForeground(QtGui.QBrush(QtGui.QColor("red")))  # 设置单元格文本颜色
        self.tableWidget.setItem(1, 1, data)

        self.tableWidget.setRowHeight(6, 200)
        data = QTableWidgetItem(str('异常日志:'))  # 转换后可插入表格
        data.setTextAlignment(Qt.AlignCenter)
        data.setForeground(QtGui.QBrush(QtGui.QColor("red")))  # 设置单元格文本颜色
        data.setFont(QFont("Arial", 20))
        data.setTextAlignment(Qt.AlignCenter)
        self.tableWidget.setItem(6, 0, data)

        dcservice._startService()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "关闭服务器"))
        self.pushButton1.setText(_translate("MainWindow", "打开服务器"))
    def closeEvent(self, event):
        pass
    def close(self):
        print('==============')
        pass
    def CloseService(self):
        global openflag
        if openflag == 1:
            openflag =0
            dcservice._stopService()
            data = QTableWidgetItem(str('已关闭'))  # 转换后可插入表格
            data.setTextAlignment(Qt.AlignCenter)
            data.setFont(QFont("Arial", 25))
            data.setForeground(QtGui.QBrush(QtGui.QColor("red")))  # 设置单元格文本颜色
            self.tableWidget.setItem(5, 1, data)
    def OpenService(self):
        global openflag
        if(openflag == 0):
            openflag = 1
            dcservice._startService()
            data = QTableWidgetItem(str('已启动'))  # 转换后可插入表格
            data.setTextAlignment(Qt.AlignCenter)
            data.setFont(QFont("Arial", 25))
            data.setForeground(QtGui.QBrush(QtGui.QColor("green")))  # 设置单元格文本颜色
            self.tableWidget.setItem(5, 1, data)
    def close(self):
        # self.CloseService()
        print('--------------------------------')
        print('00000000000000000000000000000000')
        sys.exit(-1)

dcservice.py

python 复制代码
# -*- coding: UTF-8 -*-
# !/usr/bin/python
# @time     :2019/10/12 11:11
# @author   :Mo
# @function :service of flask
import ctypes
import inspect
import sys
import threading
import time

from flask import Flask, request, jsonify
from threading import Thread
import os

app = Flask(__name__)
app1 = Flask(__name__ + '1')
# mes交互需要的数据
################################################
# 接口名字
m_Cmd = 'getstatus'
# 工作台
m_table = 'Left'
# 机台设备号
m_EqNo = 'AE0001'
# 结果
m_result = 'true'
# 设备运行状态
m_process_state = 'Run'
# 错误消息
m_msg = '无'
# 产能
m_capicity = 1000
# 当前工序
m_currentProcess = ""
#设备名称
m_device_name=""
################################################


g_a = 100
g_b = 200
g_c = 300

t1=0
t2=0


@app.route('/dcservice', methods=["GET","POST"])
def calculate():
    global m_Cmd,m_table,m_EqNo,m_result ,m_process_state,m_msg,m_capicity,m_currentProcess
    if request.method == 'GET':
        params = params = request.args
        m_Cmd = params.get("Cmd", 0)
        if m_Cmd == 'getstatus':#获取设备机台状态接口
            return jsonify(content_type='application/json;charset=utf-8',
                           reason='success',
                           charset='utf-8',
                           status='200',
                           Cmd=m_Cmd,
                           EquNo=m_EqNo,
                           result=m_result,
                           Data=m_data,
                           Table = m_table,
                           msg = m_msg)
        elif m_Cmd == 'getcapicity':#获取产能
            return jsonify(content_type='application/json;charset=utf-8',
                           reason='success',
                           charset='utf-8',
                           status='200',
                           Cmd=m_Cmd,
                           EquNo=m_EqNo,
                           result=m_result,
                           Data=m_capicity,
                           Table=m_table,
                           msg=m_msg)
        else:
            return jsonify(
                result="true",
                Data="没找到对应指令",
                msg="")
    elif request.method == 'GET':
        pass
    else:
        return jsonify(
            result="true",
            Data="没找到对应指令",
            msg="")



@app1.route('/hometoservice', methods=["GET","POST"])
def calculate():
    global m_Cmd,m_table,m_EqNo,m_result ,m_process_state,m_msg,m_capicity,m_currentProcess,m_device_name
    if request.method == 'POST':
        params = params = request.args
        m_Cmd = params.get("Cmd", 0)
        if m_Cmd == 'set_ process':#设置当前工序
            m_currentProcess = params.get("current_ process", 0)
            return jsonify(
                           result="true",
                           Data="",
                           msg = "")
        elif m_Cmd == 'set_state':#设置设备状态
            m_process_state = params.get("current_state", 0)
            return jsonify(
                result="true",
                Data="",
                msg="")
        elif m_Cmd == 'Updata_baseInfo':#上传产能
            m_EqNo = params.get("EqNo", 0)
            m_capicity = params.get("capacity", 0)
            return jsonify(
                result="true",
                Data="",
                msg="")
    elif request.method == 'GET':
        params = params = request.args
        m_Cmd = params.get("Cmd", 0)
        if m_Cmd == 'Get_Lock_device':  # 请求机器锁定信号
            m_device_name = params.get("DC_wafer_bonding_machine", 0)
            return jsonify(
                result="true",
                Data="",
                msg="")
        elif m_Cmd == 'Get_Sheet':  # 请求配方
            m_device_name = params.get("DC_wafer_bonding_machine", 0)
            return jsonify(
                result="true",
                Config= "GJ_NAME",
                Data="",
                msg="")
        else:
            return jsonify(
                result="true",
                Data="没找到对应指令",
                msg="")
    else:
        return jsonify(
            result="true",
            Data="没找到对应指令",
            msg="")

def _startService():
    global t1
    global t2
    t1 = threading.Thread(target=lambda: app1.run(host='0.0.0.0', threaded=True,debug=False, port=5002))
    t2 = threading.Thread(target=lambda: app.run(host='0.0.0.0', threaded=True, debug=False, port=5001))
    t1.start()
    t2.start()
def _stopService():
    global t1
    global t2
    stop_thread(t1)
    stop_thread(t2)


def _async_raise(tid, exctype):
    if not inspect.isclass(exctype):
        raise TypeError("Only types can be raised (not instances)")
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("invalid thread id")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
        raise SystemError("PyThreadState_SetAsyncExc failed")


def stop_thread(thread):
    _async_raise(thread.ident, SystemExit)


if __name__ == '__main__':
    print('start')
    _startService()
相关推荐
leisoo80976 小时前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
霸道流氓气质6 小时前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
Patrick在香港6 小时前
同一份脚本,mac 正常 Windows 乱码:open() 默认编码实测(附 3.15 终局)
utf-8·windows·python·macos·跨平台·编码·标准库
weixin_419658316 小时前
CANoe 使用指南:从输出窗口到数据回放的完整实战教程
开发语言·功能测试·车载系统·自动化·汽车
当青春邂逅吉米多维奇6 小时前
C#图解教程(第5版) 同步方法
开发语言·c#
骇客野人6 小时前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质6 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
波力海苔夹心脆6757 小时前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
勿信日志7 小时前
Playwright 元素定位:一个 width>50 过滤器把 42px 的输入框删掉了
python