9.3 Python pārvēršana tīmekļa saskarnē
Stundas uzdevums: Pārveidot terminālī darbojošos Python skriptu par tīmekļa lietotni ar Streamlit bibliotēku.
70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - palaid pirmo Streamlit lapu · 2. uzdevums (~25 min) - pievieno ievades elementus un pogu · 3. uzdevums (~20 min) - pārcel savu Python spēli uz saskarni. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: aktivizē savu virtuālo vidi un izpildi pip install streamlit. Lapu palaidīsi ar streamlit run, nevis ar python.
Teorija: Streamlit - Python kā web saskarne
Streamlit ir Python ietvars, kas pārvērš parastu Python kodu par interaktīvu web lietotni - bez HTML/CSS/JS rakstīšanas.
import streamlit as st
# Virsraksti
st.title("Mans projekts")
st.header("Apakšsadaļa")
st.write("Vienkāršs teksts")
st.markdown("**Treknrakstā** un *kursīvā*")
# Ievades elementi
vards = st.text_input("Tavs vārds:")
vecums = st.number_input("Vecums", min_value=1, max_value=120, value=18)
ir_skoleens = st.checkbox("Es piedalos")
limenis = st.slider("Grūtība", 1, 10, 5)
if st.button("Sākt"):
st.success(f"Sveiks, {vards}! ({vecums} g.)")
# Datu attēlošana
import pandas as pd
df = pd.DataFrame({"Vārds": ["Anna", "Jānis"], "Punkti": [120, 95]})
st.dataframe(df)
st.bar_chart(df.set_index("Vārds"))
Palaiž ar streamlit run app.py. Lapa pati pārlādējas, kad maini kodu!
Praktiskie uzdevumi
1. uzdevums -
Palaid pirmo Streamlit lapu
Beigās tavs Python kods būs redzams pārlūkā.
- Izveido failu
lapa.pyun ierakstiimport streamlit as st. - Pievieno rindu
st.title("Mans projekts"). - Pievieno rindu
st.write("Sveiks, pasaule!"). - Izpildi terminālī
streamlit run lapa.py. - Atver pārlūkā adresi, ko izdrukāja terminālis.
- Nomaini virsraksta tekstu, saglabā failu un vēro, kas notiek pārlūkā.
Gatavs, kad: pārlūkā redzams tavs virsraksts, un pēc faila saglabāšanas lapa pati piedāvā pārlādēties.
2. uzdevums -
Pievieno ievades elementus un pogu
Beigās lietotājs varēs ievadīt datus bez termināļa.
- Pievieno
vards = st.text_input("Tavs vārds:"). - Pievieno
vecums = st.number_input("Vecums", min_value=1, max_value=120). - Pievieno
if st.button("Apstiprināt"):. - Izdrukā zem tā
st.write(f"Sveiks, {vards}!"). - Palaid un ievadi savu vārdu.
- Pārbaudi, kas notiek, ja vārda lauks ir tukšs.
- Pievieno nosacījumu, kas prasa ievadīt vārdu.
Gatavs, kad: poga parāda sveicienu ar ievadīto vārdu, bet ar tukšu lauku parādās lūgums to aizpildīt.
3. uzdevums -
Pārcel savu Python spēli uz saskarni
Beigās tava vecā termināļa spēle strādās pārlūkā.
- Nokopē savu skaitļu minētāju no 4.6 stundas jaunā failā.
- Aizstāj katru
input()arst.number_input(). - Aizstāj katru
print()arst.write(). - Ieliec minējuma pārbaudi zem
if st.button("Min!"):. - Palaid un izmēģini vienu minējumu.
- Pieraksti, kas notiek ar slepeno skaitli pēc katra klikšķa.
- Pieraksti vienu secinājumu: kāpēc
whilecikls te vairs neder.
Gatavs, kad: spēle reaģē uz pogu, un tu vari izskaidrot, kāpēc skaitlis mainās pie katra klikšķa.
Papildu uzdevums - Pievieno sānjoslu
Ja pamatdarbs ir gatavs, pārcel iestatījumus uz sānjoslu.
- Pievieno
st.sidebar.header("Iestatījumi"). - Pārcel diapazona izvēli uz
st.sidebar.slider(). - Izmanto slidera vērtību spēles diapazonam.
- Palaid un nomaini diapazonu uz 1-1000.
- Pārbaudi, ka spēle strādā ar jauno diapazonu.
Gatavs, kad: sānjoslā ir slideris, un spēles diapazons mainās līdzi tā vērtībai.
Biežākās kļūdas
- Lietotne pārlādējas no nulles: Streamlit pārpalaiž visu skriptu pie katras izmaiņas. Lieto
session_state. - Streamlit komandas ārpus skripta:
st.writeu.c. strādā tikaistreamlit runkontekstā. - Aizmirsts
if st.button():bloks: Bez tā kods izpildās uzreiz.
Koda piemērs
import streamlit as st
import random
st.title("▸ Skaitļu minētājs")
if "skaitlis" not in st.session_state:
st.session_state.skaitlis = random.randint(1, 100)
st.session_state.megi = 0
minejums = st.number_input("Min skaitli (1-100):", 1, 100, 50)
if st.button("Min!"):
st.session_state.megi += 1
if minejums == st.session_state.skaitlis:
st.success(f"★ Trāpīts {st.session_state.megi}. mēģinājumā!")
elif minejums < st.session_state.skaitlis:
st.info("↑ Patiesais ir lielāks")
else:
st.info("↓ Patiesais ir mazāks")
if st.button("Jauna spēle"):
del st.session_state.skaitlis
st.rerun()
Pēc 'Min' tiek parādīts mājiens;
Pēc trāpījuma - uzvaras paziņojums.