我已经构建了一个运行时间很长的脚本,我已经使用以下代码添加了一个进度条:
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进度条的例子。
提前谢谢。
答案 0 :(得分:2)
这是一个工作样本。
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 3.0中命名为iup.progressbar
,在早期版本中命名为iup.gauge
。在早期版本中,它也可能在扩展控件库中。
我在Windows上测试了这个。一个人认为它在其他平台上有类似的行为,但你的里程可能会有所不同。