整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

不会Html、JavaScript、CSS,怎么办?

不会Html、JavaScript、CSS,怎么办?有python的Remi库

说明:

=====

1.1 如果不会web前端的html、JavaScript、CSS的知识怎么办?无所不能的python可以做到。

1.2 Remi是一个用于Python应用程序的GUI库,它将应用程序的界面转换为HTML,以便在Web浏览器中呈现。

1.3 这将删除特定于平台的依赖项,并允许您使用Python轻松开发跨平台应用程序!

2 准备:

=====

2.1 官网地址:

https://github.com/dddomodossola/remi
https://remi.readthedocs.io/en/latest/

2.2 环境:

华为笔记本电脑、深度deepin-linux操作系统、谷歌浏览器、python3.8和微软vscode编辑器。

2.3 安装:

pip install remi
#本机安装
sudo pip3.8 install remi
sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple remi

3 Hello world:

==========

3.1 代码:注释版

import remi.gui as gui
from remi import start, App
#定义类
class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)
#以上3行代码,固定初始化
    
    def main(self):
        #实例化一个VBox,大小设置
        wid=gui.VBox(width=300, height=200)
        #窗口的标签label=显示文本,大小比例法设置
        # 注意\n代表换行,但需要配合style={"white-space":"pre"},才起作用
        #preserves newline==保留换行符
        self.lbl=gui.Label('Hello\n World', width='80%', height='50%',style={"white-space":"pre"})
        #按钮和名称、大小设置,支持中文
        self.bt=gui.Button('Press me=点击我!', width=200, height=30)
        #绑定按钮的点击事件,调用函数
        self.bt.onclick.do(self.on_button_pressed)
        #adding the widgets to the main container
        #将小部件添加到主容器wid,有时候上面实例化用container=主容器
        wid.append(self.lbl)
        wid.append(self.bt)
        return wid

    # listener function==监听功能
    #调用点击按钮函数;emitter==发射器
    def on_button_pressed(self, emitter):
        self.lbl.set_text('Hello World!')
        
if __name__=="__main__":
    # starts the webserver
    # 主要参数
    # start(MyApp,address='127.0.0.1', port=8081, multiple_instance=False,enable_file_cache=True, update_interval=0.1, start_browser=True)
    #start(MyApp, debug=True, address='0.0.0.0', port=0)  #本机测试地址改动无效,为默认地址
    start(MyApp, debug=True)  #端口指定无效,也不是默认8081,估计本机端口已经被占用

3.2 操作和效果:

4 Bootstrap:

=========

4.1 代码:bootstrap.py

import remi.gui as gui
from remi import start, App

class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)

    def main(self):
        #引入在线Bootstrap的css文件
        my_css_head="""
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
            """
        #引入在线Bootstrap的js文件
        my_js_head="""
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
            """

        self.page.children['head'].add_child('mycss', my_css_head)
        self.page.children['head'].add_child('myjs', my_js_head)
       #主窗口实例化,定义大小和样式
        main_container=gui.VBox(width='500px', height='500px', style={'margin':'0px auto','padding':'10px'})
        #label=标签
        self.lbl=gui.Label("Label with Lock Icon=带锁图标的标签")
        #样式选择
        self.lbl.add_class("glyphicon glyphicon-lock label label-primary")
        #输入框
        self.tf=gui.TextInput(hint='Your Input')
        #样式选择
        self.tf.add_class("form-control input-lg")
        #下拉选择框
        self.dd=gui.DropDown(width='200px')
        #字体大小
        self.dd.style.update({'font-size':'large'})
        #样式选择
        self.dd.add_class("form-control dropdown")
        #下拉框内容选择
        self.item1=gui.DropDownItem("First Choice")
        self.item2=gui.DropDownItem("Second Item")
        #定义self的功能,目前未定义
        self.dd.append(self.item1,'item1')
        self.dd.append(self.item2,'item2')
             
        #Table=表格,第一个是表头
        myList=[  ('ID','Lastname','Firstname','邮编','城市'),
                    ('1','Pan','Peter','888888','上海'),
                    ('2','Sepp','Schmuck','123456','北京')  ]
        #表格设置,内容,大小
        self.tbl=gui.Table.new_from_list(content=myList,width='400px',height='100px',margin='10px')
        #样式选择
        self.tbl.add_class("table table-striped")
        #按钮设置
        self.bt1=gui.Button("OK", width="100px")
        #是Bootstrap样式 Class:  btn-success
        self.bt1.add_class("btn-success")                   
        self.bt2=gui.Button("Abbruch",width="100px")
        #Bootstrap Class:  btn btn-danger
        self.bt2.add_class("btn-danger")                
                
        #Build up the gui,主窗口挂载下面项目
        main_container.append(self.lbl,'lbl')
        main_container.append(self.tf,'tf')
        main_container.append(self.dd,'dd')
        main_container.append(self.tbl,'tbl')
        main_container.append(self.bt1,'btn1')
        main_container.append(self.bt2,'btn2')
        
        return main_container
    
if __name__=="__main__":
    # starts the webserver
    start(MyApp, debug=True)

4.2 操作和效果图:

5 tabbox:

=======

5.1 代码:

import remi.gui as gui
from remi import start, App

class MyApp(App):
    def __init__(self, *args):
        super(MyApp, self).__init__(*args)

    def main(self):
        #按钮
        b1=gui.Button('Show second tab', width=200, height=30)
        #表格框
        tb=gui.TabBox(width='80%')
        tb.append(b1, 'First')
        
        b2=gui.Button('Show third tab', width=200, height=30)
        #tb.add_tab(b2, 'Second', None)
        tb.add_tab(b2, 'Second')

        b3=gui.Button('Show first tab', width=200, height=30)
        #tb.add_tab(b3, 'Third', None)
        tb.add_tab(b3, 'Third')
        #3种方法
        b1.onclick.do(self.on_bt1_pressed, tb, b2)
        b2.onclick.do(self.on_bt2_pressed, tb, 'Third')
        b3.onclick.do(self.on_bt3_pressed, tb, 0)

        return tb
    
    #按钮功能的定义,3种功能
    def on_bt1_pressed(self, widget, tabbox, refWidgetTab):
        tabbox.select_by_widget(refWidgetTab)

    def on_bt2_pressed(self, widget, tabbox, refWidgetTabName):
        tabbox.select_by_name(refWidgetTabName)
    
    def on_bt3_pressed(self, widget, tabbox, tabIndex):
        tabbox.select_by_index(tabIndex)

if __name__=="__main__":
    #网页标题,standalone=False默认是不允许
    start(MyApp, title="Tab Demo=表格例子", standalone=False)

5.2 操作和效果图:

6standalone:

======

6.1 代码: mian.py

from remi import start, App
#将 bootstrap.py脚本放在本代码mian.py同一个目录下
from bootstrap import MyApp

if __name__=="__main__":
    start(MyApp, standalone=True)

6.2 代码:bootstrap.py=4.1所指定代码:

6.3 注意启动网页服务器默认为不启动(false),需要启动则为standalone=True。

6.4 操作和效果图:

把web网页变成一个app的GUI

7 附一张gif:

代码省略

===自己整理并分享===

喜欢的人,可以点赞、关注、评论、转发和收藏。

Python提供的标准库中有一个名为html的标准库,该标准库提供的功能很简单,仅仅是把一些组成标签的尖括号或者是一些特殊字符转换成实体字符。

这也是Python本身秉持的设计哲学,就是一个函数、一个模块或者一个标准库只专注于一件事或者是某一方面的事。



我们先来大概了解该标准的组成


>>> import html
>>> dir(html)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_charref', '_html5', '_invalid_charrefs', '_invalid_codepoints', '_re', '_replace_charref', 'entities', 'escape', 'unescape']

我们不管那些以_开头的东东,把注意放在escape和unescape这两个函数上。

假设我有一些HTML,我担心其中会包含一些可能危险的<script>标记。这时有一种方法就是把标签的尖括号转换成实体符号,从以上两个函数的命名可以大概了解相应的功能。

没错escape函数就是转义的意思,就是把一些字符转换为实体字符。比如“<”会转换成“&+lt”、“>”会转换成“&+gt”等等。(加号表示连接两边的符号)

>>> import html
>>> help(html.escape)
Help on function escape in module html:

escape(s, quote=True)
    Replace special characters "&", "<" and ">" to HTML-safe sequences.
    If the optional flag quote is true (the default), the quotation mark
    characters, both double quote (") and single quote (') characters are also
    translated.

查看该函数的帮助可以了解到,它会把特定字符“&”,“<”,“>”等转换成HTML安全的实体字符。该函数还有一个可选的标记参数,默认为True,意思就是该函数默认为把引用符号(“”、‘’)等一并转换。

>>> import html
>>> demo="<h1>Hello World!,'</h1>"
>>> html.escape(demo,quote=False)
"<h1>Hello World!,'mangfu'</h1>"

上面的例子中,我设置可选参数quote为False,则它并不会对引号(‘’)进行转换。

>>> import html
>>> demo="<h1>Hello World!,'</h1>"
>>> html.escape(demo)
'<h1>Hello World!,'mangfu'</h1>'

上面的例子中,我使用该函数默认的可选参数,从结果中可以看出函数输出已经对引号(‘’)进行转换。

至于unescape函数,看该函数的名字就知道它的作用跟escape函数恰恰相反。

可能大家对这些功能还不是很熟悉,但是这在Web开发方面是很重要的,如果你以后学习Django来搭建自己的网站,会碰到这个功能的。

大家可以动手试试unescape函数。。。

在的爬虫越来越难了,不再和之前的那样,随便抓个包就可以找到相关的 url ,然后 post 一下或者 get 一下数据就出来了。还有一个可能就是可能你以前用来学习的爬虫网站太简单了,还没有看见过那些猛的。上两周我就想弄弄知乎登陆,参数的加密算是把 js 代码扣出来了,但是只能在浏览器上运行,一换到 Python 执行就各种报错,你不会 JavaScript 就什么都调不了,所以二话不说,开启了新的大陆。那就开始吧!

这是小编精心准备的一份Python爬虫入门学习资料,关注,转发,私信小编“01”即可免费领取!

1. JavaScript 介绍

JavaScript 是运行在 客户端的语言,和你们说的 Java 是很不一样的, Java 通常用于服务器端的。但是他们两者也有相似之处,比如 JavaScript 的命名规范和名称和 Java 相似。其他的好像就没有什么了,哈哈。

JavaScript 也是一门脚本语言,和 python 一样,都是解释性语言,即每运行一行代码就解释一行,只不过 JavaScript 的解释器在浏览器内部。

JavaScript 最初被应用是为了处理与表单相关的验证,现在应用就更加广了,可以说是几乎无所不能,比如用来做服务端开发,命令行工具、桌面程序和游戏开发等。

我在学了之后也跟着弄了两个小的页面游戏,怀念童年。




2.JavaScript组成



  • EcmaScript:JavaScript 的核心,定义了 JavaScript 的基本语法和数据类型,也是我们今天所学的内容。
  • DOM:document odject model, 文档对象模型,用于操作网页中的页面元素的,比如可以控制相关元素的增删改查。
  • BOM:browser object model,, 浏览器对象模型, 用于操作浏览器窗口,比如弹出框,控制页面滑动等。

3.JavaScript 变量

在了解变量之前,先要知道 JavaScript 代码写在那里:

  1. 行内,即写在 html 的元素中,不建议
  2. 嵌入,即写在 <script>标签内,这个练习时可以使用,但当代码量大的时候也不建议
  3. 外部,即 js 代码都在另一个文件内,用链接的方式接入 html 文件即可,推荐使用这种方式。

还有注释:

  1. 单行注释: // 注释内容
  2. 多行注释: /* 注释内容 */

3.1 变量的定义以及作用

变量是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存储的数据。

使用变量我们可以更方便的获取或修改内存中的数据。

3.2 定义变量

使用 var 关键字来声明变量,和 python 差不多,都是弱类型的语言,只不过 python 不需要使用关键字来声明。



注:console.log()这个方法只是在控制台打印一下变量而已。

3.3 变量的命名规则和规范

1):规则-必须遵守的,不遵守就会报错,就好比人类的法律

  • 由字母、数字、下划线和 $ 组成,但是不能以数字开头,如:12asd 这个名字就会报错
  • 不能是关键字或保留字,比如 var、for等
  • 严格区分大小写,就是说大写和小写都是不一样的变量

2):规范-建议遵守的,但不遵守也不会报错,比如人类的道德

  • 变量名必须有意义,因为这样别人才能看得懂,而且也利于维护,没有意义的就像我们需要破解相关参数时看到的 js 混淆,想想就头痛。
  • 遵守驼峰命名法,首字母小写,后面单词的首字母大写,如:userName

3.4 小案例

了解完变量之后可以做个小案例:交换两个值



4. 数据类型

JavaScript 的数据类型分两种,一个为简单数据类型,另一个为复杂数据类型。

简单数据类型有 Number、String、Boolean、undefined 和 null。一共五种

复杂数据类型比如 object,这个以后遇到再说,慢慢来。

4.1 Number

Number 为数值固定的表示法,用来表示整数和浮点数的。它的字面量就是数值,那字面量是什么意思呢?字面量就是这个变量表示的值,



比如上面变量 a 的字面量就是 12,b 的字面量就是 45。

我们还可以使用 typeof 关键字来判断这个数据类型



除了使用上面的十进制来赋值,我们还可以使用八进制和十六进制



八进制的数是以 0 开头的,而十六进制的是以 0x 开头的,其他的进制就不讨论了。

无论你写何种进制,它的存储还是以二进制来存储的,所以这样就弄成了浮点数的存储精确度,浮点数只能精确到17位小数



可以看到 两个浮点数的相加不是很准确,所以不要在有浮点数的运算下做判断,有可能会有你想不到的结果,如



浮点数除了直接表示我们还可以使用科学计数法,当然,整数也是一样可以使用的。



Number 数据类型是有范围的,但是不需要我们刻意去计,记住它的关键字就可以了。



最后再说一个关键字:NaN:not a number,这个表示不是数值,当有两个数据运算时,运算失败就会返回这个值。我们也可以判断一个数据类型是不是 NaN,使用 isNaN() 方法即可。



4.2 String

String 类型就是用单引号或双引号括起来的内容就是了,和 python 的字符串类型也是差不多的。



length 属性是获取字符串的长度。

连接两个字符串可以使用 + 进行连接, + 号两边不需要全是 String 类型也可以进行连接



思考:如何打印出下列字符串

  1. 我是一个"帅哥"
  2. 我喜欢"学‘python’"

这里面有单引号和双引号,如果直接进行打印的话就会出错,这时候我们就需要把这些有意义的字符给转义符,转成普通的字符



根据上面的转义符,就可以写出下面语句了



4.3 Boolean

boolean 类型,字面量只有 truefalse,表示真假,即表示计算机的 1 和 0。

当我们描述只有两种结果的事物是可以使用这个。

4.4 undefined 和 null

  1. undefined 表示一个声明了没有赋值的变量,所以变量的默认值就是undefined。
  2. null 只是表示为空,如果要想把该值设为 null, 只能手动赋值。

5. 数据类型转换

5.1 其他类型转 String 类型

  • 使用 toString() 方法



需要注意:undefined 和 null 类型不能使用这个方法

  • 使用 String() 强转,这个对任何类型都适用



  • 使用 + 连接符 连接空字符,这是最方便的,也是支持所有类型



5.2 其他类型转 Number 类型

  • 使用 Number() ,当转不了的时候会返回 NaN,说明不是数值,在将 Boolean 类型转 Number 时,true会转为 1, false 会转为 0。这个方法不支持将数字开头带有其它字符的字符串转为数值类型,如 "12df"



  • 使用 parseInt() ,只能转为整数,而且转不了Boolean。但是可以转以数字开头而带有字符的字符串。这个就可以应用在比如需要将 "16px" 转为数值,就可以使用这个。转不了时也会返回 NaN。
  • 使用 parseFloat() 可以转为浮点数,当字符串为整数时也可以转为整数。需要注意的是:当字符串中有两个小数点的时候,只会转第二个小数点之前的数字,后面的都当作字符串



  • 使用 + 或 - 来将值取正或取负。这个的功能和 Number 差不多。



  • 使用 - 来进行减法运算来转。这个使用运算符就会先把左右两边的类型先转为数值类型再运算,所以可以用来相减 0。至于 + 不行,是因为这个用来做字符串的拼接了。



5.3 其他类型转 Boolean 类型

这个使用 Boolean() 来转就可以了,所有类型都可以转。转为 false 的情况为 null、undefined、NaN、0 和 空字符串,其他情况均为 true。

其实这个还可以使用隐式转换,就是不需要自己手动转,解释器会自动帮我们转,隐式转换通常用在判断语句的情况,隐式转换可以减少代码的书写,等说到判断语句再说,下面就有!

6. 操作符

操作符就是用来对数据类型进行操作的符号,每个语言的操作符都差不多,这里再说下可以更深刻一点!

6.1 算术运算符

+ - * / % 五个,任何一个数 除 0 都为为无穷大,模 0 为 NaN



6.2 一元运算符

一元运算符就是只需要一个操作数的运算符,有 ++、-- 和 !

  • 前置++:如 a++,变量在前,这个是先将变量的结果返回再对自身加 1
  • 后置++:如 ++a,变量在后,这个是先将变量进行自身加 1,再把结果返回

还有 -- 也是一样的,只是 它是自身减 1,在运算中需要注意变量在一元运算符的顺序。

  • ! 就是对操作数取反,而且返回的是 Boolean 类型



6.3 逻辑运算符

逻辑运算符有 && 、|| 和 !,! 因为只对一个操作数操作所以也属于一元运算符。

  • &&:这个是与运算符,只有当两边都为 true 的时候才会返回 true,其他情况都返回 false。
  • ||:这个是或运算符,只有当两边都为 false 的时候才返回 false, 其他情况都返回 true。



6.4 关系运算符

关系运算符有 < > <=>===!====和 !==。运算完都是返回 Boolean 类型的,这里就不细说了,都差不多的,只说下==和===的区别,还有 !==和 !=的区别。==只判断两值的字面量相等不相等,不会判断数据类型,而===会先去判断数据类型再判断字面量,!=和 !==的区别也是这样。



6.5 赋值运算符

赋值运算符有 +=-=*=/=%== 六个。

+=就是把左右两边的值相加起来再赋值给左边的值,其他的也一样,就不多说了。



6.6 运算符优先级从高到低(运算顺序)

  1. ()
  2. 一元运算符
  3. 算术运算符,同级时先 * / 再 + -
  4. 关系运算符:> >=< <=
  5. 相等运算符:=====!=!==
  6. 逻辑运算符:同级时先 && 再 ||
  7. 赋值运算符

7. 流程结构

JavaScript 的流程结构有三种,分别是顺序结构,分支结构和循环结构,这个也和 python 差不多的。

顺序结构就是代码是按顺序从上到下执行的,分支结构就是按照给定条件的是否成立而执行不同的语句,循环结构就是重复执行某一段代码。

顺序结构就不多说了,我们刚才运行的代码就是顺序结构的,现在先说下分支结构。

7.1 分支结构

使用分支结构可以使用 if 和 else 组成的语句,写法和 python 差不多。



单独 if 语句

说到判断,就有个隐式转换,就是 if 括号里面的值会将任意类型的值隐式转换成 Boolean 类型。如下:



另一种形式的分支语句:



if-else 一起用

这个 if-else 合用还有个简单点的写法,叫做三元运算符,语法为



当表达式1 为 true 的时候,就会把 表达式2 的值给返回,否则返回 表达式3 的值,这个有一个缺陷,就是必须要有结果返回



还有一种形式的分支语句:



if-else if-if 三个合用

上面的 三个合用我们也可以使用 switch 语句来改写,这个是选择关键词。语法为



改写后:



因为 case 的值只能是一个值,不能是范围,所以用了个除法来解决,要不然需要写大量的 case,还需要注意一点是一定需要记得写 break,否则在匹配到相应的值之后它会一直往下运行不管 case 值是否对应,直到遇到 break 或者 全部运行完

7.2 循环结构

JavaScript 的循环结构也有 while for语句,但他还有 do-while语句。

  • for语句:一般在确定了循环的次数就会使用这个比较方便,语法为:



这个先去执行初始化表达式1, 然后去执行判断表达式2,符合条件就会执行循环体,循环体执行完之后就执行自增表达式3,再去判断,接下来就是重复刚才的动作,直到不满足判断表达式2



  • while 语句:在无法确定循环次数的时候就可以用这个,使用这个需要注意循环结束的条件,以免写了死循环。语法为:



满足循环条件之后就执行循环体,然后再去执行循环条件,接下来就是重复刚才的动作直到不满足条件



  • do-while 语句:这个也是在不知道循环次数的时候使用,但是当循环体无论如何都需要执行一次的话就可以选择使用这个。语法为:



先去执行循环体,再去判断循环条件,接下来就是重复刚才的动作直到循环条件不满足

在循环结构中还可以使用 break 和 continue 来对循环进行跳出的操作。break 就是跳出整个循环,就是循环结束,而 continue 是跳出本次循环,接着下一次的循环

学习了循环之后,我们也可以尝试着自己打印一个三角形,或者 99 乘法表来满足一下自己。





这两个的思路都是差不多的,只要你搞定了第一个三角形的思路,下面的乘法表自然就迎刃而解了,这里就不多说了