0

3 つのボタンとテキスト ボックスで図を作成するコードを作成しました。ただし、ボタンを押すと、プログラムはコールバック関数について不平を言います。

function game(states)

fig=figure('position',[200 150 500 370]);
face.B1=uicontrol('parent',fig,'style','pushbutton','string','start!','visible','on','position',[20 160 460 50]);
face.B2=uicontrol('style','pushbutton','parent',fig,'string','B2','visible','off','position',[20 90 460 50]);
face.B3=uicontrol('style','pushbutton','parent',fig,'string','B3','visible','off','position',[20 20 460 50]);
face.txtbx=uicontrol('style','text','parent',fig,'string','welcome to my game. press start to begin','position',[20 230 460 120]);

%set the callback function of the button
%when the button is pressed, i want to initiate the changestate function

set(face.B1,'callback','changestate(face,states,1);');

% while 1
    uiwait(fig)
% end

end

これは、ボタンが押されたときに呼び出したい関数です。この関数の内容は私の質問にとって重要ではありませんが、念のため含めます

function face = changestate(face,states,nextstate)

disp('enter changestate')
    face.B1=set(face.B1,'string',states{nextstate}.B1str,'callback','changestate(face,states,states{nextstate}.B1next)');

if ~isnan(states(nextstate).B2str)
    face.B2=set(face.B2,'string',states{nextstate}.B2str,'callback','changestate(face,states,states{nextstate}.B2next)','visible','on');
else face.B2=set(face.B2,'visible','off');
end

if ~isnan(states(nextstate).B3str)
    face.B3=set(face.B3,'string',states{nextstate}.B3str,'callback','changestate(face,states,states{nextstate}.B3next)','visible','on');
else face.B3=set(face.B3,'visible','off');
end

face.txtbx=set(face.txtbx,'string',states{nextstate}.txtbxstr);
%     uiresume(fig)
end

私が受け取っているエラーは次のとおりです。

waitfor 未定義の関数または変数 'face' の使用中にエラーが発生しました。

waitfor 使用エラー uicontrol コールバックの評価中にエラーが発生しました

このエラーは、ボタン B1 を押したときに発生します。ボタンで changestate 関数を開始したい。誰かが私にこのエラーが発生する理由を説明できますか?

4

1 に答える 1

1

コールバックに文字列宣言を使用すると、ワークスペース コールバック スコープで評価されます。現在のスコープで変数を使用して関数を評価する場合は、次のいずれかを使用する必要があります。

…,'callback',@(~,~) changestate(face,states,states{nextstate}.B1next),...
…,'callback',@(hObj,evt) changestate(hObj,evt,face,states,states{nextstate}.B1next),...
…,'callback',{@changestate,face,states,states{nextstate}.B1next),...

それ以外の:

...,'callback','changestate(face,states,states{nextstate}.B1next),...

2 番目と 3 番目のコールバックでは、関数はさらに 2 つの引数 (ボタン ハンドル ( hObj) とイベント データ ( evt)) を取得できるはずですが、これらはおそらく空です。

その理由は次のとおりです

MATLAB が関数ハンドルを評価するとき、関数ハンドルが作成されたときと同じ変数がスコープ内にあります。(対照的に、文字列として指定されたコールバックは、ベース ワークスペースで評価されます。)これにより、オブジェクト ハンドルなどのグローバル データを GUI で管理するプロセスが簡素化されます。

一方、文字列を使用する場合:

コールバック プロパティを文字列に設定すると、MATLABは、コールバックが呼び出されたときにベース ワークスペースでその文字列を評価します。

を使用するuiwaitと、実行が内部で停止しuiwait (line 82)(私の matlab バージョンの場合)、waitforコマンドがあり、次のエラーが発生します。

Error using waitfor
Undefined function or variable 'face'.

を使用しない場合uiwait、グローバル ワークスペースで文字列コールバックが評価され、エラーは次のようになります。

>> Undefined function or variable 'face'.

Error while evaluating uicontrol Callback

この議論もあなたの興味を引くかもしれません。

于 2013-09-17T02:58:54.157 に答える