我想为我的一个Photoshop脚本显示进度条。如果我在按钮点击事件中工作,那么我可以毫无问题地更新进度条。
对于此脚本,不需要用户交互。我想要: - 显示窗口 - 工作完成后更新进度条 - 关闭窗口
var win = new Window("dialog{text:'Progress',bounds:[100,100,400,150],\ bar:Progressbar{bounds:[20,20,280,31] , value:0,maxvalue:100}};");
win.show();
for(...){
//do work here
//update progress
win.bar.value = ...;
}
win.close();
问题是,win.show();
阻塞,直到用户关闭窗口。我还试图添加一个onClose
处理程序,然后立即关闭窗口,但窗口不显示。
关于如何让进度条工作的任何想法?
答案 0 :(得分:5)
窗口类dialog
是一个MODAL对话框,需要您在执行继续之前将其关闭。
使用班级window
创建非阻止窗口:
var win = new Window("window{text:'Progress',bounds:[100,100,400,150],bar:Progressbar{bounds:[20,20,280,31] , value:0,maxvalue:100}};");
win.show();
for(...){
//do work here
//update progress
win.bar.value = ...;
}
win.close();
但是,你会遇到下一个问题。根据您在循环中的操作,photoshop不会足够快地更新UI以查看进度条的移动。这就是我被卡住的地方:/
答案 1 :(得分:0)
我已经遇到过一次WaitFor Redraw片段,也许它会让ps重绘UI? 没有时间检查它,只是一个想法。
function WaitForRedraw(){
var eventWait = charIDToTypeID("Wait")
var enumRedrawComplete = charIDToTypeID("RdCm")
var typeState = charIDToTypeID("Stte")
var keyState = charIDToTypeID("Stte")
var desc = new ActionDescriptor()
desc.putEnumerated(keyState, typeState, enumRedrawComplete)
executeAction(eventWait, desc, DialogModes.NO)
}
答案 2 :(得分:0)
您可能需要考虑使用app.refresh()或waitForRedraw()。有一个window.update(),但它似乎没有为我解决这个问题。
以下是来源:http://www.davidebarranca.com/2012/10/scriptui-window-in-photoshop-palette-vs-dialog/