- 本文含有严重的个人主观情感, 请谨慎阅读
- 部分框架是 Python + HTML + CSS + JS 混搭的, 比如 Electron, Carlo 之类. 之所以也放到本文, 是因为我认为借助前端的优势可以构建出现代化的界面设计, 再加上后端用 Python 逻辑也可以发挥强大的效果
问题1: 网络延迟
Atlas 的 Hello World 示例挺简单的, 运行后需要保持网络链接.
我不知道是因为服务器在国外还是别的原因, 交互动作的延迟非常夸张.
当我点击 Submit 或 Clear (清空文本框内容) 按钮时, 需要等待十多秒浏览器才会弹出对话框.
简而言之, 国内开发者难以体会 Atlas 的优势, 因为操作延迟太严重了.
体验时间: 2019年3月 - 2019年5月
问题1: Flask 默认实例化行为带来的项目结构管理的困扰
Flask 的相对路径简直是史诗级的巨坑.
上图是我摸索得到的经验 (相关文章见 这里), 当我了解了 template_folder
, static_folder
, static_url_path
这三个参数该如何自定义后, 才摆脱了布局和资源路径找不到的困扰. 光是这项工作就花费了几天的时间.
问题2: 糟糕的跳转体验
当我在输入框输入一个新路径并按下回车键, 如何更新本页面的列表元素的文件列表信息?
我需要在 中定位到这个输入框, 获取这个输入框的值, 把值利用 ajax 或者
window.location.href
激发一个 url 请求, 并携带该值作为参数, 等 Flask 解析携带的参数后, 再重定向到原页面, 但与此同时, 也要给原页面交递这个参数.
这个过程不但繁琐, 而且混入了 JS, jQuery 中的各种概念, 让一个基于 Python 的后端不再纯粹, 另外我也不知道它该如何实现局部的渲染, 当我尝试使用 Vue (这又是一个问题) 来局部渲染时, 新的路由问题和模块引用问题让整个逻辑变得更加混乱.
问题3: 缺乏资料
这个问题伴随着我尝试 Flask 的整个过程, 实践示例, 教程和书籍匮乏, 以及很多自己想问的问题找不到答案, 很多错误都是自己摸索, 尝试几天后自己总结的. 即便如此, 现在手上还有一些问题亟待解决, 但也仍未找到解决的线索. 这点是最失望的.
项目地址: https://github.com/flexxui/flexx
体验时间: 2019年3月24日
问题1: IOLoop 错误
当我测试以下示例时, 运行报错:
from flexx import flx
class AAA(flx.Widget):
def __init__(self, *init_args, **kwargs):
super().__init__(*init_args, **kwargs)
flx.launch(AAA)
报错信息为 “type object ‘IOLoop’ has no attribute ‘_current’”.
经查找发现是 flx 使用了 tornado 模块的 IOLoop._current
, 而事实上在最新版的 tornado 模块中已经没有 _current
, 而是用 IOLoop.current()
取代.
也就是说我们在 flx.launch(AAA)
前加一行 IOLoop._current = IOLoop.current()
才能解决这个低级报错:
说实话 Flexx 官方没有解决这个问题, 可能是因为在 tornado 模块更新后没有去适配, 也可能是社区不活跃没有人反应问题, 也可能是已经停止维护更新了.
这是我不推荐使用 Flexx 的原因.
问题1: TextInput 不支持文字居中显示
Stack Overflow 给出的回答解决了 text 的居中问题, 但没有解决 hint_text 无法居中, 我自己花了一些功夫造轮子解决了.
这件事给我带来的忧虑不是说官方为什么没有提供原生的方法, 而是当我寻找答案时, 网上对此的讨论出奇的少 (中文网站完全没有), 而且也没有完美地满足我的需求.
Kivy 的讨论度太低了, 注定后面的大部分的坑需要个人去踩, 这是我真正担忧的地方.
问题2: 自定义组件的引用问题
假设我的项目结构如下:
myproj
|-addressbar.kv
|-addressbar.py
|-home.kv
|-home.py
addressbar.py 中已经定义好了一个 AddressBar. 现在我想要 home.kv 中引用这个自定义组件, 该如何引用?
这个问题我没能解决. 我搜索网上的答案, 以及看了一些官方提供的 demo, 只得到了以下知识:
问题3: API 文档不好用
我喜欢 Kivy 将 API 独立为文档的做法, 但文档的内容写得无法让人满意.
当我想要知道 TextInput 有哪些属性可使用时, 我根本无法在 API 文档中弄清楚. 例如:
关于什么样的 API 才是好的 API 文档, 我建议了解一下 Adobe ExtendScript Toolkit 附带的 Object Module 文档, 虽然看起来很粗糙, 但它支持了我从零到完整开发一个脚本应用的整个过程. 我认为规范的格式和完整的属性列表是构造这类文档的基础与核心.
问题4: 默认不支持中文显示
当创建并显示一个 TextInput 控件时, 往里面输入中文, 会变成方块乱码.
关于解决方法是能够找到的 (比如 这篇文章), 但我不满意的地方是官方没有给出解决方式. 这也意味着官方对中文社区的支持力度还不够.
问题5: 缺少中文教程
我搜集了两个中译版的教程, 这两个教程都是对官方 Getting Started 的译文.
考虑到官方的 API 文档还没有翻译 (加上 API 内容写得也不够好), 虽然我希望有更多的资料支持我的开发, 但目前的结论是长期来看也只能啃生肉了.
问题1: 信号与槽机制对带参通讯不友好
Pyside2 的 connect 易用度感觉一般, 想要点击 A 按钮使 B 组件反应还是容易的; 但想要点击 A 按钮想使 B 组件接收 A 按钮的讯息, 就会变得不可思议地麻烦.
项目地址: https://github.com/tryexceptpass/sofi
体验时间: 2019年5月9日
问题1: 性能表现似乎不太好
如图所示, 我在工作电脑上运行官方示例, 在连接到浏览器后, 会有一个明显的 HTML 加载延迟 (注: 在录制该动图时, 该延迟没有被捕捉到, 但在之前的几次运行中都有出现), 包括后面的 Python 操作 DOM 使字体 自动 变大的过程, 看起来也非常迟钝.
我不知道是这个官方示例写得不够好, 导致表现不佳, 还是电脑的问题 (不过自认为基本办公方面是没问题的). 评估 Sofi 的表现还需要更多的时间了解它.
体验时间: 2019年4月26日
问题1: 没有内置的表格组件
关于这个问题, 我通过 这篇文章 找到了一个对 Tkinter 的封装实现方案: tktable, 不过作者早在两年前就停止更新了. 我把源码下载下来, 运行后直接报错:
报错内容: _tkinter.TclError: invalid command name "table"
看了下报错源码位置, 好像是说 tktable 未安装导致报错, 不过实际上 tktable 不就是它自己吗? 没想明白, 暂时就放弃了.
问题2: 反直觉的列表元素类型
"""
来自: Listbox 列表部件 - 窗口 Tkinter | 莫烦Python - https://morvanzhou.github.io/tutorials/python-basic/tkinter/2-03-listbox/
"""
import tkinter
x = tkinter.StringVar()
x.set((1, 2, 3, 4))
# why set an array of int to a "StringVar"?
问题3: Listbox 不支持支持传入列表 (同样有违直觉)
报错内容: AttributeError: 'list' object has no attribute 'items'
TODO
项目地址: https://github.com/GoogleChromeLabs/carlo
TODO
TODO