Почему я не могу использовать get_children_by_id() для этого виджета

Я хочу получить доступ к внутренним виджетам, но выдает ошибку, что я не могу индексировать нулевое значение.

Мой виджет:

local previewWidget = wibox()

previewWidget:setup {
    widget = wibox.widget {
        {
            widget = wibox.widget {
                {
                    widget = awful.widget.clienticon,
                    client = "", 
                    id = "clientIcon"
                },
                {
                    widget = wibox.widget.textbox,
                    id = "titleText"
                },
                nil
            },
            layout = wibox.layout.align.horizontal,
            id = "titleBox"
        },
        {
            widget = wibox.widget.imagebox,
            id = "clientImage"
        },
        nil
    },  
    id = "previewBox",
    layout = wibox.layout.align.vertical,
    border_width = 10, 
    border_color = "FF0000",
}

Эта команда не дает ошибки:

local previewBox = previewWidget:get_children_by_id("previewBox")[1]

Но это делает:

local titleBox = previewWidget:get_children_by_id("titleBox")[1]
local clientIcon = previewWidget:get_children_by_id("clientIcon")[1]

Что я здесь делаю неправильно?

Что произойдет, если вы опустите внутренний вызов wibox.widget? В частности, замените widget = wibox.widget { только на {.

Uli Schlachter 23.04.2022 22:21

На самом деле, я думаю, вам следует избавиться от всех обращений к wibox.widget. :setup уже делает это за вас и запуская эту «магию» несколько раз, создает несколько «вселенных», где идентификаторы могут быть разрешены, а внутренние не знают о внешних и наоборот.

Uli Schlachter 23.04.2022 22:22
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
2
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
local previewWidget = wibox.widget {
    {
        {
            widget = awful.widget.clienticon,
            client = "",
            id = "clientIcon"
        },
        {
            widget = wibox.widget.textbox,
            id = "titleText"
        },
        nil,

        layout = wibox.layout.align.horizontal,
        id = "titleBox"
    },
    {
        widget = wibox.widget.imagebox,
        id = "clientImage"
    },
    nil,

    layout = wibox.layout.align.vertical,
    id = "previewBox",
}

Мои ошибки:

Виджет с wibox.widget лучше объявить в самом начале.

Я неправильно использовал раскладку:
Все 3 виджета должны быть там, где вызывается макет

local some_widget = wibox.widget {
   { widget nr.1 },
   { widget nr.2 },
   { widget nr.3 },
   layout = wibox.layout.align.vertical
}

P.S. достаточно объявить макет без виджета

Другие вопросы по теме