Gelung
Panel mentakrifkan view(state), dan secara pilihan initial(), on_open(state) serta on_action(action, state). Clink memanggil initial() sekali untuk keadaan permulaan, on_open setiap kali panel muncul, kemudian view(state) untuk membina antara muka. Satu kawalan sama ada memasukkan teks di tempat anda menulis, menetapkan keadaan baharu, atau menamakan tindakan untuk dikendalikan on_action, dan paparan dibina semula.
def initial():
return {"count": 0, "step": 1}
def view(state):
return vstack([
text(f"{state['count']}", size=34, weight="bold", align="center"),
segmented(["1", "5", "10"], value=str(state["step"]), action="step"),
hstack([
button("−", "bump", value=-1),
button("+", "bump", value=1, style="primary"),
]),
button("Type it", "type", icon="keyboard"),
])
def on_action(action, value, state):
if action == "bump":
state["count"] = state["count"] + value * state["step"]
elif action == "step":
state["step"] = int(value)
elif action == "type":
insert(str(state["count"]))
close()
return stateKalkulator, papan snippet, pemilih: panel anda muncul di sebalik butang panel papan kekunci.
Pembina
view(state) memulangkan nod yang dibuat oleh 19 fungsi ini. Sarangkan sesuka hati: tindanan dan grid menerima senarai anak.
| Pembina | Apa yang dilukis |
|---|---|
vstack(children, spacing=6, align="leading") | Menindan anaknya ke bawah panel. |
hstack(children, spacing=6, align="center") | Menindan anaknya merentas panel. |
grid(children, columns=4, spacing=6) | Menyusun anaknya ke dalam lajur yang sama rata. |
wrap(children, spacing=6) | Menyusun elemennya melintasi panel dan menyambung ke baris berikutnya. |
scroll(children, spacing=6) | Kawasan tatal tersendiri, untuk senarai yang lebih panjang daripada panel. |
card(children, padding=10, color="") | Mengumpulkan elemennya pada satu permukaan, dengan ruang di sekelilingnya. |
spacer(size=0) | Menolak apa-apa yang menyusul ke hujung. |
divider() | Garis halus antara baris. |
text(s, size=17, weight="regular", color="", align="leading", lines=0, mono=False) | Satu baris teks. weight menerima regular, medium, semibold, bold, heavy, light atau thin; align menerima leading, center atau trailing; lines mengehadkan bilangan baris; color menerima nama warna atau #RRGGBB. |
icon(name, size=20, color="") | Satu SF Symbol, mengikut namanya. |
badge(s, color="") | Satu perkataan pendek dalam kapsul berwarna. |
progress(value, total=1, label="") | Bar yang terisi sehingga value daripada total. |
button(label, action="", value=None, insert="", set=None, style="plain", icon="", enabled=True) | Satu butang. insert menaip teksnya ke dalam apa yang sedang anda tulis, set menggabungkan kunci ke dalam keadaan, dan action menamakan pengendali untuk on_action. style menerima plain, primary, tinted, quiet atau destructive. |
row(title, subtitle="", detail="", icon="", action="", value=None, insert="") | Baris yang boleh diketik: tajuk, baris kedua, ikon, dan butiran di sebelah kanan. |
toggle(label, on=False, key="", action="") | Satu suis. key menulis True atau False ke dalam kunci keadaan itu. |
slider(value, min=0, max=100, step=1, label="", key="", action="") | Peluncur antara min dan max. key menulis kedudukannya ke dalam kunci keadaan itu. |
stepper(value, min=0, max=100, step=1, label="", key="", action="") | Satu nilai dengan − dan + di sebelahnya, antara min dan max. |
segmented(options, value=None, key="", action="") | Satu pilihan daripada senarai. key menulis pilihan itu ke dalam kunci keadaan. |
field(key, placeholder="", action="", submit="") | Kotak teks yang terikat pada state[key]. Mengetiknya mengalihkan kekunci ke kunci itu; submit menamakan pengendali yang dijalankan oleh Return. |
Rentetan biasa berfungsi di mana-mana sahaja nod berfungsi: ia dipaparkan sebagai teks pada saiz lalai.
Mengendalikan ketikan
Kawalan yang perlu mengira sesuatu menamakan satu action, bukannya membawa set yang tetap. Clink kemudian memanggil on_action(action, state), atau on_action(action, value, state) apabila anda mahukan nilai yang dibawa kawalan itu. Keadaan ialah kamus biasa: ubahnya di tempat dan jangan pulangkan apa-apa, atau pulangkan yang baharu.
def initial():
return {"items": [], "draft": ""}
def view(state):
return vstack([
field("draft", placeholder="Add one…", submit="add"),
scroll([row(item, action="use", value=item) for item in state["items"]]),
])
def on_action(action, value, state):
if action == "add" and value:
state["items"].append(value)
state["draft"] = ""
elif action == "use":
insert(value)
close()
return stateon_open(state) berjalan setiap kali panel muncul; di situlah panel mengambil permulaannya daripada apa yang sedang anda tulis.
Meminta papan kekunci
Daripada on_action dan on_open, panel boleh meminta papan kekunci melakukan perkara yang tidak dapat dinyatakan oleh nilai pulangan. Setiap panggilan dicatat dan dilaksanakan selepas fungsi anda selesai, jadi panel tidak pernah menyunting medan semasa paparannya sendiri sedang dibina.
Arahan
insert()backspace()delete_word()replace()move_cursor()copy()close()haptic()toast()
def on_action(action, state):
if action == "quote":
word = context()["word"]
replace(len(word), "“" + word + "”")
haptic("light")
return statecontext() membaca apa yang ada di sekeliling kursor: before, selected, after, word, clipboard, locale, language, full_access dan time. Ia petikan keadaan yang diambil ketika panggilan bermula, jadi ia tidak boleh berubah di bawah anda separuh jalan semasa membina paparan.
Keadaan
Keadaan ialah kamus biasa, dan ia menyimpan apa sahaja yang boleh dibina oleh skrip: nombor, rentetan, boolean, None, serta senarai dan kamus daripadanya. Ia dipulangkan kepada anda pada setiap panggilan, jadi senarai yang anda tambah pada satu ketikan masih ada pada ketikan berikutnya.
def initial():
return {"name": ""}
def view(state):
return vstack([
field("name", placeholder="Who?"),
button("Greet", insert="Hi " + state["name"] + "!", style="primary"),
])Ingat keadaan mengekalkan kandungan panel antara setiap kali dibuka, dan antara sesi papan kekunci. Biarkan mati untuk kalkulator; hidupkan untuk senarai.
Keadaan hidup selagi papan kekunci ada di skrin, dan lebih lama apabila panel mengingatnya. Panel boleh membaca teks di sekeliling kursor dengan context(); tiada apa-apa lagi tentang anda.
Had
Papan kekunci hanya mendapat sebahagian kecil daripada memori sebuah app, jadi panel dihadkan dan bukannya dipercayai begitu sahaja. Setiap lukisan mendapat 2,000,000 langkah pentafsir, dan gelung yang terlepas berakhir dengan ralat pada skrin dan bukan papan kekunci yang berhenti menjawab.
Panel yang tiba sebagai fail atau daripada repositori diperiksa sebelum disimpan. Ia mesti di bawah 48,000 bait dan 1,200 baris, mesti mentakrifkan def view(, setiap import mesti menamakan salah satu ruang nama terkurung, dan serpihan berikut ditolak terus:
Ditolak dalam panel yang dikongsi
__exec(eval(open(compile(
Boleh diimport dalam panel yang dikongsi
jsonmathrandomresystime
Panel yang anda tulis dalam apl tidak tertakluk kepada senarai itu. Ketika itu hanya belanjawan langkah yang akan menghentikan gelung yang terlepas kawalan, jadi berilah ia jalan keluar.
Penempatan
Beri setiap panel butangnya sendiri dalam pemilih, bukannya menyarangkan semuanya di sebalik satu butang Panel. Panel individu boleh menggantikan ini dalam editornya.
Lalai mengikut suis itu, Berasingan sentiasa mendapat butangnya sendiri, dan Berkumpulan sentiasa bersarang.
Menulis satu
- Buka Panel Tersuai dalam Clink dan ketik Panel baru.
- Tulis skrip itu. Pratonton menjalankan panel sebenar di sebelahnya, dan ralat muncul sambil anda menaip.
- Simpan, hidupkan panel itu, kemudian buka butang panel pada papan kekunci.
Kongsi panel menulis fail .clinkpanel, iaitu JSON. Membukanya semula dalam Clink menyimpannya dengan id baharu, jadi mengimport panel yang sama dua kali tidak pernah menimpa yang pertama.
Pencipta ›