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

在这里插入图片描述
main.py

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

# -*- 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<12345>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

# -*- 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中插槽的本质

定义slotCompoent.vue 组件 <template><slot></slot><slot nameslot1></slot><slot name"slot2" msg"hello"></slot> </template>使用组件&#xff1a; <slotComponent><p>默认的</p>…

用Python代码锁定Excel单元格以及行和列

Excel能够帮助用户高效地组织数据&#xff0c;还支持复杂的公式计算和数据分析。而随着团队协作的日益频繁&#xff0c;保护数据的准确性和完整性变得尤为重要。在Excel表格中&#xff0c;我们可以通过锁定特定的单元格或区域&#xff0c;防止对单元格内容进行随意修改&#xf…

Golang:使用时会遇到的错误及解决方法详解

Go语言使用时常常会遇到的一些错误及解决方法&#xff0c;文中的示例代码讲解详细&#xff0c;感兴趣的小伙伴可以了解一下 1、go: go.mod file not found in current directory or any parent directory go mod init name 2、Failed to build the application: main.go:4:2:…

Java网络通信实现

UDP UDPServer import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;public class UDPServer {public static void main(String[] args) throws IOException {System.out.println("UdpServer启动");// 创建upd套接字Data…

Java进阶_接口

接口的概念 在JAVA编程语言中是一个抽象类型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface来声明。一个类通过继承接口的方式&#xff0c;从而来继承接口的抽象方法。 接口并不是类&#xff0c;编写接口的方式和类很相似&#xff0c;但是它们属于不同的概念。类…

Bankless:为什么 AI 需要 Crypto 的技术?

原文标题&#xff1a;《Why AI Needs Crypto’s Values》 撰文&#xff1a;Arjun Chand&#xff0c;Bankless 编译&#xff1a;Chris&#xff0c;Techub News 原文来自香港Web3媒体&#xff1a;Techub News 人工智能革命的梦想一直是一把双刃剑。 释放人工智能的潜力可以解…

每日算法——归并排序

什么是归并排序 归并排序是一种分治算法。它将数组不断地分成两半&#xff0c;对每一半进行排序&#xff0c;然后再将排序好的两半合并起来。通过不断重复这个过程&#xff0c;最终得到完全排序的数组。 归并排序的注意点&#xff1a; 空间复杂度&#xff1a;归并排序需要额…

第1章Hello world 5/5:Rust/Java/C++实现Hello world代码优劣势对比:运行第一个程序

讲动人的故事,写懂人的代码 1.8 对比三种语言的Hello world代码特点和优劣势 艾极思又对比了三种语言的Hello world代码。 1.8.1 Rust的Hello world代码解读 让我们详细解释一下 Rust 这一个文件中的代码,并讨论为什么使用这些语法: 1.8.1.1 文件:main.rs fn main() …

(文章复现)低温环境下考虑电池寿命的微电网优化调度

参考文献&#xff1a; [1]丁佳昀,胡秦然,吴在军,等.低温环境下考虑电池寿命的微电网优化调度[J].中国电机工程学报,2024,44(10):3815-3824. 1.摘要 储能系统作为微电网重要组成部分&#xff0c;为微电网协调能量供需提供了解决方案。然而&#xff0c;在低温环境下&#xff0c…

《软件定义安全》之六:SDN和NFV安全实践

第6章 SDN和NFV安全实践 1.基于流的安全防护 1.1 DDoS检测清洗 DDoS检测清洗应用ADS APP的设计思路&#xff1a;借助安全控制平台中流相关的组件&#xff0c;从SDN控制器中获得相应的流量&#xff0c;并根据抗DDoS应用订阅的恶意流特征进行检测&#xff0c;发现恶意流量后&a…

最新thinkphp5内核全开源女神赢口红H5公众号版第五版(100%可经营)

最新thinkphp5内核全开源女神赢口红H5公众号版第五版&#xff08;100%可经营&#xff09; 搭建教程 1、程序为thinkPHP5开发 php版本要求5.6&#xff01;不支持虚拟主机&#xff01; 2、上传程序到您的根目录&#xff01;导入m213.sql文件&#xff01;修改数据库配置文件app…

使用docker-compose搭建达梦数据库主备集群

目录 1. Docker集群的搭建 2. 检查主备数据库 3. 主备集群的JDBC连接设置 1. Docker集群的搭建 达梦的镜像文件都是tar文件&#xff0c;通过docker load命令导入&#xff1a; docker load -i dm8_20240422_x86_rh6_64_rq_ent_8.1.3.140.tar 成功导入后&#xff0c;可看到…

Android程序设计课程教学解决方案

引言 随着信息技术的飞速发展&#xff0c;智能手机和移动应用已成为现代生活不可或缺的一部分。Android作为全球最大的移动操作系统&#xff0c;其开发人才需求量巨大。高职院校作为培养高素质技能人才的重要基地&#xff0c;如何在Android程序设计课程中有效提升学生的实践能力…

7、安装依赖、连接数据库

安装依赖、连接数据库 打开datagrip软件 连接本地数据库,第一次连接会提示安装驱动,保持网络畅通跟着点击即可 创建一个sql控制台: 创建一个数据库(数据库名称可以自取) create database fullStackBlog;右击数据库新建控制台,用于创建数据表 创建一个blog的表 …

IP协议报文格式

IP协议报文格式 一: 报头格式1.1 : 4位版本1.2 : 4位首部长度1.3 : 8位服务类型 :1.4 : 16位总长度(字节数)1.5 : 8位生存时间(TTL)1.6 : 8 位协议1.7 : 32 位源IP / 32 位目的IP 一: 报头格式 1.1 : 4位版本 现在使用的也就只有IPv4,IPv6 1.2 : 4位首部长度 以 4字节为单位…

目前比较好用的LabVIEW架构及其选择

LabVIEW提供了多种架构供开发者选择&#xff0c;以满足不同类型项目的需求。选择合适的架构不仅可以提高开发效率&#xff0c;还能确保项目的稳定性和可维护性。本文将介绍几种常用的LabVIEW架构&#xff0c;并根据不同项目需求和个人习惯提供选择建议。 常用LabVIEW架构 1. …

开源VisualFbeditor中文版,vb7 IDE,VB6升级64位跨平台开发安卓APP,Linux程序

吴涛老矣&#xff0c;社区苦无64位易语言&#xff0c;用注入DLL增强菜单&#xff0c;做成VS一样的界面 终归是治标不治本&#xff0c;一来会报毒&#xff0c;二来闭源20年没更新了 开源的VB7&#xff0c;欢迎易语言的铁粉进群&#xff1a;1032313876 【Freebasic编程语言】编绎…

服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景&#xff1a; 虚拟机上Ubuntu系统安装了Mysql&#xff0c;现在有一个服务应用需要使用docker来部署&#xff0c;服务应用需要连接mysql做数据库基础使用&#xff0c;配置文件中配置了虚拟主机的IP和端口&#xff0c;但是还是无法连接到Mysql&#xff0c;报错无法连接超…

Characters 2 01(卡通可爱人物动画模型)

● 包裹● - 26名男子; - 29个女孩。 ● 使用地点 ● - 游戏。针对游戏引擎优化的模型; -乘法; 广告和营销; - 虚拟现实/增强现实。 ● 特点 ● - 你可以很容易地改变物体的颜色 - 使用UV贴图; - 对象逻辑位置的枢轴; - 模型具有逻辑名称。 ● 几何学● 62个独特的资产(…

【MySQL】(基础篇七) —— 通配符和正则表达式

通配符和正则表达式 本章介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索&#xff0c;以便对数据进行复杂过滤&#xff1b;如何使用正则表达式来更好地控制数据过滤。 目录 通配符和正则表达式LIKE操作符百分号(%)通配符下划线(_)通配符 通配符使用技巧正…