6

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

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

4

3 回答 3

6

窗口类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 的速度不会足够快,无法看到进度条在移动。这就是我卡住的地方:/

于 2012-08-22T12:25:40.597 回答
2

我曾经运行过 WaitForRedraw 片段,也许它会使 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)
}
于 2013-01-11T02:01:08.783 回答
1

您可能需要考虑使用 app.refresh() 或 waitForRedraw()。有一个window.update(),但它似乎没有为我解决这个问题。

这是来源:http ://www.davidebarranca.com/2012/10/scriptui-window-in-photoshop-palette-vs-dialog/

于 2015-07-31T08:31:53.180 回答