每天忙忙碌碌,很难静下心来搞技术。所以整体做下来思维比较混乱,反反复复地修改,不过整体的框架目前看来还是可以,达到了预期的设想。

        利用目前学到了的知识和方法,建立起来一个简单框架,并初步规划功能,开始。

        1、主页面

        先不考虑界面的美化,以实现简单功能为目标。美学和人体工程学的最后再说。

python上位机软件 pyqt上位机_pyqt

        

        2、主操作界面:

python上位机软件 pyqt上位机_Qt_02

         先搞这两个界面进行实验。

        3、编写代码。


# 这个是主函数import sys
from time import strftime
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QObject, Qt, pyqtSignal
from PyQt5 import uic
from ClockPulse import Clocker  # 自定义的周期脉冲函数,默认参数下周期为1s
import logos, bkgrd  # 导入图像资源

# 建立object,定义object范围内的信号与变量
class UiObject(QObject):  # 定义一个Object
    signal1 = pyqtSignal(int)
    float1 = 0.0

    def __init__(self, parent=None):
        super(UiObject, self).__init__(parent)


# 各个窗体的初始化
# @staticmethod
class StartToDo:
    @staticmethod
    def do1():  # 窗体初始化
        ui.form1.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)  # 关掉边框,始终最前
        ui.form1.btn_interlock.styles = [['rgb(0,255,0)', 'black', '联锁运行中'], ['red', 'white', '联锁已解除']]     # 对画面中的多态按钮进行初始化
        ui.form1.btn_pump_start.styles = [['gray', 'black', '油泵启停'], ['rgb(0,255,0)', 'black', '油泵启停']]     # 对画面中的多态按钮进行初始化

    @staticmethod
    def do2():  # 窗体初始化
        ui.form2.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)  # 关掉边框,始终最前
        ui.form2.btn_mode__yt.styles = [['rgb(0,255,0)', 'black', '双压模式'], ['#ffff00', '#bf2aff', '左压模式'], ['#bf2aff', '#ffff00', '右压模式']]  # 对画面中的多态按钮进行初始化
        ui.form2.progress_system.format = ' MPa'
    #
    @staticmethod
    def do3():  # 窗体初始化
        ui.form3.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)  # 关掉边框,始终最前

    @staticmethod
    def do4():  # 窗体初始化
        ui.form4.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)  # 关掉边框,始终最前


# 信号的连接
def connections():
    # 周期时钟的连接
    timer_05s.timeout.connect(Slots.timer_05s_timeout)
    timer_1s.timeout.connect(Slots.timer_1s_timeout)
    # signal的连接
    ui.signal1.connect(Slots.slot_signal1)
    # 画面1中的操作器件动作的连接
    ui.form1.btn_pump_start.clicked.connect(Slots.f1_pump_start_clicked)
    ui.form1.btn_interlock.clicked.connect(Slots.f1_interlock_clicked)
    # ui.form1.btn_w_ym.clicked.connect(lambda: toggle_windows(ui.forms, 1))
    ui.form1.btn_w_ym.clicked.connect(lambda: toggle_windows(ui.forms, 1))
    ui.form1.btn_w_seeting.clicked.connect(lambda: toggle_windows(ui.forms, 2))
    ui.form1.btn_w_data.clicked.connect(lambda: toggle_windows(ui.forms, 3))
    ui.form1.btnquit.clicked.connect(lambda: toggle_windows(ui.forms, 0))

    # 画面2中的操作器件动作的连接
    ui.form2.btn_return.clicked.connect(ui.form2.hide)
    ui.form2.btn_mode__yt.clicked.connect(Slots.f2_mode_yt_clicked)
    ui.form2.slider.valueChanged.connect(Slots. f2_slider_valueChanged)

    # 画面3中的操作器件动作的连接
    ui.form3.btn_return.clicked.connect(ui.form3.hide)

    # 画面4中的操作器件动作的连接
    ui.form4.btn_return.clicked.connect(ui.form4.hide)


# 切换各个窗口的显示和隐藏
def toggle_windows(forms, n):  
    i = 1
    if n == 0:
        for wd in forms[1:]:
            wd.close()  # 关闭所有窗口
    else:
        forms[n+1].show()
        for wd in forms[2:]:  # 对所有的窗口实体进行操作
            if i != n:
                wd.hide()
            i += 1


# 槽的集中地
# @staticmethod
class Slots:
    @staticmethod
    def slot_signal1(var):  # 可以测试一下进度条的各种效果
        # ui.form2.progress_system.setValue(var)                   # 普通的设置和显示
        ui.form2.progress_system.set_value_limit(var, 100)     # 超过设定阈值变红
        # ui.form2.progress_system.set_value_endline(var)    # 离终点越近越红
        # ui.form2.progress_system.set_value_G2R(var)       # 由绿变红

    @staticmethod
    def f1_interlock_clicked():
        ui.form1.btn_interlock.togg()

    @staticmethod
    def f1_pump_start_clicked():
        ui.form1.btn_pump_start.togg()  # 切换组态的子函数

    @staticmethod
    def f2_mode_yt_clicked():
        ui.form2.btn_mode__yt.togg()  # 切换组态的子函数

    @staticmethod
    def f2_slider_valueChanged(var):
        ui.signal1.emit(var)

    @staticmethod
    def timer_1s_timeout():
        ui.form1.lcd_clock.display(strftime('%Y-%m-%d %H:%M:%S'))
        ui.form2.lcd_clock.display(strftime('%Y-%m-%d %H:%M:%S'))
        ui.form3.lcd_clock.display(strftime('%Y-%m-%d %H:%M:%S'))
        ui.form4.lcd_clock.display(strftime('%Y-%m-%d %H:%M:%S'))

    @staticmethod  #模拟一个变化的浮点数变量,用进度条显示
    def timer_05s_timeout():
        ui.float1 += 0.1
        if ui.float1 > 20.0:
            ui.float1 = 0.0
        ui.signal1.emit(int(round(ui.float1*10)))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    timer_1s = Clocker()  # 定义全局1s的周期定时器
    timer_05s = Clocker(500)  # 定义全局500ms的周期定时器
    ui = UiObject()  # object的本地实体化
    ui.form1 = uic.loadUi('移动操作主屏.ui')  # 导入ui
    StartToDo.do1()  # 初始化
    ui.form2 = uic.loadUi('压煤操作屏.ui')  # 导入ui
    StartToDo.do2()  # 初始化
    ui.form3 = uic.loadUi('参数设定.ui')  # 导入ui
    StartToDo.do3()  # 初始化
    ui.form4 = uic.loadUi('数据处理.ui')  # 导入ui
    StartToDo.do4()  # 初始化
    ui.forms = [0, ui.form1, ui.form2, ui.form3, ui.form4]  # 画面的集中管理
    connections()  # 动作连接
    ui.form1.show()  # 起始画面

    sys.exit(app.exec_())

新学习到了lambda函数,确实很好用 :)


下一步的计划是连接到PLC,用snap7进行通信。

运行效果:

python上位机软件 pyqt上位机_ide_03