Photoshop脚本 - 在窗口中更新进度条

时间:2012-06-26 15:58:11

标签: javascript photoshop flash-cs5

我想为我的一个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处理程序,然后立即关闭窗口,但窗口不显示。

关于如何让进度条工作的任何想法?

3 个答案:

答案 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/