如何使用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清除它。

只要进度条没有失去焦点,它就可以正常工作,但是如果焦点丢失,程序会崩溃,所以我确信我在做错了什么。有没有人可以告诉我正确的方法。Google没有找到任何关于iup、lua进度条的例子。

预先感谢您的回答。

原文链接 https://stackoverflow.com/questions/3641616

点赞
stackoverflow用户68204
stackoverflow用户68204

下面是一个可用的示例。

require "iuplua"

local cancelflag
local gaugeProgress

local function StartProgressBar()
    cancelbutton = iup.button {
        title = "取消",
        action=function()
            cancelflag = true
            return iup.CLOSE
        end
    }
    gaugeProgress = iup.progressbar{ expand="HORIZONTAL" }
    dlgProgress = iup.dialog{
        title = "正在进行的注释替换",
        dialogframe = "YES", border = "YES",
        iup.vbox {
            gaugeProgress,
            cancelbutton,
    }
    }
    dlgProgress.size = "QUARTERxEIGHTH"
    dlgProgress.menubox = "NO"  --  移除Windows的关闭按钮和菜单。
    dlgProgress.close_cb = cancelbutton.action
    dlgProgress:showxy(iup.CENTER, iup.CENTER)  --  显示进度条
    return dlgProgress
end

dlg = StartProgressBar()
gaugeProgress.value = 0.0

for i=0,10000 do
    -- 在长时间计算中前进一步
    -- 以某种有意义的方式更新进度
    gaugeProgress.value = i / 10000
    -- 允许对话框处理任何消息
    iup.LoopStep()
    --注意用户希望取消并进行有意义的操作
    if cancelflag then break end
end

--通过检查标志来区分已取消和已完成
print("已取消:",cancelflag)

我使用了IUP 3.0及其标准的Lua绑定。IUP 3.0中的进度条控件名为iup.progressbar,而早期版本中的名称为iup.gauge。在早期版本中,它也可能在扩展控件库中。

我已在Windows上进行了测试。人们认为它在其他平台上的行为类似,但具体情况可能有所不同。

2010-09-04 22:30:10