本文写于2017.8.21,不保证之后版本的兼容性
第一节 基础介绍及最简单测试
先上流程图
废话?
最近在学Python3,啃书啃不下去,咱是那种用到啥学啥的类型,刚好想做一个扒图的程序,权当练习。
选用Sciter的理由...因为咱是前端,先不说sciter有多好,至少目前是满足的。
需求:
-
界面
多站点
预览图片
下载原图
科学上网
对一个扒图操作而言,单纯的Py就够了,网上栗子多得是,就不在废话
但对用惯Windows的咱来说,我想要一个界面,并且我并不想把图全下载下来,我希望能有个预览,发现满意的再下载...这,只能搞成桌面程序了吧
一点点来...
首先从界面入手吧
HTML写的,没啥难点,略过...
一个很重要的点,Sciter写的界面如何与Python程序交互?
假如有一个按钮:
<button class="btn">Button</button>
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()
是PySciter的方法
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,说完了以上的基础知识,咱来开始正式的敲代码吧~
先来一个最简单的页面:
<html window-frame="transparent">
<head>
<title>Demo</title>
<style type="text/css" src="scs/css.scs"></style>
<script type="text/tiscript">
function clickCallBack(p1){
$(footer>section).text = p1; //位于statusbar.html
return;
}
</script>
</head>
<body>
<widget#widget>
<include src="titlebar.html" />
<section#body>
<button class="click-me">点我</button>
</section>
<include src="statusbar.html" />
</widget>
</body>
</html>
# 导入sciter支持,必须安装pysciter
import sciter
import ctypes
import json
import 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()
运行效果:
感觉还不错,不是吗?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。