Графические виджеты
Уроки Открыть IDE
На главную
Виджеты • Урок 16

Типичные ошибки при работе с виджетами

Как не попасть в ловушки и понять сообщения компилятора

Забыли win.add_child()

Самый частый промах — создать виджет, но не добавить его в окно или контейнер. Виджет существует, но его не видно.

Код компилируется, окно появляется, но кнопки нет. Она создана, но не добавлена в окно.

Исправление: всегда добавляйте виджеты в окно или контейнер через win.add_child(виджет) или frame.add_child(виджет).

Неправильный порядок добавления — перекрытие

Виджеты отрисовываются в порядке вызова add_child(). Первый добавленный — снизу, последний — сверху.

Кнопка перекрывает лейбл, потому что добавлена позже. Текст лейбла частично нечитаем.

Исправление: планируйте порядок добавления или используйте координаты, чтобы виджеты не пересекались.

Неверный тип в sender

При использовании параметра sender тип должен точно соответствовать типу виджета, который вызывает событие.

main.idyl:8: error: parameter type 'gui.Label' does not match event type 'gui.Button'

Исправление: всегда указывайте правильный тип виджета в параметре sender.

Присваивание числа свойству text у Label или Button

Свойство text у лейблов и кнопок ожидает строку (string). Число нужно преобразовывать через to_string().

main.idyl:6: error: cannot assign 'int' to 'string' property 'text'

Исправление: label.text = to_string(42);

Обращение к виджету до его создания

Переменная виджета должна быть объявлена до того, как вы пытаетесь её использовать в обработчике.

main.idyl:6: error: 'btn' was not declared in this scope

Исправление: объявляйте виджет до его использования в обработчиках.

Timer: забыли вызвать start()

Таймер не запускается автоматически после создания. Нужно явно вызвать start().

Код компилируется, таймер создан, но функция не вызывается. Текст на лейбле не меняется.

Исправление: не забывайте вызывать timer.start().

Modal: попытка добавить через add_child()

Модальные окна не являются виджетами в привычном смысле. Их не нужно добавлять в окно через add_child().

main.idyl:6: error: cannot add 'gui.Modal' to window (Modal is not a widget)

Исправление: модальные окна создаются и показываются динамически, без add_child().

Выход за границы массива виджетов

При работе с массивами виджетов легко выйти за пределы, если индекс больше length() - 1.

runtime error: array index 5 out of bounds (size 3, valid indices 0-2)

Исправление: всегда проверяйте, что индекс в пределах 0 .. length()-1.

Свойства, которых нет у виджета

У каждого виджета свой набор свойств. Не все виджеты имеют placeholder или font_size.

main.idyl:6: error: 'gui.Button' has no property 'placeholder'
main.idyl:7: error: 'gui.Button' has no property 'font_size'

Исправление: сверяйтесь со спецификацией виджета. У кнопки есть text, enabled, on_click, но нет placeholder или font_size.

Как читать сообщения об ошибках

Сообщения компилятора для GUI-виджетов такие же, как для консольного кода:

  • file.idyl:строка: error: ... — ошибка компиляции
  • file.idyl:строка: runtime error: ... — ошибка выполнения
💡 Совет: Начинайте исправлять ошибки с первой — часто исправление одной ошибки убирает несколько последующих. Если виджет не отображается — проверьте, добавили ли вы его через add_child().