Исходный код EJIO.ctk_extender.widget.form.fields.radio

## /ctk_extender/widget/form/fields/radio.py

import customtkinter as ctk
from typing import Any
from ...base import Widget
from ...geometry import GeometryStrategy
from .base import InputField

__all__ = [
    'FormRadioButtonGroup',
]


[документация] class FormRadioButtonGroup(Widget, InputField): """Группа радио-кнопок для выбора одного значения из нескольких опций.""" def __init__( self, parent: Any, name: str, options: list[str], geometry: GeometryStrategy | None = None ) -> None: self._name: str = name self._options: list[str] = options # Создаем внутреннюю переменную Tkinter для отслеживания группы кнопок self._var: ctk.StringVar = ctk.StringVar(value=options[0] if options else "") self._buttons: list[ctk.CTkRadioButton] = [] super().__init__(parent, geometry)
[документация] def build(self) -> ctk.CTkFrame: """ Собирает невидимый фрейм-контейнер, внутри которого автоматически упаковывает радио-кнопки по вертикали. """ frame = ctk.CTkFrame(self.parent, fg_color="transparent") for option in self._options: rb = ctk.CTkRadioButton(frame, text=option, variable=self._var, value=option) rb.pack(anchor="w", pady=5) self._buttons.append(rb) return frame
@property def name(self) -> str: return self._name
[документация] def get_value(self) -> str: return str(self._var.get())
[документация] def set_value(self, value: Any) -> None: self._var.set(str(value))
[документация] def clear(self) -> None: if self._options: self._var.set(self._options[0])
[документация] def destroy(self) -> None: self._buttons.clear() del self._var super().destroy()