@@ -53,6 +53,19 @@ class Preview(Enum):
5353 DRM = DrmPreview
5454 QT = QtPreview
5555 QTGL = QtGlPreview
56+ NO = None
57+
58+ @staticmethod
59+ def auto ():
60+ # Crude attempt at "autodetection" but which will mostly (?) work. We will
61+ # probably find situations that need fixing, VNC perhaps.
62+ display = os .getenv ('DISPLAY' )
63+ if display is None :
64+ return Preview .DRM
65+ elif display .startswith (':' ):
66+ return Preview .QTGL
67+ else :
68+ return Preview .QT
5669
5770
5871class GlobalCameraInfo (TypedDict ):
@@ -578,34 +591,23 @@ def start_preview(self, preview=None, **kwargs) -> None:
578591 """
579592 Start the given preview which drives the camera processing.
580593
581- The preview may be either:
582- None or False - in which case a NullPreview is made,
583- True - which we hope in future to use to autodetect
584- a Preview enum value - in which case a preview of that type is made,
585- or an actual preview object.
594+ preview - a Preview enum or an actual preview object.
595+ Pass Preview.auto() to autodetect. Defaults to NullPreview.
586596
587- When using the enum form, extra keyword arguments can be supplied that
588- will be forwarded to the preview class constructor.
597+ **kwargs - keyword arguments to be forwarded to the preview
598+ class constructor, when using the enum form
589599 """
590- if self ._event_loop_running :
591- raise RuntimeError ("An event loop is already running" )
592-
593- if preview is True :
594- # Crude attempt at "autodetection" but which will mostly (?) work. We will
595- # probably find situations that need fixing, VNC perhaps.
596- display = os .getenv ('DISPLAY' )
597- if display is None :
598- preview = Preview .DRM .value (** kwargs )
599- elif display .startswith (':' ):
600- preview = Preview .QTGL .value (** kwargs )
601- else :
602- preview = Preview .QT .value (** kwargs )
603- elif preview is False or preview is None :
604- preview = Preview .NULL .value (** kwargs )
600+ if preview is None :
601+ preview = NullPreview (** kwargs )
605602 elif isinstance (preview , Preview ):
603+ if preview is Preview .NO :
604+ return
606605 preview = preview .value (** kwargs )
607606 # Assume it's already a preview object.
608607
608+ if self ._event_loop_running :
609+ raise RuntimeError ("An event loop is already running" )
610+
609611 # The preview windows call the attach_preview method.
610612 self ._preview_stopped .clear ()
611613 preview .start (self )
@@ -1189,20 +1191,16 @@ def start(self, config=None, show_preview=None) -> None:
11891191
11901192 Camera controls may be sent to the camera before it starts running.
11911193
1192- config - if given it is used to configure the camera .
1193- Defaults to 'preview' configuration if the camera is unconfigured .
1194+ config - Camera configuration to be set. Defaults to 'preview' configuration .
1195+ Note: if the camera is already configured, this has no effect .
11941196
1195- show_preview - whether to show a preview window. By default no visible preview window
1196- will be shown but the NullPreview would still run. True will attempt to autodetect.
1197- False would skip starting an event loop altogether. A Preview enum could also given.
1197+ show_preview - a Preview enum or an actual preview object.
1198+ Pass Preview.auto() to autodetect. Defaults to NullPreview.
11981199 Note: if an event loop is already running, this has no effect.
11991200 """
1200- if not self .camera_config and config is None :
1201- config = "preview"
1202- if config is not None :
1201+ if not self .camera_config :
12031202 self .configure (config )
1204- # By default we will create an event loop if there isn't one running already.
1205- if show_preview is not False and not self ._event_loop_running :
1203+ if not self ._event_loop_running :
12061204 self .start_preview (show_preview )
12071205 self .start_ ()
12081206
0 commit comments