Naver Perl Community & Study Cafe


2008.10.31 11:23

Chapter 5. Moving On

1. More on Signal Handlers - 스킵 +_+ 쿠쿠쿠

2. An Upgrade Hello World

얼마전에 만든 Hello world 를 개선시키고 콜백함수에 대한 예제도 함께 만들어보자.

예제와 함께 위젯 패킹도 소개할 것이다.



 
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';

# 새로운 콜백함수 이 함수는 데이터를 전달한다 

# 모니터로 문자열을 출력해준다.
sub callback
{
	my ($button, $data) = @_;
	
	print "Hello again - $data was pressed\n";
}

# 다른 콜백함수
sub delete_event
{
	Gtk2->main_quit;
	return FALSE;
}

# 새로운 윈도우를 만든다.
$window = Gtk2::Window->new('toplevel');

# 만든 윈도우의 제목을 적는다.
# 윈도우 창의 이름은 "Hello Buttons!"
$window->set_title("Hello Buttons!");

# 여기서 delete_event 에 대한 처리를 설정한다

# exits GTK.
$window->signal_connect(delete_event => \&delete_event);

# 윈도우의 테두리 너비를 조정한다.
$window->set_border_width(10);

# 우리는 위젯을 팩으로 하여 상자를 하나 만든다. 이것을 자세하게 설명하자면

# packing은 section이다. 이 박스는 실제로는 눈에 보이진 않는다.

# 이것은 단지 위젯을 쓰기 위한 도구로만 사용이 된다. $box1 = Gtk2::HBox->new(FALSE, 0); # 메인 윈도우에 이 상자를 넣는다. $window->add($box1); # 새로운 버튼을 만들고 레이블을 "Button 1"로 설정한다 $button = Gtk2::Button->new("Button 1"); # 이제 버튼을 클릭했을 때, 콜백함수를 호출하도록 설정한다. # 인수로는 "button 1" 이라는 문자열 넣어서 호출하겠다. $button->signal_connect(clicked => \&callback, 'button 1'); # Gtk2::Container::add 모듈 대신 , pack 눈에 보이지 않게 버튼을 안에다 넣는다. # 박스는 윈도우안에 속하게 되었다. $box1->pack_start($button, TRUE, TRUE, 0); # 이것은 GTK 를 위한 준비단계를 말하는것이기 때문에 이 단계를 항상 기억해야 한다. # 버튼이 완료되었고 이제 버튼을 출력 할 수 있다. $button->show; # 두번째 버튼은 동일하게 만들어 주면 된다. $button = Gtk2::Button->new("Button 2"); # 같은 콜백 함수를 호출 하지만 다른 인자값을 넘긴다. # "button 2" instead. $button->signal_connect(clicked => \&callback, 'button 2'); $box1->pack_start($button, TRUE, TRUE, 0); # 버튼들을 보여주는 순서들이 중요하지는 않지만 # 윈도우의 마지막부분에 한번에 모두 보여주는것을 추천한다. $button->show; $box1->show; $window->show; # Rest in main and wait for the fun to begin! Gtk2->main; 0;


원문 코드 :  http://codepad.org/9b14DmH8


- 출력화면

- Button1 과 Button2를 각각 클릭





처음 GTK를 접하고 버튼 2개를 만드려고 했을 때 위젯 구조를 무시한 채

 
$button = Gtk2::Button->new("Hello World");
$button->signal_connect(clicked => \&hello, $window);
$window->add($button);
$button->show;

$button1 = Gtk2::Button->new("Hello World");
$button1->signal_connect(clicked => \&hello, $window);
$window->add($button1);
$button1->show;

단순히 이런식으로 버튼 2개만 만들면 되겠지... 생각했었다.

하지만 왠걸 OTL...

아무리 수를 써도 버튼 2개가 만들어 지지 않는 것이었다.

버튼 2개를 만드는 것이 이렇게 힘든것인가.. 생각했던 추억이.. 덜덜;;



위의 예제를 응용하여 여러버튼을 나열해 보았다.

Button이라는 함수를 선언하여 버튼을 효율적으로 생성하도록 하였으며

VBox와 HBox를 적절하게 배분하였다.






use Glib qw/TRUE FALSE/;
use Gtk2 '-init';

sub callback
{
	my ($button, $data) = @_;	
	print "Hello again - $data was pressed\n";
}
sub delete_event
{
	Gtk2->main_quit;
	return FALSE;
}

sub Button{
	my $title = shift;
	my $box = shift;
	$button = Gtk2::Button->new($title);
	$button->signal_connect(clicked => \&callback, $title);
	$box->pack_start($button, TRUE, TRUE, 0);
	$button->show;	
	$box->show;
}

$window = Gtk2::Window->new('toplevel');
$window->set_title("Hello Buttons!");
$window->signal_connect(delete_event => \&delete_event);
$window->set_border_width(20);

$box = Gtk2::VBox->new(FALSE, 0);
$window->add($box);

$box1 = Gtk2::VBox->new(FALSE, 0);
$box->add($box1);

$box2 = Gtk2::HBox->new(FALSE, 0);
$box->add($box2);

$box3 = Gtk2::HBox->new(FALSE, 0);
$box->add($box3);

foreach my $index(1..3){	
	Button('Box1-'.$index,$box1);
}
foreach my $index(1..2){	
	Button('Box2-'.$index,$box2);
}
foreach my $index(1..5){	
	Button('Box3-'.$index,$box3);
}
$box->show;
$window->show;
Gtk2->main;

0;




원문 코드 : http://codepad.org/MWIvpw5j


예전에 Perl 새미나때 Keedi님의 자료 중 위젯구조에 대한 언급이 있었다.

http://event.perl.kr/kpw2008/presentations/cross_platform_gui_environment_with_gtk2_perl/

= 131페이지

상속받은 자식 위젯은 부모 위젯의 메소드를 사용할 수 있다!

지금은 이해가 가지만... 이 자료를 읽을 당시에는 음냐음냐...


추상적으로 표현하자면 예전에는 희미했던 그림이 이제는 점점 선명하게 보이고 있다.

시간을 쪼개어 꾸준히 연구하자.
신고
Trackback 0 Comment 0