我想展示OPC服务器中节点的组织树视图。我使用PyQt5
和opcua
来实现这一点。为了尝试这个代码,我使用了Prosys OPC UA Simulation Server,它工作得很好。看起来是这样的:
但是,当我尝试将代码与real publicly available servers一起使用时,应用程序崩溃了。我相信这是因为在真正的服务器上,现有的节点数量是巨大的,而且应用程序还有很多要处理的。你知道吗
所以我想知道是否有一种方法可以满足“按需”的需求。也就是说,仅当用户单击某个节点时才查找子节点,以便只有应该在屏幕上的节点才作为QTreeWidget
对象中的项出现。我不知道这是否可行,因为目前我正在一次性地完全填充树,而不仅仅是当用户要求查看某个节点的子节点时。你知道吗
这是我当前的代码:
import sys
from opcua import Client
from PyQt5 import QtWidgets, QtGui
class Window(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.node_tree = QtWidgets.QTreeWidget()
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.node_tree)
self.setLayout(layout)
self.client = Client('opc.tcp://127.0.0.1:53530/UA/Sim')
self.client.connect()
self.root = self.client.get_root_node()
self.fill_tree(self.node_tree, self.root)
def fill_tree(self, group, node):
item = QtWidgets.QTreeWidgetItem(group, [str(node)])
children = node.get_children()
variables = node.get_variables()
for child in children:
if child in variables:
QtWidgets.QTreeWidgetItem(item, [str(child) + ' (variable)'])
else:
self.fill_tree(item, child)
def closeEvent(self,event):
self.client.disconnect()
sys.exit(0)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = Window()
ex.show()
sys.exit(app.exec_())
我设法找到了一个可行的解决办法,但我认为这远不是最好的办法。代码如下:
关于节点id的注释与PyQt中的树无关,它们只是与
opcua
库相关的格式化问题。你知道吗我认为可以(而且应该)改进的是,每次展开一个项时,它的所有子项都会用
item.takeChildren()
删除,以便稍后在调用add_node_to_tree()
方法时将它们添加回来。我知道这不对,但我找不到别的办法。你知道吗相关问题 更多 >
编程相关推荐