From 640066cfe80c10ddacbc3cc5344a70791e91f32a Mon Sep 17 00:00:00 2001 From: hzy15610046011 <1295752786@qq.com> Date: Thu, 3 Sep 2020 11:42:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=8E=A7=E4=BB=B6=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=A0=91=E5=B1=95=E7=A4=BA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ipython_console/test_qtconsole.py | 34 ++++- .../packages/workspace_inspector/main.py | 117 +++++++++++++----- pyminer2/ui/base/widgets/treeviews.py | 9 +- 3 files changed, 123 insertions(+), 37 deletions(-) diff --git a/pyminer2/extensions/packages/ipython_console/test_qtconsole.py b/pyminer2/extensions/packages/ipython_console/test_qtconsole.py index 86ffbb52..591182aa 100644 --- a/pyminer2/extensions/packages/ipython_console/test_qtconsole.py +++ b/pyminer2/extensions/packages/ipython_console/test_qtconsole.py @@ -2,6 +2,8 @@ # -*- coding: utf-8 -*- """ +注意:这个console在自动补全出不来的时候会出现错误,导致界面闪退。因此我直接屏蔽了自动补全功能。 + Created on 2020/8/24 @author: Irony @email: 892768447@qq.com @@ -13,7 +15,7 @@ import pickle import base64 from PyQt5.QtCore import QObject, pyqtSignal, QThread, QWaitCondition, QMutex, QTimer -from PyQt5.QtGui import QTextCursor +from PyQt5.QtGui import QTextCursor, QFontMetrics from qtconsole.manager import QtKernelManager from qtconsole.rich_jupyter_widget import RichJupyterWidget @@ -84,9 +86,31 @@ class ConsoleWidget(RichJupyterWidget): """ self.kernel_manager = kernel_manager self.kernel_client = kernel_client - ini_py = os.path.join(self.lib.get_main_program_dir(), 'extensions/packages/ipython_console/initialisation.py') + ini_py = os.path.join(self.lib.get_main_program_dir(), 'extensions', 'packages' + , 'ipython_console', 'initialisation.py') self.execute_file(ini_py, hidden=True) + def _update_list(self): + try: + super(ConsoleWidget, self)._update_list() + except: + import traceback + traceback.print_exc() + + def _handle_complete_reply(self, msg): + ''' + 重写,加上trycatch,直接禁用了没有其他的变化,故不做类型标注。 + :param msg: + :return: + ''' + return + + try: + super()._handle_complete_reply(msg) + except: + import traceback + traceback.print_exc() + def _banner_default(self): """ 自定义控制台开始的文字 @@ -101,7 +125,7 @@ class ConsoleWidget(RichJupyterWidget): self.init_thread.wait(500) super(ConsoleWidget, self).closeEvent(event) - def execute_file(self, file:str, hidden:bool=False): + def execute_file(self, file: str, hidden: bool = False): if not os.path.exists(file) or not file.endswith('.py'): raise FileNotFoundError(f'{file} not found or invalid') base = os.path.basename(file) @@ -138,11 +162,11 @@ class ConsoleWidget(RichJupyterWidget): """重写的方法。原本before_prompt属性是False。""" self._append_plain_text(text, before_prompt=False) - def _execute(self, source:str, hidden:bool=False): + def _execute(self, source: str, hidden: bool = False): if self.is_first_execution: self.is_first_execution = False else: - data = {} #self.data_manager.get_all_var() # send data + data = {} # self.data_manager.get_all_var() # send data data_b64 = base64.b64encode(pickle.dumps(data)).decode('ascii') source = f'__inject("{data_b64}")\n{source}' super()._execute(source, hidden) diff --git a/pyminer2/extensions/packages/workspace_inspector/main.py b/pyminer2/extensions/packages/workspace_inspector/main.py index 608ab13b..b7dee865 100644 --- a/pyminer2/extensions/packages/workspace_inspector/main.py +++ b/pyminer2/extensions/packages/workspace_inspector/main.py @@ -1,7 +1,7 @@ from typing import Dict -from PyQt5.QtWidgets import QTableWidgetItem, QTableWidget, QTreeView, QTreeWidget, QTreeWidgetItem,\ - QWidget, QVBoxLayout, QPushButton +from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QWidget, QVBoxLayout, QPushButton, QHBoxLayout +from PyQt5.QtCore import pyqtSignal from .dataclient import Client @@ -26,18 +26,66 @@ class Interface: class PMJsonViewWidget(QTreeWidget): + nodes: Dict[str, 'QTreeWidgetItem'] = {} + signal_show_data_value = pyqtSignal(str) + signal_data_saveas = pyqtSignal(str) + signal_data_open = pyqtSignal(str) + def __init__(self, parnet=None): super().__init__(parent=None) root1 = QTreeWidgetItem(self) - # self.setColumnCount(2) - # root_name = '123' - # root1.setText(0, root_name) - # para_list = ["alpha", "beta", "gama"] - # for i in range(len(para_list)): - # child = QTreeWidgetItem(root1) # child of root - # child.setText(0, para_list[i]) + self.setColumnCount(2) self.expandItem(root1) self.root = root1 + self.auto_expand = True + + def set_data(self, data_dic, root): + ''' + 根据数据生成metadata,并且显示数据 + metadata的生成算法需要继续看。 + :param data_dic: + :param root: + :return: + ''' + print(data_dic) + + data_name = list(data_dic.keys())[0] + data = data_dic[data_name] + size = 1 + import numpy as np + if type(data) == np.ndarray: + size = data.shape + elif hasattr(data, '__len__'): + size = len(data) + metadata_dic = {'size': size, 'value': data} + + if data_name in self.nodes.keys(): + data_node = self.nodes[data_name] + data_node.setText(0, data_name) + data_node.setText(1, repr(data)) + + data_node.takeChildren() + self.set_data_view(metadata_dic, self.nodes[data_name]) + pass + + else: + child = QTreeWidgetItem(self) + self.nodes[data_name] = child + child.setText(0, data_name) + child.setText(1, repr(data)) + + self.itemClicked.connect(self.on_item_clicked) + self.set_data_view(metadata_dic, child) + if self.auto_expand: + self.expandItem(child) + else: + self.collapseItem(child) + + def on_item_clicked(self, item: QTreeWidgetItem, col: int) -> None: + self.show_data_value(item, col) + + def show_data_value(self, item: QTreeWidgetItem, col: int) -> None: + self.signal_show_data_value.emit() def set_data_view(self, data_dic: Dict[str, object], root): ''' @@ -49,25 +97,20 @@ class PMJsonViewWidget(QTreeWidget): for k in data_dic.keys(): print(data_dic[k]) if type(data_dic[k]) == dict: - child = QTreeWidgetItem(root) - child.setText(0, k) - self.set_data_view(data_dic[k], child) - elif type(data_dic[k]) == str: - child = QTreeWidgetItem(root) - child.setText(0, k) - child.setText(1, data_dic[k]) - - elif type(data_dic[k]) == list: - for item in data_dic[k]: - print(item) - child = QTreeWidgetItem(root) - child.setText(0, k) - child.setText(1, item) + pass + # child = QTreeWidgetItem(root) + # child.setText(0, k) + # self.set_data_view(data_dic[k], child) + # elif type(data_dic[k]) == list: + # for item in data_dic[k]: + # child = QTreeWidgetItem(root) + # child.setText(0, k) + # child.setText(1, item) else: child = QTreeWidgetItem(root) child.setText(0, k) child.setText(1, str(data_dic[k])) - # raise Exception('invalid json!') + class PMWorkspaceInspectWidget(QWidget): @@ -76,13 +119,30 @@ class PMWorkspaceInspectWidget(QWidget): layout = QVBoxLayout() self.var_tree = PMJsonViewWidget(parent) layout.addWidget(self.var_tree) - b = QPushButton("show") - layout.addWidget(b) + control_layout = QHBoxLayout() + b = QPushButton("测试") + button_expand = QPushButton('全部展开') + button_collapse = QPushButton('全部折叠') + control_layout.addWidget(b) + control_layout.addWidget(button_expand) + control_layout.addWidget(button_collapse) + layout.addLayout(control_layout) b.clicked.connect(self.show_data_view) + button_collapse.clicked.connect(self.collapse_all) + button_expand.clicked.connect(self.expand_all) self.setLayout(layout) self.data_client = Client() + def expand_all(self): + self.var_tree.auto_expand = True + self.var_tree.expandAll() + + def collapse_all(self): + + self.var_tree.auto_expand = False + self.var_tree.collapseAll() + def connect_to_datamanager(self, datamanager): self.datamanager = datamanager self.data = self.datamanager.get_all_var() @@ -90,9 +150,10 @@ class PMWorkspaceInspectWidget(QWidget): def on_modification(varname: str, variable): self.data[varname] = variable - self.var_tree.set_data_view({varname: variable}, self.var_tree.root) + self.var_tree.set_data({varname: variable}, self.var_tree) # need to detect whether it is modified or created + def on_deletion(varname: str): self.data.pop(varname) # self.var_tree.set_data_view(self.data, self.var_tree.root) @@ -124,5 +185,5 @@ if __name__ == '__main__': 'C': {'type': 'matrix', 'value': '[[1,2]]', }, 'D': {'type': 'matrix', 'value': '[[0]]', }, 'row': ['left', 'x2'], 'column': ['column'], 'u': ['u'], 'sys': 'str'}} - sa.set_data_view(data_dic, sa) + sa.show_data_view(data_dic, sa) sys.exit(app.exec()) diff --git a/pyminer2/ui/base/widgets/treeviews.py b/pyminer2/ui/base/widgets/treeviews.py index 95a04088..59ba964a 100644 --- a/pyminer2/ui/base/widgets/treeviews.py +++ b/pyminer2/ui/base/widgets/treeviews.py @@ -15,10 +15,10 @@ class RewriteQFileSystemModel(QFileSystemModel): return u'名称' elif (p_int == 1) and (role == Qt.DisplayRole): return u'大小' - elif (p_int == 2) and (role == Qt.DisplayRole): - return '类型' - elif (p_int == 3) and (role == Qt.DisplayRole): - return '修改日期' + # elif (p_int == 2) and (role == Qt.DisplayRole): + # return '类型' + # elif (p_int == 3) and (role == Qt.DisplayRole): + # return '修改日期' else: return super().headerData(p_int, Qt_Orientation, role) @@ -39,6 +39,7 @@ class PMFilesTreeview(QTreeView): self.setObjectName("treeView_files") self.header().setSortIndicatorShown(True) + from pyminer2.extensions.extensionlib.pmext import PluginInterface -- Gitee