Python3结合Sciter编写桌面程序

本文写于2017.8.21,不保证之后版本的兼容性

第一节 基础介绍及最简单测试

先上流程图

在线流程图
《Python3结合Sciter编写桌面程序》

废话?

最近在学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()

运行效果:
《Python3结合Sciter编写桌面程序》

源码

感觉还不错,不是吗?

Python3结合Sciter编写桌面程序第二节

Python3结合Sciter编写桌面程序第三节

    原文作者:ZeronoFreya
    原文地址: https://segmentfault.com/a/1190000010769001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞