一、基本概念
(一)ft.AlertDialog 是 Flet 内置的“对话框”交互控件,弹出一个对话框,等待用户输入数据,或者选择操作项目,它有“模态框”和“非模态”2中形式。
定义对话框方式很简单,代码如下:
dialog = ft.AlertDialog(
modal=True, # modal=True 表示模态框, = False 或取消该句,表示 为非模态
title=ft.Text("密码验证"),
content=txt_pw,
actions=[
ft.TextButton("确定", on_click='fun1()' ),
ft.TextButton("取消", on_click='fun2()'),
],
)
打开和关闭对话框,代码如下:
page.open(dialog) # 打开对话框
page.close(dialog) # 关闭对话框
ft.AlertDialog 的 属性和方法,放在文末。
(二)ft.SnackBar 是Flet 内置的“消息闪现”交互控件,通常在页面底部,插入一个小横幅,显示一条信息。它通常与 ft.AlertDialog 混合使用,反馈 ft.AlertDialog 的操作结果,当然也可以妙有他用。
定义SnackBar,代码如下:
page.snack_bar = ft.SnackBar(
content=ft.Text("密码错误!"),
)
打开和关闭SnackBar,代码如下:
page.snack_bar.open = True # 打开
# 关闭方式1:page.snack_bar.open = False
# 关闭方式2:不写任何代码。因为:SnackBar 名为“闪现消息”,短暂时候后,它会自动关闭!
page.update()
提示:关闭 SnackBar 是自动的,一般不写任何代码, 名为“闪现消息”,短暂时候后,它会自动关闭!
ft.SnackBar 的 属性和方法,放在文末。
二、应用举例
模拟场景:点击一个按钮,弹出一个对话框(对话框上,有一个密码输入框,一个“确定”按钮,一个“取消”按钮)。对话框打开后,等待用户输入密码。如果密码正确,则用 SnackBar 闪现消息,提示密码通过验证(绿色字体),则继续执行后续代码。如果密码错误,则用 SnackBar 闪现消息(红色字体),提示密码错误,程序不得向下执行。
这个功能很常用,在很多应用开发中都会用到。本例效果如下:
先上完整代码,然再通过代码,解读思路:
import flet as ft
def main(page: ft.Page):
# 定义密码验证逻辑
def check_password(e):
if password_input.value == "abc123": # 假设正确密码是 "abc123"
page.close(dialog) # 关闭对话框
show_snackbar("密码通过验证!", color="green") # 显示绿色 SnackBar
# 继续执行后续代码
print("继续执行后续代码...")
else:
page.close(dialog) # 关闭对话框
show_snackbar("密码错误,请重试!", color="red") # 显示红色 SnackBar
# 不执行后续代码
# 显示 SnackBar 的函数
def show_snackbar(message, color):
page.snack_bar = ft.SnackBar(
content=ft.Text(message, color="white"),
bgcolor=color,
duration=2000, # 显示 2 秒
)
page.snack_bar.open = True
page.update()
# 创建密码输入框
password_input = ft.TextField(
label="请输入密码",
password=True, # 输入内容隐藏
can_reveal_password=True, # 允许显示/隐藏密码
autofocus=True, # 自动聚焦输入框
)
# 创建对话框
dialog = ft.AlertDialog(
modal=True, # 模态对话框(阻止背景操作)
title=ft.Text("请输入密码"),
content=password_input,
actions=[
ft.TextButton("确定", on_click=check_password),
ft.TextButton("取消", on_click=lambda e: page.close(dialog)),
],
actions_alignment=ft.MainAxisAlignment.END, # 按钮右对齐
)
# 打开对话框的函数
def open_dialog(e):
password_input.value = "" # 清空输入框
page.open(dialog) # 打开对话框
# 创建一个按钮,点击后打开对话框
page.add(
ft.ElevatedButton("打开密码对话框", on_click=open_dialog)
)
ft.app(target=main)
功能及思路:
按钮点击打开对话框:
页面加载后,显示一个按钮 "打开密码对话框"。
点击按钮后,弹出对话框。对话框内容:包含一个密码输入框(支持显示/隐藏密码)。两个按钮:"确定" 和 "取消"。
密码验证逻辑:
如果输入密码为 "abc123",关闭对话框,显示绿色 SnackBar 提示 "密码通过验证!",并继续执行后续代码。
如果密码错误,关闭对话框,显示红色 SnackBar 提示 "密码错误,请重试!",程序停止执行后续代码。
SnackBar 提示:
绿色 SnackBar 表示密码正确。
红色 SnackBar 表示密码错误。
SnackBar 显示 2 秒后自动消失。
取消按钮:
点击 "取消" 按钮,直接关闭对话框,不执行任何操作。
初始页面:
页面显示一个按钮 "打开密码对话框"。
点击按钮:
弹出对话框,显示密码输入框和两个按钮。
输入正确密码 (abc123):
对话框关闭。
页面底部弹出绿色 SnackBar,显示 "密码通过验证!"。
控制台输出 "继续执行后续代码..."。
输入错误密码:
对话框关闭。页面底部弹出红色 SnackBar,显示 "密码错误,请重试!"。
控制台无输出,程序停止执行后续代码。
点击取消:
对话框关闭,无任何提示。
关键解读:
Flet 应用程序基于事件驱动模型工作。一旦对话框被打开,主程序流程实际上就处于等待状态,等待用户与界面元素进行交互(如点击按钮)。这种模型自然地阻止了程序自动向下执行,直到用户完成必要的输入和选择。
dialog = ft.AlertDialog(
modal=True, # 模态对话框(阻止背景操作)
......
因此,通过使用 Flet 的事件驱动架构以及在事件处理函数中加入条件逻辑,可以有效地控制程序的执行流程,确保在密码验证通过之前不会执行特定的后续代码。这种方式非常适合构建需要用户交互的应用程序。
三、ft.AlertDialog 的属性及方法
(一)属性
actions
在对话框底部显示的(可选)操作集。
通常这是一个 TextButton 控件列表。
action_button_padding
围绕在 actions 中每个按钮的填充。 值的类型为 PaddingValue 。
actions_alignment
定义操作的水平布局。
值的类型为MainAxisAlignment,默认值为MainAxisAlignment.END。
actions_padding
围绕在对话框底部操作集的填充。
通常用于提供按钮栏与对话框边缘之间的填充。
如果没有操作,则不包括任何填充。按钮栏周围的填充默认为零。
值的类型为PaddingValue 。
adaptive
如果值为 True,则根据目标平台是 iOS/macOS 创建自适应 AlertDialog。
在 iOS 和 macOS 上,创建 CupertinoAlertDialog,它具有与 AlertDialog 匹配的功能和表现,并且具有 iOS 上预期的图形。在其他平台上,创建材料设计 AlertDialog。
查看使用示例 此处。
值的类型为 bool ,默认值为 False 。
barrier_color(“障碍颜色”)
对话框下方使所有内容变暗的模态屏障的颜色。
如果为None,则使用DialogTheme.barrier_color。如果它也为None,则使用Colors.BLACK_54。
bgcolor
对话框表面的背景颜色。
clip_behavior
控制对话框内容如何剪裁(或不剪裁)到给定的 shape。 属性值是 ClipBehavior ,默认值为ClipBehavior.NONE。
默认为 NONE。
content
对话框的(可选)内容显示在对话框的中心,字体较轻。通常这是一个包含对话框Text消息的Column。
值为Control类型.
content_padding
内容周围的填充。
如果没有内容,则不会提供填充。否则,内容上方会提供 20 像素的填充以将内容与标题分开,左右和底部会提供 24 像素的填充以将内容与对话框的其他边缘分开。
值的类型为PaddingValue 。
elevation
定义对话框出现的高度(z 坐标)。 值的类型为OptionalNumber.
icon
一个显示在对话框顶部的控件。通常是一个 Icon 控件。
icon_padding
icon 周围的填充。 值的类型为PaddingValue.
inset_padding
对话框本身周围的填充。
值的类型为 PaddingValue。
默认值为 padding.symmetric(vertical=40, horizontal=24) - 对话框外部水平 40 像素,垂直 24 像素。
modal
是否可以通过点击对话框外部区域来关闭对话框。
值的类型为“布尔型”,默认值为“False”。
open
设置为 True 以显示对话框。
semantics_label
对话框的语义标签,由辅助功能框架用于在对话框打开和关闭时宣布屏幕过渡。
在 iOS 中,如果未提供此标签,将从 title 推断出一个语义标签(如果它不为空)。
str类型。
shadow_color
用于在对话框下绘制阴影的颜色,反映对话框的高度。
shape
设置对话框的形状。
类型为 OutlinedBorder ,默认值为 RoundedRectangleBorder(radius=4.0)。
默认形状是一个半径为 4.0 的 RoundedRectangleBorder。
surface_tint_color
用于在对话框背景色上作为表面色调覆盖的颜色,反映对话框的高度。
title
对话框的(可选)标题,以大字体显示在对话框顶部。
通常是一个 Text 控件。
title_padding
标题周围的填充。
如果没有标题,则不会提供填充。否则,将使用此填充。
值的类型为 PaddingValue。
默认在标题的顶部、左侧和右侧提供 24 个像素。如果 content 不为 None,则不提供底部填充(但请参阅 content_padding)。 如果未设置,则会额外添加 20 个像素的底部填充,以将标题与操作分开。
(二)事件
on_dismiss
对话框关闭时触发。
四、ft.SnackBar 的属性及方法
(一)属性
action
一个可选的操作,用户可以根据SnackBar采取。
例如,SnackBar可能会让用户撤销导致SnackBar出现的操作。SnackBar最多可以有一个操作。
操作不应该是“dismiss”或“cancel”。
action_color
操作按钮的前景颜色。
action_overflow_threshold
操作的宽度溢出阈值(介于0.0和1.0之间)。默认值为0.25。
如果SnackBar的content的宽度大于这个百分比的SnackBar宽度减去操作的宽度,那么操作将出现在content下方。
在值为0.0时,操作将不会溢出到新行。
behavior
定义SnackBar在页面中的行为和位置。
定义SnackBar在页面中的位置和浮动ActionButton或NavigationBar时的调整行为。
值的类型为SnackBarBehavior,默认值为SnackBarBehavior.FIXED。
注意:
- 如果behavior=SnackBarBehavior.FLOATING,栏的长度由width或margin定义,如果两者都指定,width优先于margin。
- 如果behavior!=SnackBarBehavior.FLOATING,则忽略width和margin。
bgcolor
SnackBar背景颜色。
clip_behavior
根据这个选项,内容将被剪辑(或不剪辑)。属性值是ClipBehavior。
默认值是HARD_EDGE。
close_icon_color
一个可选的颜色,用于关闭图标,如果show_close_icon是True。
content
SnackBar的主要内容。通常是一个Text控件。
dismiss_direction
SnackBar可以被dismiss的方向。
属性值是DismissDirection,,默认是DOWN。
duration
SnackBar保持打开的毫秒数。默认是4000([4秒](
https://api.flutter.dev/flutter/material/SnackBar/duration.html)) when not set.
elevation
SnackBar的z坐标,控制SnackBar下方阴影的大小。
margin
SnackBar周围的空白空间。
这个属性仅在behavior是SnackBarBehavior.FLOATING时使用。不能与width同时使用。
open
设置为True以显示SnackBar。这个属性将自动设置为False,一旦SnackBar显示。
padding
SnackBar的内容和可选操作的填充量。
值是一个Padding类实例或一个数字。
shape
SnackBar的形状。
值是一个OutlinedBorder类实例。
show_close_icon
是否包括一个“关闭”图标控件。
点击图标将关闭SnackBar。
width
SnackBar的宽度。
如果宽度指定,SnackBar将在可用空间中水平居中。这个属性仅在behavior是SnackBarBehavior.FLOATING时使用。不能与margin同时使用。
(二)事件
on_action
当操作按钮被点击时触发。
on_visible
当SnackBar第一次在页面中可见时触发。
(汇报完毕,感谢收看!)