ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于QtPy (PySide6) 的PLC-HMI工程实战记录(四)组态当前动作的联锁关系画面

基于QtPy (PySide6) 的PLC-HMI工程实战记录(四)组态当前动作的联锁关系画面 1、组态画面并设置样式表由于动作并不多懒得建自动生成画面的脚本了手动组态一下画面并规律命名。import re import sys from PySide6.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton from PySide6.QtCore import Signal, Slot import 当前动作指示模板_ui class NowDoForm(QWidget, 当前动作指示模板_ui.Ui_Form): now_signal Signal(list) def __init__(self,parentNone): super(NowDoForm, self).__init__(parent) # self.form form self.setupUi(self) self.init_setup() self.now_signal.connect(self.on_now_signal) # self.nodes list # 每个节点的状态 self.result True # 动作联锁的结果 # self.on_now_signal([[True,False], [[True,False],]]) def get_all_children(self, root_widget: QWidget, result_list: list None): if result_list is None: result_list [] # 遍历当前直接子控件 for child in root_widget.children(): # 只筛选QWidget子类排除布局、定时器等非可视对象 if isinstance(child, QWidget): result_list.append(child) # 递归深入下一层 self.get_all_children(child, result_list) return result_list # 根据后缀自然排序 def natural_key(self, name: str): 拆分数字与文本实现自然排序 return [int(s) if s.isdigit() else s.lower() for s in re.split(r(\d), name)] def init_setup(self): # LineV all_widget self.get_all_children(self) self.limit_lamps [w for w in all_widget if limit_lamp in w.objectName()] self.limit_lamps.sort(keylambda w: self.natural_key(w.objectName())) self.lab_conditions [w for w in all_widget if nowDo_cond in w.objectName()] # self.lab_conditions.sort(keylambda w: self.natural_key(w.objectName())) # self.line_vs [w for w in all_widget if LineV in w.objectName()] # self.line_hs [w for w in all_widget if LineH in w.objectName()] self.lines [w for w in all_widget if Line in w.objectName()] # self.lines.sort(keylambda w: self.natural_key(w.objectName())) Slot() def on_now_signal(self, signal): self.result True # 动作联锁的结果 # 限位指示灯 signal_lamps signal[0] for i,lamp_val in enumerate(signal_lamps): self.limit_lamps[i].setProperty(light, lamp_val) # print(self.limit_lamps[i], lamp_val) self.limit_lamps[i].style().unpolish(self.limit_lamps[i]) self.limit_lamps[i].style().polish(self.limit_lamps[i]) # 条件标签 signal_conditions signal[1] for i,node_vols in enumerate(signal_conditions): # 信号的标签值列表node_vols是每一个节点的标签列表 condition_i [lab_cond for lab_cond in self.lab_conditions if fcond{i} in lab_cond.objectName()] # 第i组标签列表 condition_i.sort(keylambda w: self.natural_key(w.objectName())) node_result False # 本节点的运算结果 for j, lab_cond in enumerate(condition_i): # 每个节点的参数分配 lab_cond.setProperty(vol, node_vols[j]) lab_cond.style().unpolish(lab_cond) lab_cond.style().polish(lab_cond) lines [l for l in self.lines if l.objectName().endswith(f{i}_{j})] for line in lines: line.setProperty(vol, node_vols[j]) node_result node_result or node_vols[j] # print(node_result) line.style().unpolish(line) line.style().polish(line) # if node_result: line [l for l in self.lines if l.objectName().endswith(f{i}_0)][0] line.setProperty(vol, node_result) line.style().unpolish(line) line.style().polish(line) self.result self.result and node_result # # print(self.result) lab_result [l for l in self.lab_conditions if l.objectName().endswith(result)][0] # print(lab_result) lab_result.setProperty(vol, self.result) lab_result.style().unpolish(lab_result) lab_result.style().polish(lab_result) if __name__ __main__: app QApplication(sys.argv) form NowDoForm() window QWidget() window.setStyleSheet(.QWidget{background-color: hsl(210, 20%, 25%);}) window.setGeometry(100,100,900,500) layout QVBoxLayout() btn1 QPushButton(btn1) btn2 QPushButton(btn2) window.setLayout(layout) layout.addWidget(form) layout.addWidget(btn1) layout.addWidget(btn2) window.show() btn1.clicked.connect(lambda :form.now_signal.emit([[False,True], [[False,True], [False,True, False],[True],[False, False]]])) btn2.clicked.connect( lambda: form.now_signal.emit([[True, False], [[True, False], [False, True, False], [True], [True, False]]])) sys.exit(app.exec())
返回列表