Как отобразить индикатор выполнения, используя Lua и IUP - PullRequest
3 голосов
/ 04 сентября 2010

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

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 bars.

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

1 Ответ

2 голосов
/ 05 сентября 2010

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

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. Можно предположить, что на других платформах он работает аналогично, но пробег может отличаться.

...