From Prolog PCE で値を設定するのは簡単で、send/3またはsend/4を使用します。したがって、これを回避する 1 つの方法は、Prolog 述語で、PCE オブジェクトに値を設定するメソッドを呼び出すことです。
オブジェクトには他のオブジェクトを含めることができ、スコープ内にクラス変数とインスタンス変数を含めることができます。Prolog コードで必要なのは、オブジェクトへの参照だけです。オブジェクト参照を使用して述語を呼び出すことにより、述語は適切なメソッドを呼び出して値を伝達できます。
ダイアログクラスに基づいてオブジェクトを作成するコードを次に示します。オブジェクトのボタンが押されると、渡されたものに基づいて値を作成する述語 (この質問のものと同様) が呼び出され、その値がdialogのインスタンス変数に設定されます。また、値をtext_itemコントロールに入れます。
このプログラム ソースはtextfield.plであり、次のコマンドで実行できます。
swipl -s textfield.pl -g run
デフォルトのテキスト:

ユーザー入力

プッシュボタンによって呼び出された述語から GUI に送信されたメッセージを介して、プログラムによって更新されたテキスト:

デモクラス:
:- use_module(library(pce)).
:- pce_begin_class(demo, dialog).
/* Instance variables*
name, type, access, description */
variable(result, name*, get, "Result from Prolog Callback").
initialise(Demo) :->
"Create something that get/4 and send/3 can work with."::
send(Demo, send_super, initialise, 'Demo'),
send(Demo, append, new(InputText, text_item(input, 'Demo Text'))),
send(Demo, append,
button(execute_command,
and(message(@prolog,doIt, Demo,InputText?selection),
message(@prolog,printIt,Demo)))).
:- pce_end_class.
プッシュボタンによって呼び出されるコード:
%%% Create a new value based on the input string
%%% Write the new value back to the 'input' member of the
%%% 'demo' object. Also put the value int the 'result' slot.
doIt(Demo,Word) :-
concat_atom(['*** ' , Word, ' *** '] ,WordGotDid),
format("doIt: Setting result: ~w...~n", [WordGotDid]),
get(Demo,member,input,InputText),
send(InputText,selection,WordGotDid),
send(Demo,slot,result,WordGotDid).
%%% Read and display the 'result' slot.
printIt(Demo) :-
get(Demo,slot,result,Result),
write('\nResult: "'),
write(Result),
write('"\n').
メインプログラム:
%%% Create an object that has fields that can be mutated.
run :- new(Demo,demo),
send(Demo,open).
デモを見て、これをコーディングした後、XPCE の勉強を終えると、これは変わる可能性がある私の意見です。それが行われる方法。プログラミングは Prolog やその他の言語で行われ、Prolog を接着剤として使用しますが、XPCE はほとんどが受動的な GUI であり、HTML フォームのようなものです。このプログラムは XPCE オブジェクトを作成し、それらの状態を変更し、それらから値を読み取ります。XPCE は通常、GUI 関連の小さなメッセージ以外はプログラムに書き込みません。しかし、それも通常 XPCE オブジェクトのメソッドで行われます。