Flet是根据Flutter的UI框架,可是咱们不需求了解Flutter,也不需求会前端,只要具有Python面向目标编程根底就能够了。当然我自己是不会Flutter的,所以也无法对比Flet和Flutter,虽然说不需求咱们会前端,可是有一些布局相关的东西仍是会写前端概念会比较好了解。
装置
Flet需求Python3.7及以上版别,直接运用Pip就能够装置
pip install flet
根底结构
装置好了以后,咱们看一个最根底的Flet运用结构:
import flet
from flet import Page
def main(page: Page):
page.add(Text("Hello, world!"))
flet.app(target=main)
运用flet.app
创立一个运用程序,将函数main
作为它的入口点,page
就相当于一个画布,每一个运用程序都会将画布实例传递给咱们的入口函数。运行以上程序后,咱们会发现,它不只会启动一个客户端,还会启动一个web服务器。
咱们能够经过在启动命令中修正参数来决议是否只启用web服务器。
flet.app(target=main, view=flet.WEB_BROWSER)
默许情况下它会翻开桌面运用和web服务器,监听随机端口,咱们能够经过参数指定端口
flet.app(target=main, view=flet.WEB_BROWSER, port=8800)
可是这只支持本机拜访,能够经过把host
设置为0.0.0.0
来对外提供服务
flet.app(target=main, host='0.0.0.0', port=8800)
控件的运用
用户界面由控件组成,假如要使控件对用户可见,必须将它们添加到其他控件中,页面Page
是最上面的控件,所有的控件嵌套在一起,就像HTML中的DOM树一样,而Page
便是根节点。
所谓的控件只是普通的Python
类,经过设置参数创立一个实例,就像下面这样:
t = Text(value="Hello, world!", color="green")
控件显现
要在页面上展现它,就把它添加到页面控件列表中,然后经过page.update
来告诉页面更新烘托。
import flet
from flet import Page, Text
def main(page: Page):
t = Text(value="Hello, world!", color="green")
page.add(t)
flet.app(target=main)
控件更新
添加完控件以后还能够对它的特点进行修正,可是要注意对控件的修正并不是实时收效的,必须调用page.update
告诉页面自动进行重绘,这样的优点也是提高页面的烘托速度,下降频繁修正导致的烘托异常。咱们做一下如下修正:
import flet
from flet import Page, Text
def main(page: Page):
t = Text(value="Hello, world!", color="green")
page.add(t)
for i in range(10):
t.value = f"Step {i}"
page.update()
sleep(1)
flet.app(target=main)
容器控件
某些控件是“容器”控件,其间能够包括其他控件,比方Row
控件允许朱行排列其他控件
page.add(
Row(controls=[
Text("A"),
Text("B"),
Text("C")
])
)
交互控件
除了一些展现类的控件外,还有一些需求和用户交互的组件,例如按钮、输入框等,下面咱们展现一个混合的示例:
import flet
from flet import Page, Checkbox, ElevatedButton, Row, TextField
def main(page: Page):
new_task = TextField(hint_text="Whats needs to be done?", width=300)
def add_clicked(e):
page.add(Checkbox(label=new_task.value))
page.add(Row([new_task, ElevatedButton("Add", on_click=add_clicked)]))
TextField
是输入框组件,ElevatedButton
是按钮组件,输入框组件能够接纳输入值,经过组件目标中的value
特点能够拿到输入的值,按钮组件能够接纳鼠标点击事情,点击事情能够经过回调函数来处理,咱们在点击事情中向页面添加多选框。
控件引证
控件是Python
类目标,要拜访其特点,咱们需求保留对这些目标的变量,经过类的实例目标来拜访控件的特点。看以下示例:
import flet
from flet import Column, ElevatedButton, Text, TextField
def main(page):
first_name = TextField(label="First name", autofocus=True)
last_name = TextField(label="Last name")
greetings = Column()
def btn_click(e):
greetings.controls.append(Text(f"Hello, {first_name.value} {last_name.value}!"))
first_name.value = ""
last_name.value = ""
page.update()
first_name.focus()
page.add(
first_name,
last_name,
ElevatedButton("Say hello!", on_click=btn_click),
greetings,
)
flet.app(target=main)
实际上咱们在上面已经运用过控件引证了。这儿咱们先创立了三个控件,两个输入框控件,一个列容器控件,咱们在按钮的点击事情中,把称号设置给Text
文本控件,然后添加到列容器中,最终要调用page.update
来改写页面,才能正常显现出来。
除了直接引证控件实例目标以外,Flet
还为咱们提供了另一种控件目标引证方法,看一下示例:
import flet
from flet import Column, ElevatedButton, Text, TextField
from flet.ref import Ref
def main(page):
first_name = Ref[TextField]() # 界说输入框引证变量
last_name = Ref[TextField]()
greetings = Ref[Column]() # 界说列容器引证变量
def btn_click(e):
greetings.current.controls.append(
Text(f"Hello, {first_name.current.value} {last_name.current.value}!")
)
first_name.current.value = ""
last_name.current.value = ""
page.update()
first_name.current.focus()
page.add(
TextField(ref=first_name, label="First name", autofocus=True),
TextField(ref=last_name, label="Last name"),
ElevatedButton("Say hello!", on_click=btn_click),
Column(ref=greetings),
)
flet.app(target=main)
经过Ref
来界说一种控件的引证,然后在控件创立的运用赋值给ref
参数,可是在运用Ref
变量的时候需求经过current
变量来拜访到实际的控件目标,这种方法是借鉴React
的主意。在这个示例中咱们看起来比较繁琐,实际上它的运用场景是把页面和逻辑处理分离开,像上面的那一个例子,first_name
直接引证控件目标,这种方法就会导致控件的布局比较涣散,并且特点设置也涣散开了,而下面这种方法,咱们界说的first_name
只标明是TextField
的引证,对于实际的组件以及组件的特点这儿是不关心的,选用这种方法,咱们就能够把控件的引证和页面布局都集中在一起。
总结
上面咱们大致介绍了Flet
的全体结构和一些运用概念,就布局方法而言它和前端十分相像,我觉得它最大的优点是能够同时展现桌面端和web端,既能够在本机运用,也能够让他人经过网页运用相似桌面端的程序,一举两得,满足了更多的需求,并且假如咱们仅把它作为一个web服务器来运用,布置起来也是十分的便利,下一次咱们介绍更多的根底组件。
本文由mdnice多渠道发布