@alexL Это же не модуль)
Распакуйте его в удобное место и откройте в БАСе
2023-11-05_19-32-50.png
пока разработчики разрабатывают, а gui захотелось.
хотел конечно собрать годный шаблон чтобы любой дятел мог настроить сменяя переменные в шапке, но мне недасук.
это набросок загрузчика, который принимает данные от пользователя и хранит их(данные) между запусками в файле в JSON. тот же файл с JSON я предлагаю использовать в качестве ресурса.
извините perl\Tkx\TCL.
так вышло, оказывается в стандартной поставке перл больше нет модуля Tk или он где-то глубже. Можно конечно "чтото".Net чтобы потом выяснять какие редистрибутэблы качать, но perl+perl2exe удобнее и не так уж и много ресурсов, можно померятся, не то чтобы у меня меньше...
что можно: картинки и таблички, фоны и шрифты, комбо- чек- радио- и прочие бутомы, программировать поведение в зависимости от чевони-будь, заголовки и надписи, меню и модальные окна, всяческие рамочки и прочие свистоперделки(я не останавливаюсь), табов настоящих вроде нет, но я поделку вроде получилось намутить чтобы и чтото на них похожее было, для интерфейса вполне хватит.
итак вот демонстрационный файлархив на файлообменниек, ибоне лезет(половина метра, что неплохооколо 8 метров, что хуже) и код скрипта, зауск и жестокое убийство БАСа закоментировано
Уже это можно поправить, поразбираться придется, но можно считать что это защита от скрипткиди.
#!perl
use strict;
#use LWP;
use Tkx;
use JSON;
#our $VERSION = "1.00";
our $PROGRAMM_NAME = "PROGRAMM NAME";
our $FRAME1 = "FRAME 1 NAME";
our $FRAME2 = "FRAME 2 NAME";
our $FRAME3 = "FRAME 3 NAME";
our $FRAME4 = "FRAME 4 NAME";
our $FRAME5 = "FRAME 5 NAME";
main();
sub main() {
my %settings = &loadSettings();
my $mw = Tkx::widget->new( "." );
$mw->g_wm_title($PROGRAMM_NAME);
$mw->g_wm_minsize(500, 350);
my $hFrame = $mw->new_labelframe( -text => $FRAME1 );
$hFrame->g_pack( -side => "top" );
my $name = 'name1';
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'addr: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my$val1 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'name'},
-justify => 'center',
);
$val1->g_pack( -side => "left" );
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'pass: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my$val2 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'pass'},
-justify => 'center',
);
$val2->g_pack( -side => "left" );
my $hFrame = $mw->new_labelframe( -text => $FRAME2 );
$hFrame->g_pack( -side => "top" );
$name = 'name2';
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'addr: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my$val3 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'name'},
-justify => 'center',
);
$val3->g_pack( -side => "left" );
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'pass: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my$val4 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'pass'},
-justify => 'center',
);
$val4->g_pack( -side => "left" );
my $hFrame = $mw->new_labelframe( -text => $FRAME3 );
$hFrame->g_pack( -side => "top" );
$name = 'name3';
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'email: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my$val5 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'name'},
-justify => 'center',
);
$val5->g_pack( -side => "left" );
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'password: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my$val6 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'pass'},
-justify => 'center',
);
$val6->g_pack( -side => "left" );
my $hFrame = $mw->new_labelframe( -text => $FRAME4 );
$hFrame->g_pack( -side => "top" );
$name = 'name4';
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $label = $lFrame->new_label(
-text => 'Key: ',
-justify => 'left',
);
$label->g_pack( -side => "left" );
my $val7 = $lFrame->new_entry(
-textvariable => \$settings{$name}{'key'},
-justify => 'center',
-state => $settings{$name}{'checkbox'} == 0?'disabled':'normal',
);
$val7->g_pack( -side => "top" );
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $ch1 = $lFrame->new_checkbutton(
-text => "use checkbox",
-variable => \$settings{$name}{'checkbox'},
-command => sub{
if($settings{$name}{'checkbox'}){
$val7->configure( -state => 'normal' );
}else{
$val7->configure( -state => 'disabled' );
$settings{$name}{'key'} = '';
}
}
);
$ch1->g_pack( -side => "top" );
my $hFrame = $mw->new_labelframe( -text => $FRAME5 );
$hFrame->g_pack( -side => "top" );
$name = 'name5';
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $ch2 = $lFrame->new_checkbutton(
-text => "use checkbox",
-variable => \$settings{$name}{'checkbox'},
);
$ch2->g_pack( -side => "top" );
$name = 'name4';
my $hFrame = $mw->new_frame();
$hFrame->g_pack( -side => "top" );
my $lFrame = $hFrame->new_frame();
$lFrame->g_pack( -side => "top" );
my $bStop;
my $bRun;
$bRun = $lFrame->new_button(
-text => "Run",
-command => sub{
$bStop->configure(-state => 'normal');
$bRun->configure(-state => 'disabled');
$val1->configure(-state => 'disabled');
$val2->configure(-state => 'disabled');
$val3->configure(-state => 'disabled');
$val4->configure(-state => 'disabled');
$val5->configure(-state => 'disabled');
$val6->configure(-state => 'disabled');
$val7->configure(-state => 'disabled');
$ch1->configure(-state => 'disabled');
$ch2->configure(-state => 'disabled');
&run(\%settings);
}
);
$bStop = $lFrame->new_button(
-text => "Stop",
-state => 'disabled',
-command => sub{
$bStop->configure(-state => 'disabled');
$bRun->configure(-state => 'normal');
$val1->configure(-state => 'normal');
$val2->configure(-state => 'normal');
$val3->configure(-state => 'normal');
$val4->configure(-state => 'normal');
$val5->configure(-state => 'normal');
$val6->configure(-state => 'normal');
if($settings{$name}{'checkbox'}){
$val7->configure( -state => 'normal' );
}
$ch1->configure(-state => 'normal');
$ch2->configure(-state => 'normal');
}
);
my $bExit = $lFrame->new_button(
-text => "Exit",
-command => sub{
$mw->g_destroy();
# exec 'taskkill', '/F /IM FastExecuteScript.exe';
}
);
$bRun->g_pack( -side => "left" );
$bStop->g_pack( -side => "left" );
$bExit->g_pack( -side => "left" );
Tkx::MainLoop();
}
sub run(){
my $json = $_[0];
mkdir "setting";
open(FILE, ">setting/sFile");
$json = encode_json($json);
print FILE $json;
close FILE;
# exec 'temp\engine\FastExecuteScript.exe', '--silent';
}
sub loadSettings(){
open(FILE, "<setting/sFile");
my @file = <FILE>;
my $str = $file[0];
my $json;
close FILE;
if($str){
$json = decode_json($str);
}else{
$json = {'name4' => {'checkbox' => 0}, 'name5' => {'checkbox' => 0}};
}
return %$json;
}
и да, пёрл вам не это
прдон собрал в минимальном режиме, недоложил окружения, у меня то работает, щас исправлюсь
пример обновил, проверил на устройстве где никакого окружения точно нет, работает, но размер увеличился, но что во врямена высокоскоростного интернета несуйщественно.