Кибор » Кибор - Интегрированная среда разработки ботов » Отчет о ошибках » Функции питона.

Страниц (1): [1]
 

1. Zireael - 04 Августа, 2020 - 03:16:42 - перейти к сообщению
loadfilepython - если нет файла по указанному пути, то кибор вылетает.
2. Kibor - 04 Августа, 2020 - 04:45:59 - перейти к сообщению
Исправил
3. Zireael - 11 Января, 2021 - 02:54:50 - перейти к сообщению
https://drive.google.com/file/d/...view?usp=sharing
Архив распаковать и закинуть в папку с питоном.
Запустить скрипт в интерпретаторе:
CODE:
from tkinter import *

window = Tk() # создать окно
window.title("GUI на Python") # изменить титул окна
window.geometry("400x300") # изменить размер окна
window.mainloop() # обработка событий
print("end")

Работает.
Запустить этот же скрипт через кибор:
CODE:
if (runpython())//Запустили интерпретатор
{
enableconsolepython(1, 1, 500, 50, 400, 600);

__python
from tkinter import *

window = Tk() # создать окно (выполнится только эта строка)
window.title("GUI на Python") # изменить титул окна
window.geometry("400x300") # изменить размер окна
window.mainloop() # обработка событий
print("end")

__end_python

messagebox ("111");
closepython();//Завершили работу с интерпретатором
}

Окно создаётся, строки ниже не выполняются.
4. Kibor - 20 Января, 2021 - 05:00:06 - перейти к сообщению
Не могу понять. После вызова функции Tk() ответ с питона приходит нормально, но канал остается заблокированным..
5. Zireael - 20 Января, 2021 - 07:53:46 - перейти к сообщению
В таком виде запускается.
CODE:
if (runpython())//Запустили интерпретатор
{
//enableconsolepython(1, 1, 500, 50, 400, 600);

__python
from tkinter import*;window = Tk();window.title("GUI на Python");window.geometry("400x300");window.mainloop();print("end");
__end_python

messagebox ("111");
closepython();//Завершили работу с интерпретатором
}

Но отправлять код одной строкой как-то не очень.
6. Kibor - 21 Января, 2021 - 11:22:00 - перейти к сообщению
Честно говоря я понятия не имею почему не работает если в этом коде раскомментировать отправку "window = Tk()", которая прекрасно сама сработает и прочитается ответ. Но потом если что то отправить, то оно не выполнится и с канала ничего нельзя будет прочитать..

CODE:
#define STARTF_USESHOWWINDOW 1
#define STARTF_USESTDHANDLES 256
#define SW_HIDE 0
#define INFINITE -1
#define NULL 0
external(INT, "CreatePipe", "CreatePipe", "kernel32.dll");
external(VOID, "ZeroMemory", "RtlZeroMemory", "kernel32.dll");
external(VOID, "GetStartupInfo", "GetStartupInfoA", "kernel32.dll");
external(INT, "CreateProcess", "CreateProcessA", "kernel32.dll");
external(INT, "PeekNamedPipe", "PeekNamedPipe", "kernel32.dll");
external(INT, "ReadFile", "ReadFile", "kernel32.dll");
external(INT, "WriteFile", "WriteFile", "kernel32.dll");
external(INT, "TerminateProcess", "TerminateProcess", "kernel32.dll");
external(INT, "WaitForSingleObject", "WaitForSingleObject", "kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "kernel32.dll");

string path_python=pathfolder()+"python\python.exe -i";//Можно писать полный путь к интерпретатору Python если он не в папке с Кибор
int hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;
char pi[16];
char W_buff[10000];
string Rez;

int readed;
int PythonbytesAvail;
int lBytesWrite;
string COMMAND;

if (StartPython())//Запустить интерпретатор python и наладить с ним связь PIPE
{
//Ждем пока будет ответ РАБОТАЕТ
PythonbytesAvail=0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 1");
goto er;
}
sleep(1);
}

messagebox ("0 прочитаем "+format(PythonbytesAvail));//Читать сколько байт

ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////





//Отправляем команду
COMMAND="from tkinter import *";
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
messagebox ("Отправили "+COMMAND);

//Ждем пока будет ответ РАБОТАЕТ
PythonbytesAvail = 0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 2");
goto er;
}
sleep(1);
}
messagebox ("1 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
//Считываем ответ
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////

/*
//Отправляем команду
COMMAND="window = Tk()";
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
messagebox ("Отправили "+COMMAND);

//Ждем пока будет ответ РАБОТАЕТ
PythonbytesAvail = 0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 3");
goto er;
}
sleep(1);
}

messagebox ("2 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
//Считываем ответ
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////
*/

//////////////////////////// А тут уже не работает ЕСЛИ РАСКОММЕНТИРОВАТЬ ВЕРХИЙ КОД. ТО ЕСТЬ "window = Tk()"


//Отправляем команду
COMMAND="print(5)";
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
messagebox ("Отправили "+COMMAND);

//Ждем пока будет ответ НЕ ДОЖДЕМСЯ, потому что переде этим было "window = Tk()" который прекрасно отработал
PythonbytesAvail = 0;
while(PythonbytesAvail==0)
{
if (PeekNamedPipe(hReadPipe1, NULL, 0, NULL, address(#PythonbytesAvail), NULL)==0)
{
messagebox ("error 4");
goto er;
}
sleep(1);
}

messagebox ("3 прочитаем "+format(PythonbytesAvail));//Читать сколько байт
//Считываем ответ
ReadFile(hReadPipe1, address(#W_buff[0]), PythonbytesAvail , address(#readed), 0);//Читаем
W_buff[PythonbytesAvail]=0;
messagebox (format(#W_buff[0]));//вывод ответа
////////////////////////////


ClosePython();//Завершить работу с каналом и интерпретатором
}


er:;


function StartPython()
{
int ret;

//SECURITY_ATTRIBUTES
char sa[12];
initialarray(#sa[0], 0);
writeaddress(sizearray(sa), address(#sa[0]));
writeaddress(0, address(#sa[4]));
writeaddress(1, address(#sa[8]));

ret=CreatePipe(address(#hReadPipe1),address(#hWritePipe1),address(#sa[0]),0);
if (ret==0)return 0;
ret=CreatePipe(address(#hReadPipe2),address(#hWritePipe2),address(#sa[0]),0);
if (ret==0)return 0;

//STARTUPINFO
char si[68];
initialarray(#si[0], 0);
ZeroMemory(address(#si[0]),sizearray(si));
GetStartupInfo(address(#si[0]));
writeaddress(sizearray(si), address(#si[0]));
writeaddress(STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES, address(#si[44]));
writeaddress(SW_HIDE, address(#si[48]));
writeaddress(hReadPipe2, address(#si[56]));
writeaddress(hWritePipe1, address(#si[60]));
writeaddress(hWritePipe1, address(#si[64]));

//PROCESS_INFORMATION
initialarray(#pi[0], 0);
ret=CreateProcess(0,path_python,0,0,1,0,0,0,address(#si[0]),address(#pi[0]));
if (ret==0)return 0;

return 1;
}


function ClosePython()
{
TerminateProcess(addressi(address(#pi[0])), 0);
WaitForSingleObject(addressi(address(#pi[0])), INFINITE );
CloseHandle(addressi(address(#pi[0])));
CloseHandle(addressi(address(#pi[4])));
CloseHandle(hReadPipe1);
CloseHandle(hWritePipe1);
CloseHandle(hReadPipe2);
CloseHandle(hWritePipe2);
}

Powered by ExBB FM 1.0 Final