Usando la cámara¶
Casi todos los dispositivos informáticos modernos tienen algún tipo de cámara. En este tutorial, mostramos una nueva aplicación que pueda solicitar acceso a esta cámara, tomar una fotografía y luego mostrarla en la aplicación. La nueva aplicación que utiliza la cámara de tu dispositivo.
Este tutorial no funciona en todas las plataformas.
Lamentablemente, por el momento, este tutorial solo funcionará en macOS y Android.
Aunque todos los iPhone tienen cámaras, el emulador de iOS no tiene una cámara que funcione. Los dispositivos Windows y Linux también tienen cámaras, pero Toga actualmente no tiene la capacidad de acceder a la cámara en estas plataformas.
El código que aquí se muestra se ejecutará en Windows o Linux; pero generará un error cuando intentes hacer una foto.
El código funcionará si se ejecuta en un dispositivo iOS real, pero no podrá hacer una foto si se implementa en el emulador de iOS.
Iniciar un nuevo proyecto¶
Para este tutorial, no desarrollaremos la aplicación del tutorial principal, sino que comenzaremos un nuevo proyecto. Puede utilizar el mismo entorno virtual que utilizó en el primer proyecto. Sin embargo, debemos ejecutar nuevamente el asistente Nuevo maletín.
Regrese al directorio que contiene la carpeta del proyecto helloworld e inicie
un nuevo proyecto llamado “Hello Camera”:
(beeware-venv) $ cd ..
(beeware-venv) $ briefcase new
...
[hellocamera] Generated new application 'Hello Camera'
To run your application, type:
$ cd hellocamera
$ briefcase dev
(beeware-venv) $ cd hellocamera
Añade código para tomar una foto¶
El asistente ha generado un nuevo proyecto Toga vacío. Ahora podemos agregar el
código para tomar y mostrar una fotografía. Edite el archivo app.py de la
nueva aplicación para que tenga el siguiente contenido:
import toga
from toga.style.pack import COLUMN, ROW
class HelloCamera(toga.App):
def startup(self):
main_box = toga.Box()
self.photo = toga.ImageView(height=300, margin=5)
camera_button = toga.Button(
"Take photo",
on_press=self.take_photo,
margin=5,
)
main_box.add(self.photo)
main_box.add(camera_button)
self.main_window = toga.MainWindow(title=self.formal_name)
self.main_window.content = main_box
self.main_window.show()
async def take_photo(self, widget, **kwargs):
try:
if not self.camera.has_permission:
await self.camera.request_permission()
image = await self.camera.take_photo()
if image:
self.photo.image = image
except NotImplementedError:
await self.main_window.dialog(
toga.InfoDialog(
"Oh no!",
"The Camera API is not implemented on this platform",
)
)
except PermissionError:
await self.main_window.dialog(
toga.InfoDialog(
"Oh no!",
"You have not granted permission to take photos",
)
)
def main():
return HelloCamera()
Este código tiene dos cambios con respecto a la aplicación predeterminada que genera Briefcase. Estas novedades están resaltadas en amarillo:
- El primer bloque de código resaltado (en el método
startup()) agrega los dos widgets necesarios para controlar la cámara: unImageViewpara mostrar una foto; y unButtonpara activar la cámara. - El segundo bloque de código resaltado (el método
take_photo()) define el controlador de eventos cuando se presiona el botón. Este controlador primero confirma si la aplicación tiene permiso para tomar una foto; si no existe permiso, se solicita. Luego, se toma una foto. La solicitud de permiso y la solicitud para tomar una foto son ambas solicitudes asincrónicas, por lo que requieren el uso deawait; mientras la aplicación espera que el usuario confirme los permisos o tome la foto, el bucle de eventos de la aplicación puede continuar en segundo plano.
Si la cámara toma una foto correctamente, devolverá un objeto Image que se
puede asignar como contenido de ImageView. Si el usuario canceló la solicitud
de la foto, la llamada self.camera.take_photo() devolverá None y el
resultado se puede ignorar. Si el usuario no otorga permiso para usar la cámara,
o la cámara no está implementada en la plataforma actual, se generará un error y
se mostrará un cuadro de diálogo al usuario.
Agregar permisos al dispositivo¶
Parte de este código que acabamos de agregar solicita permiso para usar la cámara. Esta es una característica común de las plataformas de aplicaciones modernas: no se puede acceder a las funciones de hardware sin pedirle permiso explícitamente al usuario primero.
Sin embargo, esta solicitud se presenta en dos partes. La primera se encuentra en el código que acabamos de ver, pero antes de que la aplicación pueda solicitar permisos, necesita declarar los permisos que va a solicitar.
Los permisos que requiere cada plataforma son ligeramente diferentes, pero
Briefcase tiene una representación multiplataforma para muchos permisos de
hardware comunes. En la sección de configuración
[tool.briefcase.app.helloworld] del archivo pyproject.toml de su aplicación,
agregue lo siguiente (justo encima de la declaración sources):
permission.camera = "App will take mugshots."
Esto explica que su aplicación necesita acceder a la cámara y proporciona una breve descripción de por qué se requiere la cámara. Esta descripción es obligatoria en algunas plataformas (en particular, macOS e iOS) y se presenta al usuario como información adicional cuando se muestra el cuadro de diálogo de permisos.
Ahora podemos generar y ejecutar la aplicación:
(beeware-venv) $ briefcase create
(beeware-venv) $ briefcase build
(beeware-venv) $ briefcase run
(beeware-venv) $ briefcase create android
(beeware-venv) $ briefcase build android
(beeware-venv) $ briefcase run android
Cuando se ejecuta la aplicación, se te presentará un botón. Pulsa el botón y se mostrará el cuadro de diálogo de la cámara predeterminada de la plataforma. Toma una foto; el cuadro de diálogo de la cámara desaparecerá y la foto se mostrará en la aplicación, justo encima del botón. Luego, puedes tomar otra foto; esta reemplazará la primera foto.
Agregar más permisos¶
Los permisos se declaran en los archivos que se generan durante la llamada
original a briefcase create. Lamentablemente, Briefcase no puede actualizar
estos archivos una vez que se han generado inicialmente; por lo tanto, si desea
agregar un nuevo permiso a su aplicación o modificar los permisos existentes,
deberá volver a crear la aplicación. Puede hacerlo volviendo a ejecutar
briefcase create; esto le advertirá que la aplicación existente se
sobrescribirá y luego regenerará la aplicación con los nuevos permisos.