Как отобразить индикатор выполнения с помощью Lua и IUP

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

function StartProgressBar()
   gaugeProgress = iup.gaugeProgress{}
   gaugeProgress.show_text = "YES"
   gaugeProgress.expand = "HORIZONTAL"
   dlgProgress = iup.dialog{gaugeProgress; title = "Note Replacement in Progress"}
   dlgProgress.size = "QUARTERxEIGHTH"
   dlgProgress.menubox = "NO"  --  Remove Windows close button and menu.
   dlgProgress:showxy(iup.CENTER, iup.CENTER)  --  Put up Progress Display 
   return dlgProgress
end

Это вызывается перед циклом, и индикатор выполнения обновляется во время цикла (я не вызываю MainLoop). В конце процесса я вызываю dlgProgress.destroy, чтобы очистить его.

Пока я не переключаю фокус с индикатора выполнения, он работает нормально, но если фокус теряется, программа вылетает, поэтому я уверен, что делаю это неправильно. Может ли кто-нибудь сказать мне правильный путь. Подробный гугл не нашел мне примеров для iup, lua progress bar.

Заранее спасибо.


person Jane T    schedule 04.09.2010    source источник


Ответы (1)


Вот рабочий образец.

require "iuplua"

local cancelflag
local gaugeProgress

local function StartProgressBar()
    cancelbutton = iup.button {
        title = "Cancel",
        action=function()
            cancelflag = true
            return iup.CLOSE
        end
    }
    gaugeProgress = iup.progressbar{ expand="HORIZONTAL" }
    dlgProgress = iup.dialog{
        title = "Note Replacement in Progress",
        dialogframe = "YES", border = "YES",
        iup.vbox {
            gaugeProgress,
            cancelbutton,
    }
    }
    dlgProgress.size = "QUARTERxEIGHTH"
    dlgProgress.menubox = "NO"  --  Remove Windows close button and menu.
    dlgProgress.close_cb = cancelbutton.action
    dlgProgress:showxy(iup.CENTER, iup.CENTER)  --  Put up Progress Display
    return dlgProgress
end


dlg = StartProgressBar()
gaugeProgress.value = 0.0

for i=0,10000 do
    -- take one step in a long calculation
    -- update progress in some meaningful way
    gaugeProgress.value = i / 10000
    -- allow the dialog to process any messages
    iup.LoopStep()
    -- notice the user wanting to cancel and do something meaningful
    if cancelflag then break end
end

-- distinguish canceled from finished by inspecting the flag
print("cancled:",cancelflag)

Я использовал IUP 3.0 и его стандартную привязку Lua. Элемент управления датчиком называется iup.progressbar в IUP 3.0 и iup.gauge в более ранних версиях. В более ранних версиях он также мог быть в расширенной библиотеке элементов управления.

Я тестировал это на Windows. Предполагается, что он ведет себя аналогично на других платформах, но ваш пробег может отличаться.

person RBerteig    schedule 04.09.2010
comment
Большое спасибо за ответ, как раз то, что мне было нужно. Я сейчас включу его в свой скрипт и посмотрю, как оно пойдет. - person Jane T; 06.09.2010