开始第一个Flet应用
wptr33 2025-04-26 21:40 17 浏览
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服务器来使用,部署起来也是非常的方便,下一次我们介绍更多的基础组件。
- 上一篇:《史记微软UI框架轮回本纪》
- 下一篇:Flutter 实现多语言
相关推荐
- 每天一个编程技巧!掌握这7个神技,代码效率飙升200%
-
“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...
- Git重置到某个历史节点(Sourcetree工具)
-
前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...
- git工作区、暂存区、本地仓库、远程仓库的区别和联系
-
很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...
- 解锁人生新剧本的密钥:学会让往事退场
-
开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...
- Reset local repository branch to be just like remote repository HEAD
-
技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...
- Git恢复至之前版本(git恢复到pull之前的版本)
-
让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...
- 如何将文件重置或回退到特定版本(怎么让文件回到初始状态)
-
技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...
- git如何正确回滚代码(git命令回滚代码)
-
方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...
- [git]撤销的相关命令:reset、revert、checkout
-
基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...
- 利用shell脚本将Mysql错误日志保存到数据库中
-
说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...
- MySQL 9.3 引入增强的JavaScript支持
-
MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...
- python 连接 mysql 数据库(python连接MySQL数据库案例)
-
用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...
- mysql导入导出命令(mysql 导入命令)
-
mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库 mysqldump-u用户名-p数据库名>导出的文件名 mysqldump-uw...
- MySQL-SQL介绍(mysql sqlyog)
-
介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...
- MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南
-
在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 每天一个编程技巧!掌握这7个神技,代码效率飙升200%
- Git重置到某个历史节点(Sourcetree工具)
- git工作区、暂存区、本地仓库、远程仓库的区别和联系
- 解锁人生新剧本的密钥:学会让往事退场
- Reset local repository branch to be just like remote repository HEAD
- Git恢复至之前版本(git恢复到pull之前的版本)
- 如何将文件重置或回退到特定版本(怎么让文件回到初始状态)
- git如何正确回滚代码(git命令回滚代码)
- [git]撤销的相关命令:reset、revert、checkout
- 利用shell脚本将Mysql错误日志保存到数据库中
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)