pyscripter / python4delphi

Free components that wrap up Python into Delphi and Lazarus (FPC)
MIT License
906 stars 310 forks source link

OnSendUniData event does not work #463

Open Uefi1 opened 6 months ago

Uefi1 commented 6 months ago

Hello, the OnSendUniData event assigned to TPythonGUIInputOutput is not WORK.

type
TRcv = class
procedure PythonInputOutputSendUniData(Sender: TObject; const Data: string);
end;

var
PythonEngine: TPythonEngine;
PythonInputOutput:TPythonGUIInputOutput;
Rcv:TRcv;
Temp:string;

{ TRcv }

procedure TRcv.PythonInputOutputSendUniData(Sender: TObject; const Data: string);
begin
Temp:='Event triggered'; //
end;

function execpythonscript(const Filename:string):string;
begin
 Result:='';
  PythonEngine := TPythonEngine.Create(nil);
    PythonInputOutput:=TPythonGUIInputOutput.Create(nil);
    PythonInputOutput.OnSendUniData:=Rcv.PythonInputOutputSendUniData;
    PythonInputOutput.UnicodeIO:=True;
    PythonInputOutput.DelayWrites:=True;
    PythonEngine.IO:=PythonInputOutput;
    PythonEngine.InitThreads := True;
    PythonEngine.UseLastKnownVersion := True
    PythonEngine.AutoLoad := False;
    PythonEngine.AutoUnload := False;
    PythonEngine.AutoFinalize := True;
    PythonEngine.RedirectIO := True;
    PythonEngine.LoadDll;
    TPythonThread.Py_Begin_Allow_Threads;
FGILState := PythonEngine.PyGILState_Ensure;
try
PythonEngine.ExecFile(Filename);
except
end;
PythonEngine.PyGILState_Release(FGILState);
Result:=Temp; //Always empty
end;
Uefi1 commented 6 months ago

I actually understood something: the console application does not intercept WM_USER and other messages that's why the event doesn't fire !!!!!

Uefi1 commented 6 months ago

I came to this conclusion after looking at how Vcl.PythonGUIInputOutput is implemented; in general, this entire Python4Delphi library is terribly and incomprehensibly written

Uefi1 commented 6 months ago

No, it turned out that this is not even the case: the console application does not accept messages; everything has been transferred to the form; the display also does not work! Generally a bug !

Uefi1 commented 6 months ago

Doesn't work in any way and under no circumstances:

procedure TForm2.PythonInputOutputSendUniData(Sender: TObject;
  const Data: string);
begin
//PythonInputOutput.DisplayString(Data);
cs.Enter;
Memo1.Lines.Add('WORK'); //NOT (
cs.Leave;
end;

procedure TForm2.InitPython;
begin
  PythonEngine := TPythonEngine.Create(nil);
  try
    PythonInputOutput:=TPythonGUIInputOutput.Create(nil);
    PythonInputOutput.OnSendUniData:=PythonInputOutputSendUniData;
    PythonEngine.IO:=PythonInputOutput;
    PythonInputOutput.UnicodeIO:=True;
    PythonInputOutput.RawOutput := False;
    PythonInputOutput.DelayWrites:=True;
    PythonEngine.InitThreads := True;
    PythonEngine.UseLastKnownVersion := False;
    PythonEngine.DllPath := ExtractFilePath(ParamStr(0));
    PythonEngine.DllName := 'python310.dll';
    PythonEngine.AutoLoad := False;
    PythonEngine.AutoUnload := False;
    PythonEngine.AutoFinalize := True;
    PythonEngine.RedirectIO := True;
    PythonEngine.LoadDll;
    TPythonThread.Py_Begin_Allow_Threads;
  finally
//
  end;
end;