21 мая 2009 г.

Программа расчёта хеш-суммы. Часть 1.

Теперь, когда вы знакомы с некоторыми виджетами и знаете, как их распологать в окне, предлагаю написать первое более-менее серьёзное приложение. Это будет программа, запрашивающая у пользователя строку и возвращающая её хэш-сумму. Статья будет состоять из нескольких частей. В первой мы создадим базовую программу расчёта MD5, во второй добавим возможность выбора между MD5 и SHA1, далее добавим обработку введённых данных на предмет пустоты и оповещение об этом пользователя.

Для начала предлагаю определиться, что же мы хотим видеть в нашей программе. Это будет окно фиксированного размера, т.к. в данном случае изменение размеров совершенно ни к чему. Будет 2 поля ввода: в первое пользователь введёт строку, а во второе мы поместим её хэш-сумму. Также добавим 2 кнопки: "Закрыть" и "Расчитать".

В конце статьи у нас получится примерно следующее:


С задачами определились, тогда начнём.

$window = new GtkWindow();
$window->set_title('Расчёт хеш-суммы');
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_resizable(FALSE);
$window->set_size_request(450, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
Здесь мы создали окно, установили его положение на экране, размеры и заголовок.

В нашем случае для размещения виджетов удобнее всего использовать таблицу, поэтому создаём её:
$table = new GtkTable();


Теперь создаём необходимые элементы интерфеса и добавляем их в таблицу:
$label_source = new GtkLabel('Исходный текст:');
$label_md5 = new GtkLabel('Получившийся MD5:');
$entry_source = new GtkEntry();
$entry_md5 = new GtkEntry();
$button_close = new GtkButton('_Закрыть');
$button_calc = new GtkButton('_Расчитать');
 
$table->attach($label_source, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
$table->attach($entry_source, 1, 2, 0, 1);
$table->attach($label_md5, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
$table->attach($entry_md5, 1, 2, 1, 2);
$table->attach($button_close, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
$table->attach($button_calc, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL);

По нажатию на кнопку "Закрыть" программа должна прекратить своё выполнение. Для этого вешаем на сигнал 'clicked' встроенную функцию Gtk::main_quit(), о которой вы знаете из статьи Создание простого окна. Часть 1.:
$button_close->connect_simple('clicked', array('Gtk', 'main_quit'));

А по нажатию на кнопку "Расчититать" мы вызовем функцию on_calc(), которая получит хеш-сумму введённой строки и поместит её в $entry_md5:
$button_calc->connect_simple('clicked', 'on_calc',
$entry_source, $entry_md5);
 
function on_calc($source, $md5)
{
$input = $source->get_text();
$md5->set_text(md5($input));
$source->set_text('');
$source->grab_focus();
}
С помощью метода get_text() мы узнаём введённую строку. Метод set_text() устанавливает новое значение в $entry_md5. Для того, чтобы пользователю совершать меньшее количество движений мы очищаем поле $entry_source и методом grab_focus() помещаем в него указатель.

Ту же функцию необходимо вызвать и для сигнала 'activate' у $entry_source.

Как всегда, в конце статьи полный исходный код:
<?php
 
$window = new GtkWindow();
$window->set_title('Расчёт хеш-суммы');
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_resizable(FALSE);
$window->set_size_request(450, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$table = new GtkTable();
 
$label_source = new GtkLabel('Исходный текст:');
$label_md5 = new GtkLabel('Получившийся MD5:');
$entry_source = new GtkEntry();
$entry_md5 = new GtkEntry();
$button_close = new GtkButton('_Закрыть');
$button_calc = new GtkButton('_Расчитать');
 
$table->attach($label_source, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
$table->attach($entry_source, 1, 2, 0, 1);
$table->attach($label_md5, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
$table->attach($entry_md5, 1, 2, 1, 2);
$table->attach($button_close, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
$table->attach($button_calc, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL);
 
$button_close->connect_simple('clicked', array('Gtk', 'main_quit'));
 
$button_calc->connect_simple('clicked', 'on_calc',
$entry_source, $entry_md5);
 
function on_calc($source, $md5)
{
$input = $source->get_text();
$md5->set_text(md5($input));
$source->set_text('');
$source->grab_focus();
}
 
$entry_source->connect_simple('activate', 'on_calc',
$entry_source, $entry_md5);
 
$window->add($table);
$window->show_all();
Gtk::main();
 
?>

1 комментарий:

Анонимный комментирует...

Спасибо, интересный блог. Теперь буду изучать PHP-GTK.