Forwarded from Rachel 碎碎念 (IFTTT)
Twitter
清凌渡
从这个角度就很容易理解了
def trimMarks(m):
output = str()
waitClose = False
if len(m) == 0: return output
for i in range(0, len(m)):
char = m[i]
if char == '<': waitClose = True
if waitClose:
if char == '>': waitClose = False
else: output += char
return output
... 我只好手写了,手生... 居然还写了一段时间...
duangsuse::Echo
规范大概是这样: Code 是一个文本图层,包含程式码,目前仅仅创建 VFS 不需要关心其内容 Trace 是一个文本图层,包含变量的追踪 要提供一个 GUI,展示变量列表 List(Label, Textfield) 『同步』操作:利用正则表达式解析所有键值对 (k = v) /(\w+)\s*=\s*(.+)$/ 更新列表 『更新』操作:替换原文本为更新值后的文本 Visual 是可视化图层组,包含所有需要可视化的图层 这些图层的名字做固定处理即可得到相应数据指针的名字 Vals 是不变…
要提供这样的插件接口适配器:
class GimpAccess:
def init(self, gimp = gimp, pdb = gimp.pdb):
def message(self, text):
def layer_root(self):
def layer_is_group(self, layer):
def layer_get_children(self, layer):
def layer_hide(self, layer):
def layer_show(self, layer):
def get_text_layer_marks(self, layer):
def set_text_layer_marks(self, layer):
class VisualGimpAbstraction (GimpAccess):
def layer_get_by_name(name): # private
def layer_get_by_path(path):
def check_layers(): # private
def codeLayer():
def traceLayer():
def visualLayers():
def codePointerLayer():
def pointerLayerOf(layer):
def valLayerOf(name):
class VisualHelper (VisualGimpAbstraction):
def traceMap():
class Helpers: pass
def _trimMarks(m):
Helpers.trimMarkups = _trimMarkUps
class GimpAccess:
def init(self, gimp = gimp, pdb = gimp.pdb):
def message(self, text):
def layer_root(self):
def layer_is_group(self, layer):
def layer_get_children(self, layer):
def layer_hide(self, layer):
def layer_show(self, layer):
def get_text_layer_marks(self, layer):
def set_text_layer_marks(self, layer):
class VisualGimpAbstraction (GimpAccess):
def layer_get_by_name(name): # private
def layer_get_by_path(path):
def check_layers(): # private
def codeLayer():
def traceLayer():
def visualLayers():
def codePointerLayer():
def pointerLayerOf(layer):
def valLayerOf(name):
class VisualHelper (VisualGimpAbstraction):
def traceMap():
class Helpers: pass
def _trimMarks(m):
Helpers.trimMarkups = _trimMarkUps
GimpApi.py
8.2 KB
#Python 程序现在使用的 GimpApi 辅助库可以使用了。除了往常的功能外,还提供了 join stream(generator)、Xml Builder 的功能。如果需要,以后还会写 Xml Parser
GimpApi.py
9.5 KB
更新的 GIMP 脚本编写辅助库
duangsuse::Echo
GimpApi.py
下一步可能是支持 GIMP 的导入导出和画布操作功能
可以让 Python 用 GIMP 画画,这样就有更多可能
可以让 Python 用 GIMP 画画,这样就有更多可能
duangsuse::Echo
规范大概是这样: Code 是一个文本图层,包含程式码,目前仅仅创建 VFS 不需要关心其内容 Trace 是一个文本图层,包含变量的追踪 要提供一个 GUI,展示变量列表 List(Label, Textfield) 『同步』操作:利用正则表达式解析所有键值对 (k = v) /(\w+)\s*=\s*(.+)$/ 更新列表 『更新』操作:替换原文本为更新值后的文本 Visual 是可视化图层组,包含所有需要可视化的图层 这些图层的名字做固定处理即可得到相应数据指针的名字 Vals 是不变…
现在大概差:
GUI 的一个 Listbox(Label, Text) 组件正在使用 Listbox 实现
这个列表的功能大概就是『做一帧程序步骤的时候,把变更的变量修改一下,然后就点一下更新就可以同步到程序视图』
Trace 的更新和同步按钮已经加上了,解析和 dump 也已经完成
GUI 的一个 Listbox(Label, Text) 组件正在使用 Listbox 实现
这个列表的功能大概就是『做一帧程序步骤的时候,把变更的变量修改一下,然后就点一下更新就可以同步到程序视图』
Trace 的更新和同步按钮已经加上了,解析和 dump 也已经完成
Trace 驱动所有的 Visual 箭头指向Vals 是不变量的图层组,其中每个图层都对照了一个 Visual 里的图层,映射方式是 ("v" + x)
每个 Pointers 项目都对照到了 Visual 里的图层或 Code,映射方式是 ("p" + x.lower() + "s")
更新箭头在加提供一个『更新箭头』操作,根据指定的『Trace 层』变量名自动显示 Trace 层变量指向(数组下标,从 0 起始)并且隐藏前一个箭头的显示(上次设置的箭头)上移下移/重置 Code 指针也在进行中
duangsuse::Echo
https://github.com/duangsuse/GimpVisual #GitHub #Python #project
https://github.com/duangsuse/GimpVisual/blob/master/Markup.py
从中抽提出来了 MarkupBuilder,还比较好玩,现在已经支持写带缩进的文档了:
<head>
<title>Hello World</title>
</head>
<body>
<text>
<b>String</b>
<a id="str">|sg.</a>
</text>
</body>
</html>
不使用缩进也可以:
<html><head><title>Hello World</title></head><body><text><b>String</b><a id="str">|sg.</a></text></body></html>
Util.py 里没有二进制处理的函数或者 Maybe, Either, Ap, Functor 什么的,不是很好.... 希望早点写完
从中抽提出来了 MarkupBuilder,还比较好玩,现在已经支持写带缩进的文档了:
from Markup import MarkupBuilder<html>
def test():
m = MarkupBuilder(2)
m > 'html'
m > 'head'
m > 'title'
m < 'Hello World'
m <= 2
m > 'body'
m > 'text'
with m.tag("b"):
m < 'String'
m >= ['a', {'id': 'str'}]
m < '|sg.'
m <= 4
return m
mark = test()
print(mark.make())
<head>
<title>Hello World</title>
</head>
<body>
<text>
<b>String</b>
<a id="str">|sg.</a>
</text>
</body>
</html>
不使用缩进也可以:
<html><head><title>Hello World</title></head><body><text><b>String</b><a id="str">|sg.</a></text></body></html>
Util.py 里没有二进制处理的函数或者 Maybe, Either, Ap, Functor 什么的,不是很好.... 希望早点写完
GitHub
duangsuse/GimpVisual
🐺 Alogrithm visualization with Gimp Python script. Contribute to duangsuse/GimpVisual development by creating an account on GitHub.
duangsuse::Echo
https://github.com/duangsuse/GimpVisual/blob/master/Markup.py 从中抽提出来了 MarkupBuilder,还比较好玩,现在已经支持写带缩进的文档了: from Markup import MarkupBuilder def test(): m = MarkupBuilder(2) m > 'html' m > 'head' m > 'title' m < 'Hello World' m <=…
Python 和 Lua 一样,都太灵活了,连类定义方法分派都是那么的... 动态
而且奇怪....
不过习惯了
而且奇怪....
不过习惯了
duangsuse::Echo
Python 和 Lua 一样,都太灵活了,连类定义方法分派都是那么的... 动态 而且奇怪.... 不过习惯了
最终导致,一但新增限制,就会造成麻烦。
duangsuse::Echo
https://github.com/duangsuse/GimpVisual/blob/master/Markup.py 从中抽提出来了 MarkupBuilder,还比较好玩,现在已经支持写带缩进的文档了: from Markup import MarkupBuilder def test(): m = MarkupBuilder(2) m > 'html' m > 'head' m > 'title' m < 'Hello World' m <=…
使用 GIMP 的 Python REPL 开发插件在多线程上好像有很严重的问题,不可能直接这么做了
之前一直把开发用的 Tcl/Tk 主事件循环放在 main 上
然而,回来发现这么做导致 gimp 不能即使更新后面的图片显示....
我又单独给 gui 开个线程放事件循环,可是据观察发现那个线程的性能已经低到了可怕的程度... 一个 Tk 按钮要花费 5 秒以上才能被初始化...
之前一直把开发用的 Tcl/Tk 主事件循环放在 main 上
然而,回来发现这么做导致 gimp 不能即使更新后面的图片显示....
我又单独给 gui 开个线程放事件循环,可是据观察发现那个线程的性能已经低到了可怕的程度... 一个 Tk 按钮要花费 5 秒以上才能被初始化...
duangsuse::Echo
最终导致,一但新增限制,就会造成麻烦。
#Python 嗯,也可以去用 Cython
我也就觉得 CPython 好点的就是强化了 Lua 的元方法设计、FFI、面向对象系统、模块化系统、2D 文法、有 Fiber、Async function
其他的... 我觉得不怎么样
我也就觉得 CPython 好点的就是强化了 Lua 的元方法设计、FFI、面向对象系统、模块化系统、2D 文法、有 Fiber、Async function
其他的... 我觉得不怎么样