Python Flet 异步

标签 python flet

我正在尝试使用带有异步函数的 Flet libray 来登录电报。 目前的功能非常基本,它只是检测用户是否已经登录,如果没有,则打开一个登录页面,其中包含电话号码字段和按钮:

import flet as ft
from flet import AppBar, ElevatedButton, Page, Text, View, colors
from telethon import TelegramClient
import sys
import re
from asyncio import new_event_loop, run

# you can get telegram development credentials in telegram API Development Tools
api_id = '***'
api_hash = '***'

client = TelegramClient('session_name', api_id, api_hash)

def main(page: Page):
    page.title = "Tel"

    def startup_async():
        new_event_loop().run_until_complete(startup())

    def get_verif_async(phone_num):
        print('ciao')
        new_event_loop().run_until_complete(get_verification_code(phone_num))

    async def get_verification_code(phone_number):
        if phone_number and re.match(r"^\+\d+$", phone_number):            
            await client.send_code_request(phone_number)
        else:
            page.add(ft.Text(value='errore'))            
        #view.update()

    
    async def startup():
        print('startup')
        await client.connect()
        if not await client.is_user_authorized():
            page.route = "/login_screen"
        else:
            page.route = "/homepage"    


    def route_change(e):
        page.views.clear()

        if page.route == "/login_screen":
            phone_num_field = ft.TextField(hint_text="Your phone number", expand=True)
            page.views.append(
                View(
                    "/login_screen",
                    [
                        AppBar(title=Text("Login"), bgcolor=colors.SURFACE_VARIANT),
                        phone_num_field,
                        ElevatedButton(text='Get code', on_click= get_verif_async(phone_num_field.value)),                        
                    ],
                )
            )
        if page.route == "/homepage":
            page.views.append(
                View(
                    "/homepage",
                    [
                        AppBar(title=Text("homepage"), bgcolor=colors.SURFACE_VARIANT),
                    ],
                )
            )


        page.update()

    def view_pop(e):
        page.views.pop()
        top_view = page.views[-1]
        page.go(top_view.route)

    # async script startup
    startup_async()

    page.on_route_change = route_change
    page.on_view_pop = view_pop

    page.go(page.route)


ft.app(target=main)

我不知道我做错了什么,但函数 get_verification_code 在启动时始终执行,即使我没有单击该函数链接到的按钮。为什么?

最佳答案

每次运行脚本时函数 get_verification_code 都会运行,因为您在创建按钮时调用函数 get_verif_async 并向其传递参数:

ElevatedButton(text='Get code', on_click= get_verif_async(phone_num_field.value))

您可以通过传递不带括号和参数的函数 get_verif_async 来避免这种情况。

这样,脚本运行时不会调用该函数,但单击按钮时会调用该函数,可以使用 lambda 传递参数:

ElevatedButton(text='Get code', on_click=lambda: get_verif_async(phone_num_field.value))

关于Python Flet 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75231045/

相关文章:

python - django 具有多个数据库和用户外键

python - 使用追加构建二维数组

python - 散列生成器表达式

python - 从 pandas DataFrame 制作热图

python - FLET 应用程序中的垂直滚动条不出现

python-3.x - 如何更改Flet中的加载标志?

python - 替换字符串中的日期时间字符