本文写于2017.8.21,不保证之后版本的兼容性
第一节 基础介绍及最简单测试
先上流程图
废话?
最近在学Python3,啃书啃不下去,咱是那种用到啥学啥的类型,刚好想做一个扒图的程序,权当练习。
选用Sciter的理由...因为咱是前端,先不说sciter有多好,至少目前是满足的。需求:
-
界面
多站点
预览图片
下载原图
科学上网
对一个扒图操作而言,单纯的Py就够了,网上栗子多得是,就不在废话
但对用惯Windows的咱来说,我想要一个界面,并且我并不想把图全下载下来,我希望能有个预览,发现满意的再下载...这,只能搞成桌面程序了吧一点点来...
首先从界面入手吧
HTML写的,没啥难点,略过...
一个很重要的点,Sciter写的界面如何与Python程序交互?
假如有一个按钮:
Tiscript(sciter专有脚本语言,类似Js):
$(.btn).on("click",function(){ view.clickBtn("A","B"); //view Sciter内置的对象,所有tis都可调用})
Python:
def clickBtn(self, p1, p2 = None): pass
那么,Python如何调用Tis的函数呢?
Tiscript:
function myBtn(){ return;}
Python:
call_function()
是的方法
def clickBtn(self, p1, p2 = None): self.call_function('myBtn') pass
以上就完成了Python与Sciter的通信。
拓展:
关于传参问题
view.clickBtn("A");...def clickBtn(self, p1, p2 = None ): print( p1, type(p1) )输出 : "A" <class 'sciter.value.value'>
我们的本意是传递字符串A,但得到的却是<class 'sciter.value.value'>类型的 "A" (此处"是值的一部分)解决方法:str(p1).strip('"')
如何传递Json?
view.clickBtn({"a":"A"});...def clickBtn(self, p1, p2 = None ): print( p1, type(p1) )输出 : {"a":"A"} <class 'sciter.value.value'>
看着没问题...但print(p1['a'])会报
TypeError
的错误解决方法:
p = json.loads( str(p1) )print(p['a'])
call_function()
又是如何呢?self.call_function('myBtn','A')...function myBtn(p1){ stdout.println(p1); return;}输出 : A
可以看出值被准确的传递了, Json呢?self.call_function('myBtn',{'a':'A'})...function myBtn(p1){ stdout.println(p1["a"]); return;}输出 : A
看来也是没有问题的。注意: Sciter中不识别单引号, "'"作为字符串没问题 , 但不可用于取值。即
p['a']
是错误的!!p['a']
是错误的!!p['a']
是错误的!!
Ok,说完了以上的基础知识,咱来开始正式的敲代码吧~
先来一个最简单的页面:
Demo
# 导入sciter支持,必须安装pysciterimport sciterimport ctypesimport jsonimport time# 设置dpi, 防止程序在高分屏下发虚ctypes.windll.user32.SetProcessDPIAware(2)class Frame(sciter.Window): def __init__(self): ''' ismain=False, ispopup=False, ischild=False, resizeable=True, parent=None, uni_theme=False, debug=True, pos=None, pos=(x, y) size=None ''' super().__init__(ismain=True, debug=True) self.set_dispatch_options(enable=True, require_attribute=False) def clickMe(self): # 此处用sleep来模拟需要耗时的操作 time.sleep(5) self.call_function('clickCallBack','你已经点到我了!')if __name__ == '__main__': frame = Frame() frame.load_file("Gui/main.html") frame.run_app()
运行效果:
感觉还不错,不是吗?