 的PLC-HMI工程實(shí)戰(zhàn)記錄(四)組態(tài)當(dāng)前動(dòng)作的聯(lián)鎖關(guān)系畫面)
1、組態(tài)畫面并設(shè)置樣式表由于動(dòng)作并不多懶得建自動(dòng)生成畫面的腳本了手動(dòng)組態(tài)一下畫面并規(guī)律命名。import re import sys from PySide6.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton from PySide6.QtCore import Signal, Slot import 當(dāng)前動(dòng)作指示模板_ui class NowDoForm(QWidget, 當(dāng)前動(dòng)作指示模板_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 # 每個(gè)節(jié)點(diǎn)的狀態(tài) self.result True # 動(dòng)作聯(lián)鎖的結(jié)果 # 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 [] # 遍歷當(dāng)前直接子控件 for child in root_widget.children(): # 只篩選QWidget子類排除布局、定時(shí)器等非可視對(duì)象 if isinstance(child, QWidget): result_list.append(child) # 遞歸深入下一層 self.get_all_children(child, result_list) return result_list # 根據(jù)后綴自然排序 def natural_key(self, name: str): 拆分?jǐn)?shù)字與文本實(shí)現(xiàn)自然排序 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 # 動(dòng)作聯(lián)鎖的結(jié)果 # 限位指示燈 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]) # 條件標(biāo)簽 signal_conditions signal[1] for i,node_vols in enumerate(signal_conditions): # 信號(hào)的標(biāo)簽值列表node_vols是每一個(gè)節(jié)點(diǎn)的標(biāo)簽列表 condition_i [lab_cond for lab_cond in self.lab_conditions if fcond{i} in lab_cond.objectName()] # 第i組標(biāo)簽列表 condition_i.sort(keylambda w: self.natural_key(w.objectName())) node_result False # 本節(jié)點(diǎn)的運(yùn)算結(jié)果 for j, lab_cond in enumerate(condition_i): # 每個(gè)節(jié)點(diǎn)的參數(shù)分配 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())