基于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())

相关新闻

最新新闻

零基础入门python21:Flask账本的数据模型——用户、分类和账目

零基础入门python21:Flask账本的数据模型——用户、分类和账目

零基础入门python21:Flask账本的数据模型——用户、分类和账目一、上一篇课后练习讲解 上一篇要求使用环境变量并验证测试配置。参考测试通过 create_app({TESTING: True, SQLALCHEMY_DATABASE_URI: sqlite:///:memory:}) 创建临时应用,再在应用上下文中…

2026/8/25 13:04:39
Agent Router 一个免费用codex,claude的网站如何接入 CC Switch

Agent Router 一个免费用codex,claude的网站如何接入 CC Switch

先登录 Agent Router 打开 Agent Router,按页面提供的方式完成登录。登录后进入控制台,左侧通常可以看到数据看板、API 令牌、使用日志、钱包和个人设置等入口 创建 API Key 进入左侧的“API 令牌”,点击“添加令牌”。名称取一个自己能认出…

2026/8/25 13:04:39
电商美工PS培训零基础怎么学 ?学设计就业推荐橡果教育

电商美工PS培训零基础怎么学 ?学设计就业推荐橡果教育

电商美工PS培训零基础怎么学 ?学设计就业推荐橡果教育 当下电商行业持续火爆,淘宝、拼多多、京东、抖音、小红书、跨境电商等平台商家数量逐年递增,市场对电商美工的需求始终处于紧缺状态。不管是品牌旗舰店、直播带货团队,还是中…

2026/8/25 13:04:39
蓝速科技丨新旧楼宇混杂场景下会议室预约门牌屏一体化改造方案

蓝速科技丨新旧楼宇混杂场景下会议室预约门牌屏一体化改造方案

在很多大型园区或企业总部的智能化升级项目中,最让人头疼的往往不是技术本身,而是建筑环境的复杂性。想象一下这样的场景:一边是刚刚落成、管线布局完美的新建写字楼,另一边则是墙体厚重、装修定型且严禁大规模破拆的老办公楼。当…

2026/8/25 13:04:39
Power BI做了RLS,AI问数会不会越权?

Power BI做了RLS,AI问数会不会越权?

先说结论 Power BI做了RLS,不代表AI问数天然不会越权 这两句话听起来很接近,实际差别很大。 假设一家企业按区域设置了行级安全(RLS): 华南经理只能看华南 华东经理只能看华东 总经理可以看全国 在Power BI报表里&…

2026/8/25 13:04:39
K8s Etcd 备份恢复|为什么恢复集群不停业务 Pod?

K8s Etcd 备份恢复|为什么恢复集群不停业务 Pod?

K8s Etcd 备份恢复超详细解析|为什么恢复集群不停业务 Pod?前言Etcd 是 K8s 的数据库,所有集群资源存在这里。很多人搞不懂: 恢复 etcd 要停 apiserver、停 etcd,为什么正在运行的业务 Pod 不会挂?1、两条完…

2026/8/25 12:59:39