User-interface and worker API¶
Measurement logic communicates through a small adapter interface. This keeps terminal and Qt front ends separate from the measurement environment. Blocking device operations belong in a worker thread; adapter calls transport prompts, progress, interruption, and log information.
- class mpylab.env.ui.ui_adapter.MeasurementUIAdapter¶
Abstract UI adapter contract for measurement flows.
- ask(msg: str = 'Are you ready?', buttons: list[str] | None = None, level: str = '', data: dict[Any, Any] | None = None) int¶
Display a question and return the selected button index.
- Parameters:
msg (str, optional) – User-facing prompt text.
buttons (list of str or None, optional) – Available answer labels.
level (str, optional) – Message severity or presentation level.
data (dict or None, optional) – Structured context supplied with the prompt.
- check_interrupt() int | None¶
Check for an interrupt request using key polling.
- Returns:
Pending key code, or
Nonewhen no interrupt was requested.- Return type:
int or None
- emit_log(block, *args) None¶
Emit one structured log block.
- Parameters:
block (object) – Log block or message.
*args (object) – Additional arguments forwarded to logger callbacks.
- poll_key() int | None¶
Poll one pending key event, if any.
- post_user_event() None¶
Run hook after user-facing event.
- pre_user_event() None¶
Run hook before user-facing event.
- run_interactive(obj: Any, banner: str) None¶
Start an interactive shell for an object.
- Parameters:
obj (object) – Object exposed to the interactive session.
banner (str) – Introductory session text.
- class mpylab.env.ui.ui_adapter.TUIAdapter(messenger: Callable[[str, list[str] | None, str, dict[Any, Any] | None], int], logger: list[Callable[[...], Any]] | None, interrupt_tester: Callable[[], int | None], pre_user_event: Callable[[], None], post_user_event: Callable[[], None], interactive_runner: Callable[[Any, str], None])¶
Default terminal adapter using callbacks supplied by
Measure.- Parameters:
messenger (callable) – Callback that displays prompts and returns an answer index.
logger (list of callable or None) – Callbacks receiving structured log blocks.
interrupt_tester (callable) – Non-blocking callback returning a pending key code.
pre_user_event (callable) – Hook invoked before user interaction.
post_user_event (callable) – Hook invoked after user interaction.
interactive_runner (callable) – Callback starting an interactive session.
- ask(msg: str = 'Are you ready?', buttons: list[str] | None = None, level: str = '', data: dict[Any, Any] | None = None) int¶
Forward a prompt to the configured messenger.
- Parameters:
msg (str, optional) – User-facing prompt text.
buttons (list of str or None, optional) – Available answer labels.
level (str, optional) – Message severity or presentation level.
data (dict or None, optional) – Structured context supplied with the prompt.
- Returns:
Index of the selected answer.
- Return type:
int
- emit_log(block, *args) None¶
Forward one log block to all configured loggers.
- Parameters:
block (object) – Log block or message.
*args (object) – Additional arguments forwarded to every logger callback.
- poll_key() int | None¶
Poll the configured interrupt tester.
- Returns:
Pending key code, or
Nonewhen no key is available.- Return type:
int or None
- post_user_event() None¶
Call post-user-event hook.
- pre_user_event() None¶
Call pre-user-event hook.
- run_interactive(obj: Any, banner: str) None¶
Call the interactive runner with an object and banner.
- Parameters:
obj (object) – Object exposed to the interactive session.
banner (str) – Introductory session text.
- set_interactive_runner(runner: Callable[[Any, str], None]) None¶
Replace the interactive-session callback.
- Parameters:
runner (callable) – Callback accepting the exposed object and session banner.
- set_interrupt_tester(tester: Callable[[], int | None]) None¶
Replace the interrupt polling callback.
- Parameters:
tester (callable) – Non-blocking callback returning a pending key code.
- set_logger(logger: list[Callable[[...], Any]] | None) None¶
Replace the logger callback list.
- Parameters:
logger (list of callable or None) – Callbacks receiving structured log blocks.
- set_messenger(messenger: Callable[[str, list[str] | None, str, dict[Any, Any] | None], int]) None¶
Replace the messenger callback.
- Parameters:
messenger (callable) – Callback that displays prompts and returns an answer index.
- set_post_user_event(cb: Callable[[], None]) None¶
Replace the post-user-event callback.
- Parameters:
cb (callable) – Hook invoked after user interaction.
- set_pre_user_event(cb: Callable[[], None]) None¶
Replace the pre-user-event callback.
- Parameters:
cb (callable) – Hook invoked before user interaction.
- mpylab.env.ui.ui_adapter.resolve_poll_key(handler: Any, caller_locals: dict[str, Any] | None = None) Callable[[], int | None] | None¶
Resolve a poll-key callable from a handler or caller context.
- Parameters:
handler (object) – Explicit polling callback, if callable.
caller_locals (dict or None, optional) – Caller namespace whose
self.PollKeymethod is used as a fallback.
- Returns:
Non-blocking key polling callback, or
Nonewhen unavailable.- Return type:
callable or None
Qt adapter and runner¶
- class mpylab.env.ui.qt_adapter.QtUIAdapter(interrupt_key: str = 'q')¶
Qt-backed measurement UI adapter.
The stop button does not access hardware directly. It sets an interrupt flag that is returned once by
poll_key(), allowing the existing measurement safety path to callRFOff_Devicesfrom the measurement worker thread.- Parameters:
interrupt_key (str, optional) – Synthetic key returned once after a stop request. The first character is used and defaults to
"q".
- answer_prompt_with_quit() bool¶
Answer an active prompt with
Quitwhen available.- Returns:
Trueif a matching answer was submitted, otherwiseFalse.- Return type:
bool
- ask(msg: str = 'Are you ready?', buttons: list[str] | None = None, level: str = '', data: dict[Any, Any] | None = None) int¶
Display a prompt and wait for the selected button index.
This method is called from the measurement worker. Communication with Qt widgets uses queued signals; waiting occurs on a condition and does not block the Qt event loop.
- Parameters:
msg (str, optional) – User-facing prompt text.
buttons (list of str or None, optional) – Available answers.
NoneprovidesOkandQuit.level (str, optional) – Message severity or presentation level.
data (dict or None, optional) – Structured context supplied with the prompt.
- Returns:
Selected answer index, or
-1for an informational message without buttons.- Return type:
int
- create_widget(parent=None) MeasurementControlWidget¶
Create the control widget for this adapter.
- Parameters:
parent (QWidget or None, optional) – Parent widget.
- Returns:
Newly created control widget.
- Return type:
- emit_log(block, *args) None¶
Emit log data to Qt and configured logger callbacks.
- Parameters:
block (object) – Log block or message displayed as text in Qt.
*args (object) – Additional arguments forwarded to logger callbacks.
- poll_key() int | None¶
Return a synthetic key code after a Stop / RF Off request.
- Returns:
Configured interrupt key once per request, otherwise
None.- Return type:
int or None
- post_user_event() None¶
Mark UI state after a user-facing event.
- pre_user_event() None¶
Mark UI state before a user-facing event.
- request_interrupt() None¶
Request measurement interruption at the next poll point.
- request_stop() None¶
Request stop, answering an active Quit prompt if possible.
- run_interactive(obj: Any, banner: str) None¶
Report that terminal-style interactive mode is unavailable.
- Parameters:
obj (object) – Object that would have been exposed to an interactive session. It is not used by the Qt adapter.
banner (str) – Session description included in the log message.
- set_configuration(config, trace=None) None¶
Store a read-only effective configuration for the Qt view.
- Parameters:
config (dict) – Effective configuration before runtime UI objects are attached.
trace (ConfigTrace or None, optional) – Ordered provenance of the configuration values.
- Raises:
TypeError – If the configuration or trace cannot be represented.
- set_logger(logger: list[Any] | None) None¶
Set optional additional logger callbacks.
- Parameters:
logger (list or None) – Objects that are callable are retained as log callbacks.
- submit_answer(index: int) None¶
Submit a prompt answer from the UI thread.
- Parameters:
index (int) – Zero-based answer index.
- submit_eut_status(status: str) bool¶
Submit a manual during-exposure EUT observation from Qt.
- Parameters:
status (str) – Functional-state identifier accepted by the manual EUT monitor.
- Returns:
Trueif the observation was accepted, otherwiseFalse.- Return type:
bool
- submit_post_exposure_state(state: str, recovery: str) bool¶
Submit post-exposure state and recovery observations.
- Parameters:
state (str) – Functional state observed after exposure.
recovery (str) – Recovery category associated with that state.
- Returns:
Trueif the observation was accepted, otherwiseFalse.- Return type:
bool
- class mpylab.env.ui.qt_adapter.MeasurementControlWidget(*args: Any, **kwargs: Any)¶
Display measurement messages, prompts, EUT state, and stop controls.
- Parameters:
adapter (QtUIAdapter) – Adapter receiving all user actions from the widget.
parent (QWidget or None, optional) – Parent widget.
- append_log(text: str) None¶
Append one log message to the output pane.
- clear_prompt() None¶
Clear prompt text and dynamic buttons.
- show_prompt(msg: str, buttons: list[str], level: str = '', data: object = None) None¶
Show a prompt and create one button per answer.
- class mpylab.env.qt_runner.MeasurementTask(*args: Any, **kwargs: Any)¶
Run a measurement script in a Qt worker thread.
- Parameters:
measurement_module (module) – Module providing a
run(config)function.config (dict) – Measurement configuration passed to the module.
- failed¶
alias of
object
- finished¶
alias of
int
- run()¶
Execute the configured measurement.
- mpylab.env.qt_runner.attach_ui_adapter(config, ui_adapter)¶
Attach a Qt UI adapter and remove non-interactive callbacks.
- Parameters:
config (dict) – Measurement configuration modified in place.
ui_adapter (QtUIAdapter) – Adapter and optional manual EUT monitor to attach.
- mpylab.env.qt_runner.run_qt_script(script_path, argv=None, module_name=None, window_title=None)¶
Start a Qt UI and run a measurement script in a worker thread.
- Parameters:
script_path (path-like) – Path to the measurement script.
argv (sequence of str or None, optional) – Configuration arguments.
Noneuses command-line arguments.module_name (str or None, optional) – Import name assigned to the loaded script module.
window_title (str or None, optional) – Title overriding the adapter widget’s default title.
- Returns:
Qt application exit code, or
2for an invalid configuration.- Return type:
int
Emission sweep review¶
The workflow receives detached decisions and owns validation and persistence. Adapters may display/edit snapshots but do not commit measurement history. See TEM emission data for terminal operation and PNG output.
- class mpylab.env.ui.sweep_review.SweepReviewAdapter(*args, **kwargs)¶
Interface for Qt, terminal or application-specific sweep review.
- prepare(tem)¶
Check availability before acquisition.
- Parameters:
tem (TEMCell) – Measurement environment providing UI hooks and output paths.
- review(tem, description, record)¶
Return an explicit decision from a detached sweep snapshot.
- Parameters:
tem (TEMCell) – Environment providing pre/post user-event hooks.
description (str) – Measurement description.
record (dict) – Detached snapshot; changes do not modify retained measurement data.
- Returns:
Operator decision and edited metadata.
- Return type:
- Raises:
UserWarning – Save and exit without evaluation was requested.
- select(tem, raw, triplets)¶
Propose explicitly selected evaluations without changing history.
- Parameters:
tem (TEMCell) – Environment providing user-event hooks.
raw (dict) – Detached retained-sweep data.
triplets (sequence of sequence) – Existing canonical orientation groups.
- Returns:
Proposed evaluations. Empty means no new evaluation.
- Return type:
list of SweepEvaluationSelection
- class mpylab.env.ui.sweep_review.SweepReviewDecision(action: str, variant: str, notes: str)¶
Operator decision without a reference to measurement or GUI objects.
- action¶
repeat,continueorstop(finish and select evaluations).- Type:
str
- variant¶
EUT variant as measured.
- Type:
str
- notes¶
Notes attached to this sweep.
- Type:
str
- class mpylab.env.ui.sweep_review.SweepEvaluationSelection(name: str, sweeps: dict, created_at_utc: str | None = None)¶
Proposed evaluation; the workflow validates and stores it.
- name¶
Non-empty, unused evaluation name.
- Type:
str
- sweeps¶
One retained sweep ID per orientation.
- Type:
dict
- created_at_utc¶
ISO UTC timestamp when this set was added. None keeps compatibility with adapters that supply only name and sweeps; the workflow then records its commit time.
- Type:
str or None, optional
- class mpylab.env.ui.emission_review_tui.TerminalSweepReviewAdapter(output_dir=None, *, input_fn=None, output_fn=None)¶
Review sweeps without Qt and keep their plots as PNG files.
- Parameters:
output_dir (path-like or None, optional) – Image directory; None derives it from the measurement autosave path.
input_fn (callable or None, optional) – Prompt callback returning text. None uses input from an interactive stdin. Explicit callbacks support application integration and tests.
output_fn (callable or None, optional) – Text output callback. None uses print.
- prepare(tem)¶
Check terminal input and image-directory access before acquisition.
- Parameters:
tem (TEMCell) – Measurement environment providing an optional autosave path.
- Raises:
RuntimeError – No interactive stdin or explicit input callback is available, or normal stdin review was requested from a worker thread.
OSError – Images cannot be written to the configured directory.
- review(tem, description, record)¶
Save the plot and ask for metadata and an explicit sweep decision.
- Parameters:
tem (TEMCell) – Measurement environment providing user-event hooks.
description (str) – Measurement description.
record (dict) – Detached retained-sweep snapshot.
- Returns:
Repeat, continue or finish-acquisition decision and metadata.
- Return type:
- Raises:
UserWarning – Save/exit, EOF, Ctrl-C or interruption was requested.
OSError – The PNG cannot be written.
- select(tem, raw, triplets)¶
Select complete orientation sets from the retained-sweep inventory.
- Parameters:
tem (TEMCell) – Measurement environment providing user-event hooks.
raw (dict) – Detached retained-sweep data.
triplets (sequence of sequence) – Canonical orthogonal orientation groups.
- Returns:
Explicit selections. Save/exit, EOF or Ctrl-C discards all newly staged selections and returns an empty list.
- Return type:
list of SweepEvaluationSelection
- class mpylab.env.ui.emission_review.QtSweepReviewAdapter¶
Adapt the existing Qt dialogs to detached sweep-review decisions.
- prepare(tem)¶
Validate Qt availability before acquisition.
- Parameters:
tem (TEMCell) – Measurement environment.
- review(tem, description, record)¶
Return the existing dialog’s decision and edited metadata.
- Parameters:
tem (TEMCell) – Measurement environment and GUI-thread dispatcher.
description (str) – Measurement description.
record (dict) – Detached sweep snapshot.
- Returns:
Explicit decision and metadata.
- Return type:
- Raises:
UserWarning – The GUI requested save and exit without evaluation.
- select(tem, raw, triplets)¶
Translate the existing selection dialog’s detached result.
- Parameters:
tem (TEMCell) – Measurement environment and GUI-thread dispatcher.
raw (dict) – Detached retained-sweep data.
triplets (sequence of sequence) – Canonical orientation groups.
- Returns:
Explicitly added evaluations.
- Return type:
list of SweepEvaluationSelection
- mpylab.env.ui.emission_review.resolve_sweep_review(tem, backend='auto', output_dir=None)¶
Prepare an explicit adapter, Qt, or a terminal fallback.
- Parameters:
tem (TEMCell) – Measurement environment.
backend (str or SweepReviewAdapter, optional) –
autoprefers available Qt with a display/GUI dispatcher, otherwise terminal review.qtandterminalchoose explicitly. An adapter object may implementprepare,reviewandselectdirectly.output_dir (path-like or None, optional) – Terminal image directory. None derives a directory from the autosave path, falling back to
tem-emission-reviewin the working directory.
- Returns:
Prepared adapter, kept local to the calling workflow.
- Return type:
- Raises:
ValueError – Unknown backend or incomplete adapter contract.
RuntimeError – No usable interactive display or terminal is available.
OSError – Terminal images cannot be written.
Long receiver scans¶
- class mpylab.device.receiver_scan_worker.ReceiverScanWorker(receiver, scan_kwargs=None, on_point=None, on_done=None, on_error=None, on_cancel=None, safety_stop=None)¶
Run a receiver
RunScancall in a background thread.Callbacks are executed from the worker thread. GUI frontends should bridge them into the UI thread, for example with Qt signals or a thread-safe queue.
- is_running()¶
Return whether the scan thread is currently active.
- join(timeout=None)¶
Wait for the worker thread and return whether it has finished.
- request_stop()¶
Request cancellation and call the optional safety stop callback.
- start()¶
Start the receiver scan in a daemon thread and return
self.
- wait_finished(timeout=None)¶
Wait for the worker completion event.
Device test UI lifecycle and workers¶
- class mpylab.device.ui_task_executor.DeviceTaskExecutor(*args: Any, **kwargs: Any)¶
Run submitted device callables serially on one persistent QThread.
- Parameters:
parent (PySide6.QtCore.QObject, optional) – Qt owner that controls the executor’s lifetime.
- completed¶
alias of
object
- shutdown(timeout_ms=3000)¶
Stop the worker event loop and wait for its thread to finish.
- Parameters:
timeout_ms (int, optional) – Maximum wait time in milliseconds.
- Returns:
Truewhen the worker thread stopped within the timeout.- Return type:
bool
- submit(func)¶
Queue one callable for execution.
- Parameters:
func (callable) – Zero-argument callable to run in the persistent worker thread.
- Return type:
None
- Raises:
RuntimeError – If the worker thread has already stopped.
- mpylab.device.ui_task_executor.ensure_task_executor(owner, completed_slot, idle_slot)¶
Return an owner’s executor, creating and connecting it once.
- Parameters:
owner (PySide6.QtCore.QObject) – UI object that owns the executor.
completed_slot (callable) – Slot receiving
(result, error)for each task.idle_slot (callable) – Slot called after result delivery.
- Returns:
Existing or newly created executor for
owner.- Return type:
- mpylab.device.ui_task_executor.shutdown_task_executor(owner)¶
Stop an owner’s executor if it has been created.
- Parameters:
owner (PySide6.QtCore.QObject) – UI object whose executor should stop.
- Returns:
Trueif no executor exists or its thread stopped in time.- Return type:
bool
- mpylab.device.ui_driver_lifecycle.result_error_code(result)¶
Return an integer driver error code when result contains one.
- Parameters:
result (object) – Value returned by a driver call. May be an integer, an integer-like sequence such as
(error_code, ...)or[error_code, ...], or any other object for which no error code can be extracted.- Returns:
The extracted driver error code, or
0when result does not contain an integer error code.- Return type:
int
- mpylab.device.ui_driver_lifecycle.require_driver_success(result, operation, allowed_error_codes=())¶
Return result or raise when it contains a driver error code.
- Parameters:
result (object) – Value returned by a driver call, interpreted by
result_error_code().operation (str) – Human-readable name of the operation being performed. Used in the error message of the raised exception.
allowed_error_codes (iterable of int, optional) – Error codes that are considered non-fatal and therefore do not trigger an exception. Defaults to the empty tuple, i.e. any non-zero error code raises.
- Returns:
The unmodified result passed in, when it contains no unexpected driver error code.
- Return type:
object
- Raises:
RuntimeError – If result contains an error code that is neither
0nor listed in allowed_error_codes.
- mpylab.device.ui_driver_lifecycle.shutdown_driver_instances(drivers, *, safety_calls=(), cleanup_methods=('Quit', 'close'))¶
Safely stop and close each unique driver instance.
All instances are attempted even if an earlier call fails. A combined
RuntimeErroris raised afterwards so callers do not silently discard a device whose safe shutdown could not be confirmed.- Parameters:
drivers (iterable) – Driver instances to shut down.
Noneentries and duplicate instances (compared by identity) are skipped.safety_calls (sequence of (str, tuple), keyword-only, optional) –
(method_name, args)pairs describing safety-relevant calls to attempt on each driver before cleanup. A driver method is skipped when it does not exist.cleanup_methods (sequence of str, keyword-only, optional) – Names of cleanup methods to call on each driver, tried in order until one succeeds. Defaults to
("Quit", "close").
- Returns:
One entry per successful call:
(driver, method_name, result).- Return type:
tuple of (object, str, object)
- Raises:
RuntimeError – If any safety or cleanup call raises or returns a non-zero error code. The message combines all failures encountered.
See UI adapters and worker interface for threading, stop, RF-off, and EUT monitoring guidance.
Application identity and branding¶
- class mpylab.gui.ApplicationIdentity(name: str, version: str, description: str, resource_package: str, resource_directory: tuple[str, ...], documentation_url: str, project_url: str, author: str = 'Hans Georg Krauthäuser', license_name: str = 'GPL-3.0-or-later', tagline: str = '')¶
Application-specific content for the optional Qt branding helpers.
- Parameters:
name (str) – Application/menu name.
version (str) – Installed application version.
description (str) – Short user-facing description.
resource_package (str) – Importable package containing the artwork.
resource_directory (tuple of str) – Relative resource-directory components in that package.
documentation_url (str) – Link to maintained user documentation.
project_url (str) – Link to the source project.
author (str) – Copyright attribution.
license_name (str) – Software/artwork license description.
tagline (str) – Accessible artwork description; optional About subtitle.
Notes
The resource directory must provide icon.png, logo.svg and logo-inverse.svg. Keep source attribution and artwork licensing beside those assets.
- mpylab.gui.qt.create_application(argv, identity=ApplicationIdentity(name='MPyLab', version='1.0.33', description='Graph-based laboratory measurements and device test tools.', resource_package='mpylab.gui', resource_directory=('resources', 'branding'), documentation_url='https://mpylab-75fcff.gp.hrz.tu-chemnitz.de/', project_url='https://gitlab.hrz.tu-chemnitz.de/chair-of-electromagnetic-theory-and-compatibility-at-tu-dresden/mpylab/mpylab', author='Hans Georg Krauthäuser', license_name='GPL-3.0-or-later', tagline='Graph-Based Lab Measurements'))¶
Create or reuse QApplication with identity established before Cocoa starts.
- Parameters:
argv (sequence of str) – Qt command-line arguments including the executable name.
identity (ApplicationIdentity, optional) – Application and artwork metadata; defaults to MPyLab.
- Returns:
Existing application or a newly initialized one.
- Return type:
QApplication
Notes
Existing host applications retain their identity and dialog preferences. On macOS a new application uses Qt dialogs to avoid the native NSAlert rendering crash observed with Qt 6.11.2 on the development Mac. Native menus remain enabled. No interpreter or system files are modified.
- mpylab.gui.qt.install_branding(window, identity=ApplicationIdentity(name='MPyLab', version='1.0.33', description='Graph-based laboratory measurements and device test tools.', resource_package='mpylab.gui', resource_directory=('resources', 'branding'), documentation_url='https://mpylab-75fcff.gp.hrz.tu-chemnitz.de/', project_url='https://gitlab.hrz.tu-chemnitz.de/chair-of-electromagnetic-theory-and-compatibility-at-tu-dresden/mpylab/mpylab', author='Hans Georg Krauthäuser', license_name='GPL-3.0-or-later', tagline='Graph-Based Lab Measurements'), *, menu_bar=None, about_action=None, quit_action=None)¶
Add project identity, About and Quit without replacing a close handler.
- Parameters:
window (QWidget) – Tool window with an existing layout, or QMainWindow.
identity (ApplicationIdentity, optional) – Application and artwork metadata; defaults to MPyLab.
menu_bar (QMenuBar, optional) – Existing menu bar. Otherwise use or create the window’s menu bar.
about_action (QAction, optional) – Existing About action with no connected About callback.
quit_action (QAction, optional) – Existing Quit action already connected to the window’s close handler.
- Returns:
Window-owned controller exposing about_action, quit_action and dialog. Repeated installation returns the same controller without adding menus.
- Return type:
QObject
- Raises:
ValueError – A plain QWidget has no layout yet or an artwork resource is invalid.
FileNotFoundError – The application did not package its artwork.
Notes
New Quit actions call window.close(), never QApplication.quit(). This keeps existing RF-off, worker shutdown, confirmation and autosave paths intact.
- mpylab.gui.qt.application_icon(identity=ApplicationIdentity(name='MPyLab', version='1.0.33', description='Graph-based laboratory measurements and device test tools.', resource_package='mpylab.gui', resource_directory=('resources', 'branding'), documentation_url='https://mpylab-75fcff.gp.hrz.tu-chemnitz.de/', project_url='https://gitlab.hrz.tu-chemnitz.de/chair-of-electromagnetic-theory-and-compatibility-at-tu-dresden/mpylab/mpylab', author='Hans Georg Krauthäuser', license_name='GPL-3.0-or-later', tagline='Graph-Based Lab Measurements'))¶
Load an icon from installed package resources.
- Parameters:
identity (ApplicationIdentity, optional) – Application and artwork metadata; defaults to MPyLab.
- Returns:
Application icon with a neutral background.
- Return type:
QIcon
- Raises:
FileNotFoundError – The application did not package the requested artwork.
ValueError – Packaged icon data cannot be decoded.
- class mpylab.gui.qt.AboutDialog(*args: Any, **kwargs: Any)¶
Reusable, nonmodal application information with palette-aware artwork.
- Parameters:
identity (ApplicationIdentity) – Application and artwork metadata.
parent (QWidget, optional) – Owning tool window.
tool_name (str, optional) – Additional tool name inside the dialog for a shared application identity.
See GUI identity and application menus for resources, native macOS behavior and consumer adoption order.