6

Photoshopスクリプトの1つのプログレスバーを表示したいと思います。ボタンクリックイベント内で作業する場合、問題なくプログレスバーを更新できます。

このスクリプトでは、ユーザーの操作は必要ありません。私がしたいこと:-ウィンドウを表示する-作業が完了したらプログレスバーを更新する-ウィンドウを閉じる

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 に答える