여러 Python 앱이 동일한 BoAYo 창 규칙을 쓰려면 boayo_sdk.py를 가져옵니다. SDK가 Bosio IPC 접속, 창 등록, 아래 캡션, 이벤트 분배를 맡고 앱은 내용만 그립니다.
SDK 함수·이벤트 안내에 함수별 인자와 반환값, BoayoEvent 필드, BoayoSurface 그리기 함수를 정리했습니다.
가장 작은 실행 앱
import time
from boayo_sdk import BoayoSDK, INK
with BoayoSDK("hello") as sdk:
window = sdk.create_window("Hello", width_deg=38, height_deg=28)
def draw(canvas, content):
canvas.text("HELLO", content.x + 20, content.y + 20,
INK, scale=3, bold=True)
window.present(draw)
while not window.closed:
for event in sdk.poll_events():
if (event.window_id == window.window_id
and event.type == "pointer_button" and event.pressed):
print(f"click: ({event.x:.1f}, {event.y:.1f})", flush=True)
time.sleep(0.05)
create_window()에서 중심 각도를 생략하면 런처가 BOAYO_APP_AZIMUTH와 BOAYO_APP_ELEVATION으로 전달한 위치에 창이 열립니다. content는 캡션을 제외한 앱 내용 영역이고, 클릭 좌표 event.x/y도 그 영역의 왼쪽 위가 기준입니다. 캡션 클릭은 SDK가 처리하므로 앱 내용의 클릭 이벤트로 전달되지 않습니다.
이미지 전달
# image: NumPy 배열, shape=(높이, 너비, 3), RGB24
window.present_rgb(image, fit="contain")
# 필요하면 fit="stretch"
앱에서 만든 RGB 이미지를 보내면 SDK가 창 내용 영역에 맞춰 놓고 아래 캡션을 그립니다. 글씨의 선명도는 원본 이미지 크기, 창의 각도 크기, M 분할 수, Bosio의 투영 안티에일리어싱에 영향을 받습니다. 작은 글씨는 앱에서 먼저 크게·굵게 그리는 편이 좋습니다.
현재 크기와 포커스 읽기
state = sdk.window_state(window) # 또는 window.state
print(state.width_deg, state.height_deg) # 구면 창의 각도 크기(°)
print(state.surface_width, state.surface_height) # RGB24 표면 픽셀 크기
print(state.content_width, state.content_height) # 캡션 제외 내용 크기
print(state.focused) # 포커스 여부
for event in sdk.poll_events():
if event.window_id != window.window_id:
continue
if event.type == "resize":
print("size", event.state.width_deg, event.state.height_deg)
window.present(draw) # 필요한 경우 내용 다시 그리기
elif event.type == "focus":
print("focus", event.focused)
BoayoWindowState는 읽는 시점의 창 상태를 복사한 값입니다. 캡션 조작으로 창의 각도 크기가 바뀌면 resize 이벤트가 sdk.poll_events() 호출당 창별로 최대 한 번 전달됩니다. 드래그가 창 밖으로 이어져도 변경을 감지합니다. 포커스 상태는 이벤트를 읽은 뒤 갱신됩니다. 각도 크기를 조절해도 RGB 이미지와 내용 영역의 픽셀 크기는 바뀌지 않습니다. SDK를 거치지 않고 Bosio IPC에서 직접 바꾼 창 위치·크기는 SDK 창 객체에 자동으로 반영되지 않습니다.
한 앱에서 여러 창
with BoayoSDK("multi-view") as sdk:
main = sdk.create_window("Main")
tools = sdk.create_window("Tools", azimuth=20, elevation=0,
width_deg=30, height_deg=22)
main.present(draw_main)
tools.present(draw_tools)
while sdk.windows:
for event in sdk.poll_events():
if event.window_id == main.window_id:
handle_main(event)
elif event.window_id == tools.window_id:
handle_tools(event)
time.sleep(0.05)
한 앱에서 여러 창을 만들면 SDK가 이벤트를 한 번 읽어 창 ID별로 나눕니다. 이미지가 바뀌지 않는 앱도 sdk.poll_events()를 계속 호출해야 캡션의 닫기·이동·크기 조절이 작동합니다. 런처 목록에 앱을 표시하려면 apps.json에 실행 command를 등록해야 합니다.