Телеграмм накрылся)), бот не работает. Делаю GUI-заменитель

от автора

Всем привет.
Не так давно выложил статью про бота.

И вот тут меня зацепил) один комментарий.

Уже в момент создания бота в голове крутилась реализация десктопного GUI-заменителя).
Сложности я там не увидел. Но шо-то народ говорит сложно. Не попробуешь — не узнаешь), а тут удалось выкроить немного свободного времени. Погнали)

Качаю Delphi 11CE (бесплатная, письма с ссылками приходили на яндекс-почту), ставлю Python4Delphi — увязывает между собой ЯП и Delphi4PythonExporter — позволяет экспортировать GUI на Delphi в Python (не пригодился).

Мгновенно набрасываю минимальный интерфейс:

Из кода бота на Python вырезаю все лишнее и получаю вроде как шаблон, который и будет грузиться в компонент memo формы:

#  pip install yadisk #  pip install delphivcl  import yadisk  # токен яндекс диска y = yadisk.YaDisk(token='абра-кадабра от яндекса')  ##search_dir = 'GOST' ## ##find_str = '1811'  if y.check_token():     # ищем в папке поиска документ содержащий запрос     if not y.is_dir('/'+search_dir):         print('Папка ' + search_dir +' не обнаружена. Шо-то поломалось. Извините.')     else:         Spis = []         for item in y.listdir(search_dir):             if find_str in item['name']:                 if len(Spis) < 7:                     print('Обнаружен документ: ')                     print(item['name'].encode().decode("ansi"))                 Spis.append(item['name'])         if len(Spis) == 0:             print('Извините, пока такого документа в папке '+ search_dir +' не нашлось.')         if len(Spis) == 1:                 # ------------даем ссылку на файл-------------------                 y.publish('/'+search_dir+'/'+Spis[0])  # делаем публичный файл                 # шлем ссылку                 print(y.get_meta('/'+search_dir+'/'+Spis[0]).public_url)          if len(Spis) > 1:             print('Найдено документов: '+str(len(Spis)) + '. Уточните запрос:') else:     print('Извините по каким-то причинам диск не доступен. Попробуйте в другой раз')

Попутно убираю файл с настройками, токен всовываю в скрипт.

В скрипт питона думал сначала передавать папку поиска и запрос через текстовые файлы. Хотя и есть компоненты. Но потом подумал — таки это ж я могу и после загрузки скрипта в компонент memo вставить нужные строки:

Memo2.Lines.Insert(0, 'search_dir = "'+ComboBox1.Text+'"'); Memo2.Lines.Insert(0, 'find_str = "'+Edit1.Text+'"'); 

Питон гибкий). Таким образом избегаю сложностей по обмену данными между 2-мя системами и использую только 2 компонента пакета P4D — PythonEngine1: TPythonEngine и PythonGUIInputOutput1: TPythonGUIInputOutput.

Получаю структуру для минимально рабочего приложения:

Вся работа с приложением сводится к выбору папки поиска, ввода запроса и нажатия кнопки. После в невидимый memo2 грузится скрипт, добавляются нужные строки, запускается выполнение, все сообщения от скрипта через print возвращаются в memo1.

unit Unit2;  interface  uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,   PythonEngine, Vcl.PythonGUIInputOutput, SynEdit;  type   TForm2 = class(TForm)     Memo1: TMemo;     Edit1: TEdit;     Splitter1: TSplitter;     Panel1: TPanel;     Label1: TLabel;     ComboBox1: TComboBox;     Button1: TButton;     PythonEngine1: TPythonEngine;     PythonGUIInputOutput1: TPythonGUIInputOutput;     Memo2: TMemo;     SynEdit1: TSynEdit;     procedure FormCreate(Sender: TObject);     procedure Button1Click(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;  var   Form2: TForm2;  implementation  {$R *.dfm}  procedure TForm2.Button1Click(Sender: TObject); begin   Memo1.Clear;   SynEdit1.Clear;   SynEdit1.Lines.Add('Запускаю поиск по запросу: ');   SynEdit1.Lines.Add(Edit1.Text);   SynEdit1.Lines.Add('В папке: '+ComboBox1.Text);   Application.ProcessMessages;   Memo2.Clear;   Memo2.Lines.LoadFromFile('bot_no_tg.py');   // добавляем в скрипт папку поиска и запрос   Memo2.Lines.Insert(0, 'search_dir = "'+ComboBox1.Text+'"');   Memo2.Lines.Insert(0, 'find_str = "'+Edit1.Text+'"');   PythonEngine1.ExecStrings( Memo2.Lines );   Memo1.Visible:=false;   Application.ProcessMessages;   Memo1.Text:=Utf8ToAnsi(memo1.Text);   Memo1.Visible:=true;   Application.ProcessMessages; end;  procedure TForm2.FormCreate(Sender: TObject); begin   Memo1.Clear;   Memo2.Clear;   SynEdit1.Clear; end;  end. 

Практически повторен функционал бота. Рюшечек конечно можно добавить, но пока не интересно).

Из подводный камней:

  • разрядность систем надо соблюдать: если приложение для х64, то и Python х64,

  • пришлось повозится с кодировками и добавить 1)Delphi: Memo1.Text:=Utf8ToAnsi(memo1.Text); 2)Python: print(item[‘name’].encode().decode(«ansi»)),

  • debug и release имеют очень разные объемы конечного exe файла, а еще и рабочие папки разные. И папки для версий тоже разные.

  • изначально Python у меня был установлен, потом поставилась Delphi, потом в нее нужные компоненты. В момент установки они подхватили зарегистрированную в системе версию Python. При переносе на другую систему эти связи теряются и прога не работает. В инете скудновато, но есть инфа как программно сделать соответствующие привязки. Вроде даже пишут, шо можно и портабле версию использовать. Вот работу на другом компе я проверил в виртуал-боксе (см ниже).

На самом деле очень много времени отняла эта борьба с кодировками — кряко-зяблы лезли. Пришлось много полопатить разной инфы и много чего пробовать. Думал уже не победю, но как-то само заработало). Компонент memo туповат для этого — не может строки нормально отображать в разных кодировках. Полез даже SynEdit ставить, но и он не помог. Так что можно было и без него обойтись. Да и компонент memo на 1шт можно сократить.

Ура, заработало:

Кнопку «очистить» — убрал впоследствии, и так все многострочные компоненты чистятся).

Для проверки в виртуал-боксе качаю tiny10 23h1 x64, ставлю, через ISO закидываю экзешник со скриптом. Пробую. Без питоновской dll не запустилось. Да еще и версию другую затребовало (на моем компе 3.11х64 и работает), наверное по умолчанию что-то.


ссылка на оригинал статьи https://habr.com/ru/articles/763054/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *