前言

  过年那段时间,自学了 React 框架一段时间
  然后张峥前辈给我安排了这个基于 XML 配置的检查界面开发。
  其实不使用 XML 用 Json 配置也是完全可行的。
  当时我考虑到 XML 可以实现类似于 HTML 的组件化效果,因此在开发的过程中夹带了很多私货。

FTDY_UI_Library

目前初步的框架已经搭建完成


窗口生成

根据XML 配置文件进行 UI 生成,便于快速搭建窗口进行修改。


层级结构

框架的层级结构


控件注册

所有的控件都保持类名和文件名一致的形式,

这样就可以通过xml的标签获取到相关的组件。

通过读取 Component_UI 中相同名称的 ui 文件 生成对应的界面。

可以在 py 文件加入代码来扩展组件的功能


控件文件

ui 文件都配图说明相关的控件的名称

便于后面进行调用


布局文件

用于定义页面的布局


布局文件

检查函数可以通过xml定义的路径获取

路径自动索引到 Publish_Check 文件夹下

布局文件

检查函数的类名固定为 Check 函数

固定调用 run 函数进行检查 fix 函数进行修正操作


组件

布局文件

  • 检查功能触发
  • 全部检查功能触发

布局文件

  • 翻页功能
  • img picker 加载单个图片和目录

布局文件

  • 右键删除图片路径
  • img picker 拖拽加载图片

布局文件

  • tag 控件功能
    • 左键切换位置
    • 双击修改标签
    • 右键删除标签
    • +号标按钮添加新的标签

2019-03-12

Python UI 库开发

装饰器开发

  • 改良触发效果
  • 添加消息 print 以及数据输效果

数据链接

  • 根据当前的 check_item 状态 实现下一页按钮功能冻结
  • 链接当前复选框勾选的 check_item 用于全部检查按钮的触发
  • 将当前数据状态在主界面中进行管理(这种管理方式并不好)

构思 XMLParser 文件

  • 制作解析文件触发的思维导图

目前效果

gif

2019-03-14

Python UI 库开发

XML_Parser 开发完成

分类触发task交互

  • output - 输出
  • attrname - 自定义变量的输出
  • input - 输入

BUG修复

  • 将task传入到 Check 和 Process 相关的执行函数中
  • 给所有控件 添加了initAttrib函数来初始化部分共同属性的处理
  • 添加了 getPublishWin 函数来获取当前界面的 PublishWin 实例
    过去采用的方案是通过 self.window() 来获取当前页面
    但是在Maya2015下无法获取相同的控件
    直接导致无法进行数据交互
    于是我通过递归遍历的方法专门查找窗口的 PublishWin 实例获取数据
  • 改良的了parse的解析方法,支持self函数扩展功能

2019-03-16

优化 XML_Parser 开发完成

分类触发task交互

  • input - 输入 界面生成时调用
  • output - 输出 界面销毁时调用
  • attrname - 自定义task属性输出 输出方案和output一样
  • generating - xml生成过程中的调用
  • complete - xml生成完成调用

取消了控件对 XMLParser 和 PublishWin 的代码依赖
通过 parse 属性传入配置进行相关调用,避免库文件被多次同时地修改。

alt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
self.parse = {
# 可填写5种不同的状态类型
"generating" : { # generating 可以定义 complete 中的参数
# 传入的控件
# self代表当前控件函数
"self": [{
"method":"getItemList", # 执行的函数
"return":"check_item_list", # 返回值将会赋予到 XMLParser.check_item_list 中
}]
},
"complete" : { # complete 实现对多个控件之间的交互管理
"self": {
"method":"setCheckButton",
"param":"check_item_list,check_button_list,next_button_list",
}
},
"output" : { # output 界面销毁时执行相关的函数
# 也可以是ui文件中定义的其他Qt控件 并且直接调用 Qt 已有的方法
"Submit_ComboBox": {
"method":"currentText",
"return":"task.type",
},
"Mode_ComoBox": {
"method":"currentText",
"return":"task.mode",
},
},
"input" : {# input 界面生成时执行相关的函数
"self": [
{
"method":"submitLoad",
"param":"task.type",
},
{
"method":"modeLoad",
"param":"task.mode",
}
]
},
"attrname" : {# attrname 将在xml定义的属性传入到 task 的属性中 此处执行return无效
"self": {
"method":"getImgList",
}
}
}

上图简单概括了 parse 属性的填写方法
通过字典(json)的形式存储类的parse配置
parse字典可以填写触发的5种类型来完成不同的调用(对应上面的五种状态)

  • “input” - 输入类型
  • “output” - 输出类型
  • “attrname” - 自定义属性类型
  • “generating” - xml生成类型
  • “complete” - xml完成类型
    这五个属性之下可以填下相关的控件,通常填写 self ,这样可以在当前控件代码下扩展调用的函数。
    控件之下有 method param return 三个可定义值。
  • “method” - 执行当前控件的方法
  • “param” - 当前执行方法传入的属性
  • “return” - 当前方法返回值的接受属性
注意:

generating complete 指向 XMLParser

input output attrname 指向 PublishWin

2019-3-15 字符串输出报错问题

  昨天晚上我和前辈研究了为什么字符串没有办法打印却有可以输出的问题。
  经过我今天早上的研究,我发现问题是在读取的文件上,文件上按照utf-8的格式存储的。所以读取出来也是utf-8字符,控制台打印需要decode(“utf-8”)才可以正常输出。这也解释了为什么直接输出字符串反而不会报错。

PyDoc 开发

PyDoc Python 文件 正则表达式提取

  今天研究了 正则表达式 提取方案,让我对python正则运用有了全新的认识。
  不过今天也被正则的思路所固化了,让我走了很多弯路。
  我希望通过正则表达式来提取文件中所有的类,但是遇到的问题是如果类的声明是连在一起的。
  那么上一个类的结束匹配会占用下一个类的关键字,从而影响到下一个类的匹配。
  我一直试图通过正则表达式来解决这个问题,所有在这条路上专研了很久也没有好的想法。
  最后我突然想到可以通过字符串的处理将文件中的类切割出来。
  那么可以通过字符串的split处理,来讲相关的内容存到数组当中呢。
  最后通过正则表达式来匹配单个类中的文件就可以完美实现类的提取。


  同样的,我也想将文件中的函数声明提取出来,我原以为只需要将正则表达式的关键字修改即可。
  然而这样会将类当中的函数声明也牵连了。
  所以这里需要类提取的内容移除之后再进行相关的匹配。
  然而如何将字符串的特定内容清理掉呢,想来想去我一直以为用remove方法,其实remove是数组的处理。
  经过网上查了之后,我发现可以使用replace函数,将匹配的内容替换为空即可。


  目前已经完成了,class和def的提取,下面还需要开发 对 class 和 def 的特定内容的提取。

2019-03-18

控件 parse 属性

分类触发task交互

  • input - 输入 界面生成时调用
  • output - 输出 界面销毁时调用
  • attrname - 自定义task属性输出 输出方案和output一样
  • message - 信息输出控件
  • generating - xml生成过程中的调用
  • complete - xml生成完成调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
self.parse = {
# 可填写4种不同的状态类型
"output" : { # output 界面销毁时执行相关的函数
# 也可以是ui文件中定义的其他Qt控件 并且可以直接调用 PyQt 已有的方法
"Submit_ComboBox": {
"method":"currentText",
"return":"task.type",
},
"Mode_ComoBox": {
"method":"currentText",
"return":"task.mode",
},
},
"input" : {# input 界面生成时执行相关的函数
"self": [
{
"method":"submitLoad",
"param":"task.type",
},
{
"method":"modeLoad",
"param":"task.mode",
}
]
},
"attrname" : {# attrname 将在xml定义的属性传入到 task 的属性中 此处return属性无效(根据xml属性固定传入)
"self": {
"method":"getImgList",
}
},
"message" : {# message 装饰器输出的信息 传递到的控件
"self": {
# 固定 get & set 属性 传入相关可执行的方法
"get":"toPlainText",# 装饰器需要获取控件已有的内容避免新的信息覆盖旧的信息
"set":"setText",
}
}
}

上图简单概括了 parse 类型的填写方法
通过字典(json)的形式存储类的parse配置
parse字典可以填写触发的5种类型来完成不同的调用(对应上面的四种状态)

  • “input” - 输入类型
  • “output” - 输出类型
  • “attrname” - 自定义属性类型
  • “message” - 信息输出类型
    这四个类型之下可以填下相关的控件,通常填写 self ,这样可以在当前控件代码下扩展调用的函数。

input output attrname 这三种类型下有 method param return 三个可定义值。

  • “method” - 执行指定控件的方法
  • “param” - 当前执行方法传入的属性
  • “return” - 当前方法返回值的接收属性

message 类型下有 get set 两个可定义值。

  • “get” - 获取方法 - return 字符串信息
  • “set” - 输出方法 - 传入输出的字符串信息
注意:

input output attrname 三种类型的参数和返回值都指向 PublishWin 中的属性

2019-03-19

完成 PyDoc 开发

  • 抓取Py文件中的数据
  • 通过 Qt 的 filewatcher 实时抓取数据
  • todo - 后续可以按照前辈的说法做成git钩子

抓取

改良 docsify 文档显示效果

  • 改用 dark 主题
  • 通过jq实现目录上的扩展按钮功能
  • 通过 sessionstorage 将数据存储到浏览器当中,实现跳转调用相关数据,提高交互友好度

抓取