我正在尝试使用带有异步函数的 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/