我想显示我的一个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
处理程序,然后立即关闭窗口,但窗口永远不会显示。
关于如何获得进度条的任何想法?
窗口类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以查看进度条的移动。这是我卡住的地方:/
我已经在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)
}
您可能要考虑使用app.refresh()或waitForRedraw()。有一个window.update(),但是它似乎并没有为我解决这个问题。
这里是来源:http://www.davidebarranca.com/2012/10/scriptui-window-in-photoshop-palette-vs-dialog/