Flet学习[个人向]

前言

因为实验室项目需求,我一直在做前端界面,使用过很长一段时间(半年吧)的pyqt5,做出来一些界面,但是不是很美观,而且个人感觉qt不好用而且太复杂了,本来想转去用其他语言的前端,但是项目组长说为了方便衔接python的神经网络代码,所以让我用python写,无奈,就在我在b站找pyqt的例子准备继续开工突然在一个视频下面的评论区看到了flet,我一好奇,就找到了flet的官网开始啃开发文档(Introduction | Flet 全英文,配合浏览器翻译慢慢啃),好歹也是开坑学习了,为了方便自己以后使用,就写了这个学习文档,按照自己能理解的方式慢慢学习

组长给的ddl在15号,好赶。。。(现在时间7.11下午4点半)

开始

1、 安装flet

本人使用pycharm在conda环境下安装flet,在pycharm的终端里输入pip install flet就行了

2、flet基本结构

import flet as ft
​
def main(page: ft.Page):
    # 这里就是放页面主要内容的地方
    pass
​
ft.app(target=main) # 作为桌面应用程序运行
# ft.app(target=main, view=ft.AppView.WEB_BROWSER) 作为网页运行

此处在main函数内定义了一个名叫page,继承了ft.page的页面,官方把它比喻成画布,我觉得页面就能理解了

下面是官方对于浏览器窗口打开的一些补充:

在内部,每个 Flet 应用程序都是一个 Web 应用程序,即使它在本机操作系统窗口中打开,内置 Web 服务器仍然在后台启动。Flet Web 服务器称为“Fletd”,默认情况下它侦听随机 TCP 端口。您可以指定自定义 TCP 端口,然后在浏览器中打开应用程序以及桌面视图:

flet.app(port=8550, target=main)

在浏览器中打开以查看 Flet 应用程序的网页版本。http://localhost:<port>

因为我做的是桌面端,就不多看这部分了。

3、控件

下面是一些基本的控件

# 文本控件
t = ft.Text(value="Hello, world!", color="green")
# 容器控件 Row 逐行输出
page.add(
    ft.Row(controls=[
        ft.Text("A"),
        ft.Text("B"),
        ft.Text("C")
    ])
)
# 输入框 TextField 和 按钮 ElevatedButton
page.add(
    ft.Row(controls=[
        ft.TextField(label="Your name"),
        ft.ElevatedButton(text="Say my name!")
    ])
)
# 补充中...

要让控件生效就得将控件添加到页面

page.controls.append(t) # 添加控件
page.update() # 更新页面

官方给了几个样例:

# helloworld
import flet as ft
​
def main(page: ft.Page):
    t = ft.Text(value="Hello, world!", color="green")
    page.controls.append(t)
    page.update()
​
ft.app(target=main)
# 剩下的大家自己去试试了,我都试过了
for i in range(10):
    page.controls.append(ft.Text(f"Line {i}"))
    if i > 4:
        page.controls.pop(0)
    page.update()
    time.sleep(0.3)
# 关于按钮的
def button_clicked(e):
    page.add(ft.Text("Clicked!"))
​
page.add(ft.ElevatedButton(text="Click me", on_click=button_clicked))
# 暂时是个人最喜欢的一个样例,看完这个直接决定开始学
import flet as ft
​
def main(page):
    def add_clicked(e):
        page.add(ft.Checkbox(label=new_task.value))
        new_task.value = ""
        new_task.focus()
        new_task.update()
​
    new_task = ft.TextField(hint_text="Whats needs to be done?", width=300)
    page.add(ft.Row([new_task, ft.ElevatedButton("Add", on_click=add_clicked)]))
​
ft.app(target=main)
#

附上运行的图,这东西用pyqt做应该不止这么几行代码吧

 

记住,所有控件属性都将在下一个page.update()生效哦

4、是否可视与是否可用

visible true\false

disabled true\false

# 单独设置是否可用
first_name = ft.TextField()
last_name = ft.TextField()
first_name.disabled = True
last_name.disabled = True
page.add(first_name, last_name)
# 设置所在的容器是否可用
first_name = ft.TextField()
last_name = ft.TextField()
c = ft.Column(controls=[
    first_name,
    last_name
])
c.disabled = True
page.add(c)

5、控件引用

先看官方样例

def main(page):
    
    first_name = ft.TextField(label="First name", autofocus=True)
    last_name = ft.TextField(label="Last name")
    greetings = ft.Column() # Column应该是列的意思,与Row(行)相对应
​
    def btn_click(e):
        greetings.controls.append(ft.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,
        ft.ElevatedButton("Say hello!", on_click=btn_click),
        greetings,
    )
​
ft.app(target=main)

个人感觉在讲变量的调用,后面才是重点,看看下面的代码

def main(page):
​
    first_name = ft.Ref[ft.TextField]()
    last_name = ft.Ref[ft.TextField]()
    greetings = ft.Ref[ft.Column]()
​
    def btn_click(e):
        greetings.current.controls.append(
            ft.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(
        ft.TextField(ref=first_name, label="First name", autofocus=True),
        ft.TextField(ref=last_name, label="Last name"),
        ft.ElevatedButton("Say hello!", on_click=btn_click),
        ft.Column(ref=greetings),
    )
​
ft.app(target=main)

不同的地方在于这个ft.Ret[],官方给的解释是:

Flet 提供了实用程序类,它允许定义对控件的引用,在事件处理程序中使用该引用,并在以后生成树时将引用设置为实际控件。

定义新的类型化控件引用:

first_name = ft.Ref[ft.TextField]()

要访问引用的控件(控件取消引用),请使用属性:Ref.current

# empty first name

first_name.current.value = ""

若要将控件分配给引用,请将属性设置为引用:Control.ref

page.add(
    ft.TextField(ref=first_name, label="First name", autofocus=True)
)

说实话第一次看的时候我看不懂,应该是一种新的创建控件的方式,相比与之前先创建控件在添加到界面的时候,我们可以边创建控件边添加控件,我们之前是将名叫First nametextfiled的值赋给了first_name这个变量,现在我们只需要声明first_name会从一个textfiled中获取值,然后在添加的时候指定一个文本框给first_name就行(ref=first_name),剩下的属性跟原来一样配置就好

官方最后说了,这是个人喜好问题,所以用不用无所谓

第一章内容就这么多了,剩下的等我赶完ddl随缘补吧,应该是会持续更新的。。。吧?

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值