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

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

Уже в момент создания бота в голове крутилась реализация десктопного 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 и работает), наверное по умолчанию что-то.

Комментарии (27)


  1. alan008
    24.09.2023 10:07
    +4

    Из комментариев к первой статье одним из самых вразумительных комментариев был:


    А может быть просто расшарить ссылку на Яндекс.диск и там поиском найти?

    Не совсем понял, какую задачу решает именно бот или описанное выше приложение.
    Бот хотя бы был экранирован от Яндекс-диска тем, что токен к Яндекс диску лежал на бэкенде, т.е. не отдавался никому наружу.


    А в этом GUI приложении токен интегрирован прямо в само приложение, т.е. отдается всем, кто получит доступ к данному приложению (т.е. по сути вообще всем, токен делается публичным). Это действительно то, что вы хотели сделать, или я чего-то не понял из статьи?


    1. Kraleks Автор
      24.09.2023 10:07

      Да, с токеном это вопрос. И если уж создавать для общего пользования, то его надо решать. На написание приложения и, в последствии, статьи сподвиг комментарий о сложности. Захотелось попробовать, о чем и написал).


  1. Revertis
    24.09.2023 10:07
    +3

    При любом раскладе тут Питон как пятое колесо к телеге.


    1. Kraleks Автор
      24.09.2023 10:07
      +1

      Возможно. Но Вы гляньте сколько вопросов про GUI новички Python-a задают. Вот как еще один путь для изучения.


      1. tzlom
        24.09.2023 10:07
        +5

        действительно, ведь учить дельфи для гуя это именно то, что нужно новичку в питоне


        1. Kraleks Автор
          24.09.2023 10:07
          -1

          я ж не заставляю. каждый сам выберет шо ему надо.


        1. HemulGM
          24.09.2023 10:07
          +2

          На самом деле достаточно полезно. Здесь подход не очень, но имеется такая вещь как PythonVCL и PythonFMX. Это фреймворки для сравнения гуи для питона используя дизайнер среды Делфи (RAD Studio).

          Т.е. можно создавать и дизайнить окна в среде и подключить их в питоне.

          https://pypi.org/project/delphifmx/


          1. Kraleks Автор
            24.09.2023 10:07

            В этом варианте и кроссплатформенность лучше будет


            1. HemulGM
              24.09.2023 10:07
              +2

              Без питона кроссплатформенность куда эффективнее. Кроссплатформенные программы на Делфи являются нативными для целевой платформы и собираются для каждой отдельно.

              Достаточно настроить SDK один раз (и, если нужно, создать подключение для запуска и отладки на целевой платформе) и переключать нужную платформу для запуска, сборки и деплоя.


              1. Kraleks Автор
                24.09.2023 10:07

                Я тож балдею от Delphi. Как бы там не ругали ее, но GUI делается мгновенно и без кода.


  1. kapas19
    24.09.2023 10:07

    Я не пробовал Python4Delphi. А Memo1 как-то связывается с PythonGUIInputOutput1?


    1. Kraleks Автор
      24.09.2023 10:07

      Да. Там примеров много из них много чего вытянуть можно.


      1. kapas19
        24.09.2023 10:07

        Ясно. Спасибо


  1. HemulGM
    24.09.2023 10:07
    +3

    Ужасный ужас. Зачем тут вообще питон? Ради пары запросов на Яндекс диск? Серьёзно? И в целом код плохой. Не многопоточный, не кроссплатформенный.

    А подводные камни.. это что-то:

    1. Ну да, кто бы знал, что будет требоваться бинарная совместимость

    2. Проблема с кодировками от использования питона

    3. Потому что есть дебаг версия и релиз. Они существуют не просто так


    1. Kraleks Автор
      24.09.2023 10:07

      Да. Так и указано - уровень сложности "простой". Был бы вариант - "нулевой", но его нет к выбору. Многопоточность здесь не требуется, кроссплатформенность делалась бы по другому. Просто показал, что решить задачу не сложно. П.с. я не программист, не зарабатываю этим и опыта не имею соответствующего.


      1. HemulGM
        24.09.2023 10:07
        +1

        Кроссплатформенность в Делфи делается так же просто, как и не кроссплатформа.

        Сделать нужно всё то же самое, что ты сделал, только перед этим выбрать не vcl, а Multi Device Application проект


        1. Kraleks Автор
          24.09.2023 10:07

          Спасибо. Я еще не сильно знаком с новыми системами. На D7 больше был.


  1. andybiiig
    24.09.2023 10:07
    +1

    Поскольку вопрос о том, зачем здесь python, уже был задан, то у меня обратный вопрос: а зачем здесь Delphi? Чтобы что?

    Пайтон умеет в GUI. Не нравится TkInter - вот PyQt5, PySimpleGUI, wxPython и ещё с десяток решений.

    Можно зайти с другой стороны - SimpleHTTPServer и общаться через браузер. Может и не самый эффективный способ, но достаточно простой


    1. HemulGM
      24.09.2023 10:07
      +2

      На Делфи всё это делается в разы быстрее. На выходе один файл в насколько мегабайт. Никаких зависимостей и проблем. Быстро сделать как GUI, при чем на уровне современных сайтов и визуально, а не только кодом. Поднять тот же хттп сервер или целый веб сервис (тоже можно с дизайнером).

      И да, кроссплатформенность тоже имеется.


  1. Devastor87
    24.09.2023 10:07

    Delphi ещё жив?

    Помнится, крайний раз кодил на нём лет 18 назад...


    1. HemulGM
      24.09.2023 10:07
      +1

      Питон появился в 91 году, а Делфи в 95. Свежее обновление на Делфи было несколько месяцев назад и выходят регулярно.


    1. alan008
      24.09.2023 10:07
      +1

      Живёт и здравствует, кросс платформенный, с дженериками, анонимными методами и прочим популярным. Версии выходят раз в год или чаще. Среда разработки довольно удобная, с автоматическими рефакторингами и прочим. Есть конечно некоторые шероховатости, но они исправляются от версии к версии. ГУИ сейчас 2 варианта — VCL под Windows (как раньше) и FMХ под кросс платф (под Win/MacOS/мобильные ОС, но без Linux, под Linux требуется качать отдельный пакет FMXLinux).


      1. HemulGM
        24.09.2023 10:07

        FMXLinux идет бесплатно в пакетом менеджере (GetIt), если среда позволяет билдить под Линукс (т.е. редакция Архитект)


        1. alan008
          24.09.2023 10:07

          Ага, спасибо за уточнение! Ну я имел в виду, что его нет "в коробке по умолчанию" (скорее всего с фирмой KSDev, исходными разработчиками всего FMX (которые кстати из России, по крайней мере были на тот момент), что-то не поделили ))


  1. Phantom91x
    24.09.2023 10:07
    +2

    Зато сколько комментариев. Тоже чтоли бесполезное приложение сделать и на хабр про это написать????
    А потом к нему бесполезное дополнение в виде другой обертки????


    1. HemulGM
      24.09.2023 10:07

      Ну не знаю, если только тебе очень нужны минусы ????


      1. rusik2293
        24.09.2023 10:07

        Ради плюсов надо в кубер задеплоить