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

7
我希望为我的一款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个回答

8

窗口类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
每次增加进度条时,请使用win.update()强制更新用户界面。 - Nick Brunt
你确定这个也适用于慢系统吗?我认为它在技术上并不会强制Windows立即更新,而只是使窗口失效,然后Windows操作系统将在有时间的时候重新绘制(低优先级)。在慢速系统上,这将在循环结束后完成... - Max Kielland

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)
}

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接