/
main.py
executable file
·37 lines (30 loc) · 1.4 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3
import asyncio
from typing import Optional
import httpx
from nicegui import events, ui
api = httpx.AsyncClient()
running_query: Optional[asyncio.Task] = None
async def search(e: events.ValueChangeEventArguments) -> None:
'''Search for cocktails as you type.'''
global running_query
if running_query:
running_query.cancel() # cancel the previous query; happens when you type fast
search_field.classes('mt-2', remove='mt-24') # move the search field up
results.clear()
# store the http coroutine in a task so we can cancel it later if needed
running_query = asyncio.create_task(api.get(f'https://www.thecocktaildb.com/api/json/v1/1/search.php?s={e.value}'))
response = await running_query
if response.text == '':
return
with results: # enter the context of the the results row
for drink in response.json()['drinks'] or []: # iterate over the response data of the api
with ui.image(drink['strDrinkThumb']).classes('w-64'):
ui.label(drink['strDrink']).classes('absolute-bottom text-subtitle2 text-center')
running_query = None
# create a search field which is initially focused and leaves space at the top
search_field = ui.input(on_change=search) \
.props('autofocus outlined rounded item-aligned input-class="ml-3"') \
.classes('w-96 self-center mt-24 transition-all')
results = ui.row()
ui.run()