'Perl/Perl GIMP Tool Kit'에 해당되는 글 16건

  1. 2009.09.01 Gtk2::Calendar (1)
  2. 2009.03.14 ID 및 PASSWORD 인증 설정
  3. 2009.03.10 이미지를 입혀보자 (Gtk2::Rc)
  4. 2009.03.03 Perl diary - 세번째 이야기
  5. 2009.02.28 Perl diary - 두번째 이야기
  6. 2009.02.26 Perl 다이어리??
  7. 2008.11.23 perl을 사용한 HTML Parser
  8. 2008.11.13 음악을 들어보자 #5 (5)
  9. 2008.10.31 Chapter 5. Moving On
  10. 2008.10.16 음악을 들어보자 #4

Naver Perl Community & Study Cafe


2009.09.01 21:54

Gtk2::Calendar

Gtk2 모듈에 소속되어 있는 Calendar 모듈 을 소개하려 한다.

이 모듈은 뜻 그대로 달력 모듈이다.


일단 예제코드부터 먼저 보고 시작하도록 하자.





#!/usr/bin/perl -w

# 요기는 뭐 별로 신경쓰지 않아도 된다.
# Copyright (C) 1998 Cesar Miquel, Shawn T. Amundson, Mattias Gr?lund
# Copyright (C) 2000 Tony Gale
# 
# Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full
# list)
# 
# This library is free software; you can redistribute it and/or modify it under
# the terms of the GNU Library General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
# 
# This library is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU Library General Public License for
# more details.
# 
# You should have received a copy of the GNU Library General Public License
# along with this library; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA  02111-1307  USA.
#
# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/Gtk2/examples/calendar.pl,v 1.7 2004/03/14 08:55:48 muppetman Exp $
#

# this was originally gtk-2.2.1/examples/calendar/calendar.c
# ported to gtk2-perl (and perl-ized) by rm

use strict;
use Gtk2;

use Glib ':constants'; 
 
use constant DEF_PAD => 10;
use constant DEF_PAD_SMALL => 5;

use constant TM_YEAR_BASE => 1900;

sub calendar_select_font # 폰트를 변경시켜주는 함수이다. 이부분도 중요하지는 않다.
{
	my $calendar = shift;

	my $fsd = Gtk2::FontSelectionDialog->new ('Font Selection Dialog');
	$fsd->set_position('mouse');

	$fsd->set_font_name ($calendar->get_style->font_desc->to_string);

	$fsd->signal_connect ('response' => sub {
		my (undef, $response) = @_;
		if ($response eq 'ok') {
			my $font_name = $fsd->get_font_name;
			return unless $font_name;
			$calendar->modify_font
				(Gtk2::Pango::FontDescription->from_string
				 	($font_name));
		}
		$fsd->destroy;
	});

	$fsd->show;
}


sub calendar_set_signal_strings
{
	my $sig_ref = shift;
	my $new_sig = shift;

	$sig_ref->{prev2}->set_text($sig_ref->{prev}->get_text);
	$sig_ref->{prev}->set_text($sig_ref->{curr}->get_text);
	$sig_ref->{curr}->set_text($new_sig);
}

sub create_calendar  # 핵심적인 함수이다. 달력을 생성해준다.
{
	my $window;
	my $vbox;
	my $vbox2;
	my $vbox3;
	my $hbox;
	my $hbbox;
	my $calendar;
	my @toggles;
	my $button;
	my $frame;
	my $separator;
	my $label;
	my $bbox;
	my $i;
  
    	my %signals = (); # 레이블을 쉽게 바꾸기 위해 signals 해쉬를 미리 만든다.
                           # 이 작업을 활용하면 상당히 편하게 코드 작성이 가능하다.   
	$window = Gtk2::Window->new("toplevel");
  	$window->set_title('GtkCalendar Example');
  
	$window->set_border_width(5);
	$window->signal_connect( 'destroy' => sub {
			Gtk2->main_quit;
		} );
	$window->set_resizable(FALSE);

	$vbox = Gtk2::VBox->new(FALSE, DEF_PAD);
	$window->add($vbox);

	#
	# The top part of the window, Calendar, flags and fontsel.
	#

	$hbox = Gtk2::HBox->new(FALSE, DEF_PAD);
	$vbox->pack_start($hbox, TRUE, TRUE, DEF_PAD);
  
	$hbbox = Gtk2::HButtonBox->new;
	$hbox->pack_start($hbbox, FALSE, FALSE, DEF_PAD);
	$hbbox->set_layout('spread');
	$hbbox->set_spacing(5);

	# Calendar widget
	$frame = Gtk2::Frame->new('Calendar');
	$hbbox->pack_start($frame, FALSE, TRUE, DEF_PAD);
	$calendar = Gtk2::Calendar->new; #  이 부분이 중요하다 달력을 생성한다.

	$calendar->mark_day(19);         #  19일에 진하게 표시를 한다.
	$frame->add($calendar);          #  frame 에 달력을 추가한다.
	$calendar->display_options([]);
         # 여기부터는 달을 바꾸거나, 날짜를 클릭할때 일어나는 여러 이벤트를 설정하였다.
	$calendar->signal_connect( 'month_changed' => sub {      # 달이 바뀌었을때
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 'month changed: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );
	$calendar->signal_connect( 'day_selected' => sub {       # 날짜를 선택했을 때
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 'day selected: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );
	$calendar->signal_connect( 'day_selected_double_click' => sub {  #날짜 더블클릭
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 
				'day selected double click: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );
	$calendar->signal_connect( 'prev_month' => sub {         # 이전달 클릭
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 'prev month: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );
	$calendar->signal_connect( 'next_month' => sub {         # 다음달 클릭
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 'next month: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );
	$calendar->signal_connect( 'prev_year' => sub {          
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 'prev year: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );
	$calendar->signal_connect( 'next_year' => sub {
			my ($year, $month, $day) = $calendar->get_date; 
			calendar_set_signal_strings($_[1], 'next year: '.
				sprintf("%02d/%d/%d", $month+1, $day, $year) );
		}, \%signals );

	$separator = Gtk2::VSeparator->new;
	$hbox->pack_start($separator, FALSE, TRUE, 0);

	$vbox2 = Gtk2::VBox->new(FALSE, DEF_PAD);
	$hbox->pack_start($vbox2, FALSE, FALSE, DEF_PAD);
  
	# Build the Right frame with the flags in

	$frame = Gtk2::Frame->new('Flags');
	$vbox2->pack_start($frame, TRUE, TRUE, DEF_PAD);
	$vbox3= Gtk2::VBox->new(TRUE, DEF_PAD_SMALL);
	$frame->add($vbox3);
         # 배열로 플래그를 만들어 플래그의 켜짐과 꺼짐에 따라 달력 모양을 바꿀 수 있다.
	my @flags = (
		'Show Heading',
		'Show Day Names',
		'No Month Change',
		'Show Week Numbers',
		'Week Start Monday',
	);
	for( $i = 0; $i < 5; $i++ )
	{
		$toggles[$i] = Gtk2::CheckButton->new($flags[$i]);
		$toggles[$i]->signal_connect( 'toggled' => sub {
				my $j;
				my $opts = [];
				for($j = 0; $j < scalar(@flags); $j++ )
				{
					if( $toggles[$j]->get_active )
					{
						push @$opts, $flags[$j];
					}
				}
				$calendar->display_options($opts);
			});
		$vbox3->pack_start($toggles[$i], TRUE, TRUE, 0);
	}
	foreach (@flags)
	{
		$_ =~ s/\s/-/g;
		$_ = lc($_);
	}
	# 폰트 교체 버튼 달력 전체의 폰트를 교체할 수 있다. 
	# Build the right font-button
	$button = Gtk2::Button->new('Font...');
	$button->signal_connect( 'clicked' => sub {
			calendar_select_font($_[1]);
		}, $calendar );
	$vbox2->pack_start($button, FALSE, FALSE, 0);

	#
	# Build the Signal-event part.
	# 여기는 시그널 이벤트 창이다. 
         # 위에서 날을 클릭하거나 달을 바꾸는 작업이 여기서 display 된다.
	$frame = Gtk2::Frame->new('Signal events');
	$vbox->pack_start($frame, TRUE, TRUE, DEF_PAD);

	$vbox2 = Gtk2::VBox->new(TRUE, DEF_PAD_SMALL);
	$frame->add($vbox2);
  
	$hbox = Gtk2::HBox->new(FALSE, 3);
	$vbox2->pack_start($hbox, FALSE, TRUE, 0);
	$label = Gtk2::Label->new('Signal:');
	$hbox->pack_start($label, FALSE, TRUE, 0);
	$signals{curr} = Gtk2::Label->new('');
	$hbox->pack_start($signals{curr}, FALSE, TRUE, 0);

	$hbox = Gtk2::HBox->new(FALSE, 3);
	$vbox2->pack_start($hbox, FALSE, TRUE, 0);
	$label = Gtk2::Label->new('Previous Signal:');
	$hbox->pack_start($label, FALSE, TRUE, 0);
	$signals{prev} = Gtk2::Label->new('');
	$hbox->pack_start($signals{prev}, FALSE, TRUE, 0);

	$hbox = Gtk2::HBox->new(FALSE, 3);
	$vbox2->pack_start($hbox, FALSE, TRUE, 0);
	$label = Gtk2::Label->new('Second Previous Signal:');
	$hbox->pack_start($label, FALSE, TRUE, 0);
	$signals{prev2} = Gtk2::Label->new('');
	$hbox->pack_start($signals{prev2}, FALSE, TRUE, 0);

	$bbox = Gtk2::HButtonBox->new;
	$vbox->pack_start($bbox, FALSE, FALSE, 0);
	$bbox->set_layout('end');

	$button = Gtk2::Button->new('Close');
	$button->signal_connect( 'clicked' => sub {
			Gtk2->main_quit;
		} );
	$bbox->add($button);
	$button->set_flags('can-default');
	$button->grab_default;

	$window->show_all;
}


Gtk2->init;

create_calendar;

Gtk2->main;

exit 0;


위에서 보면 $calender 객체를 사용하여 달력을 효율적으로 사용할 수 있다.

my ($year, $month, $day) = $calendar->get_date;

위의 작업은 선택한 날의 년, 월, 일을 얻게 해주는 작업으로

달력모듈 사용중 가장 많이 사용되지 않을까 싶다.

이건 하나의 예제 임으로 더 세부적인 동작을 알기 위해서는

http://gtk2-perl.sourceforge.net/doc/pod/Gtk2/Calendar.html

여기서 확인 바란다.


나의 경우에는 gtk2+로 다이어리를 만들어야 했기에 필수적으로 사용했지만

어디까지나 모듈을 사용하는것이라

세부적인 수정이 어렵다는 점에 아쉬움이 남았다.




하지만 이정도면 쓰는데 무리는 없을 듯!


flex에서 기본적인 달력모듈은.. 환상적이긴 했지만 말이다 ... -ㅁ-;
신고
Trackback 0 Comment 1
2009.03.14 04:30

ID 및 PASSWORD 인증 설정


- Id와 비밀번호 인증 설정하기



여러 인증방법을 생각해보다가... MD5 hash + base64 를 선택했다.

perl에는 Digest::MD5 모듈이 존재함으로 쉽게 MD5 hash가 쉽게 설정 가능하다.

거기다 코어모듈이니 설치할 필요도 없으니 금상첨화 !!

밑의 두 방법중 하나를 선택하여 $data에 값을 넣고 모듈을 사용하면,

원하는 값으로 변환된다.
 # Functional style
 use Digest::MD5 qw(md5 md5_hex md5_base64);

 $digest = md5($data);
 $digest = md5_hex($data);
 $digest = md5_base64($data);

 # OO style
 use Digest::MD5;

 $ctx = Digest::MD5->new;

 $ctx->add($data);
 $ctx->addfile(*FILE);

 $digest = $ctx->digest;
 $digest = $ctx->hexdigest;
 $digest = $ctx->b64digest;


이제 인증부분을 처리하는 방법에 대해서 한번 생각해보자.

첫번째, id와 비밀번호에 아무값도 입력되지 않았을 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$id =~ s/ //g; #스페이스 공백 제거
if($id eq ''){
	show_message_dialog($window, #에러메세지 출력
	$m_type->{'nick'},		
	$error_msg{id_empty},
	'ok');
} elsif($passwd eq ''){ show_message_dialog($window, $m_type->{'nick'}, $error_msg{pw_empty}, 'ok'); }

간단하게 $id 부분만 공백을 제거했는데

특수문자 사용으로 문제가 될 경우에는 위쪽에 치환구문에서 제어 가능하다.


웹상이 아닌 시스템에서 동작하는 레벨은 데이터 베이스를 연동한 것도 아니고...

마땅히 취약점이 없는 듯 했다. (나야 다 알고 있지만...)




두번째, id가 존재하지 않을때

id가 존재하는지에 대한 여부는

입력한 ID의 폴더가 존재하느냐 존재하지 않느냐에 따라서 결정된다.

ID의 폴더는 MD5 hash + base64 사용하여 해쉬를 시켜 폴더이름을 만들었으며,

파일안에 있는 userinfo.dat 파일을 읽어오도록 설정하였다.

폴더가 없을시 아래 문구를 출력한다.




세번째, id는 존재하는데 password가 맞지 않을 때

ID가 존재한다면 password가 저장된 userinfo.dat 파일을 읽어와서

사용자가 입력한 패스워드와 비교해서 맞을때만 인증 되도록 한다.

그렇지 않을시에는 아래와 같은 문구를 출력한다.



팁으로 위의 두 창의 내용대로 문구가 출력된다면,

이런경우는 ID를 유추할 수 있으므로,

"ID 또는 Password가 틀렸습니다" 라는 문구가 옳다.




개인적인 생각으로 만들고 정리해 본 터라

뭔가를 많이 빠뜨린 느낌이 든다.

입력값의 길이 설정은 id 와 password 입력창에서 제어가 가능하고,

로컬상에서는 마땅히 더 설정할 꺼리가 있으려나?

부족한 부분이 있다면 댓글좀 달아주세요^^




JEEN님이 소개해주신 id와 password을 편리하게 제어하는 모듈인

FormValidator::Simple 도 다음에 기회가 된다면


연구해 봐야 할 듯.



이번 포기 사유는....


기본 CGI 예제에다가 의존모듈이 많고, 윈도우 설치가 계속 에러뜨는 관계로 인해...

ㅠ_ㅠ
신고
Trackback 0 Comment 0
2009.03.10 03:53

이미지를 입혀보자 (Gtk2::Rc)


프로그램을 만들면서 배경이미지나 프레임에 들어가는 색을 입히는 작업도 중요하다.

밋밋한 회색 바탕을 광적으로 좋아하지 않는다면 말이다.



그래서 오늘 소개하고자 하는것은 Gtk2::Rc라는 모듈에 대해서 소개해보겠다.

처음에 Rc를 보고 엥? 이것이 무엇의 줄임말일까? 뭐지? 뭐지? 혼자 끙끙대다가...

확~ 떠오르는것이 있었으니 Resource!! 

그렇다. C로 작업할때도 이미지를 설정할 때 

리소스 파일( 파일명.rc)을 만들었던 기억이...



그러면 먼저 예제화면부터 보고 시작을 해보겠다.

이것은 gtk-study 가이드에 있는 샘플 프로그램으로써 Gtk2::Rc 가 적용되지 않는 화면이다.





이 프로그램은 소켓을 사용하여 슈렉에 나오는 멤버 shrek 와 donky가 서로 채팅을 할 수 있는 프로그램이다.

전체적인 느낌이 나쁘진 않지만 뭔가 빠진 느낌이 든다.

기왕 프로그램이니 배경화면도 그리고 채팅창도 버튼도 조금 이쁘게 꾸며보고 싶을 것이다.

그러면 소스에!! 단 한줄!!



이 한줄을 추가시킨 뒤 파일을 다시 한번 실행시켜보자




어떤가 전체 배경과 색 그리고 버튼의 이미지까지 예쁘게 변했다.

gtk모듈을 사용할 때 단 한줄로 이런것들이 가능하지만

사실 한줄의 의미는 

gtkrc라는 파일을 포함시킴으로 여기에 설정된 이미지와 각 프레임에 대한 설정들을

적용을 시키는것으로 gtkrc파일에는 설정들이 꼼꼼하게 담겨져 있기에 가능한 것이다.



중요한것은 이런것이 있다는것을 알게 됨으로써

Gtk2에서 이미지 적용이나 여타 다른 부분들은 

전혀 문제없다! 라는것을 잘 상기시키기 바란다^^




- 참고사항

- Gtk2-Perl - Table of Contents

- Gtk2-Perl Study Guide

신고
Trackback 0 Comment 0
2009.03.03 02:13

Perl diary - 세번째 이야기


기본적인 배너가 필요하여 포토샵으로 재빠르게 작성해 보았다.

20분 정도 걸린듯... 후다닥 만든것 치고는 꾀 잘 만들어 졌다는 느낌이 든다.


프로그램 코드를 짜는것과 이미지를 만드는것은 

무에서 유를 만들어내는 창조적인 작업이라는 점에서 동일하다.


예전에는 살아가면서 악기 하나는 꼭 배워둬라 하고 옛 어른들이 말씀하셨는데

나는 프로그래밍은 꼭 하나정도는 배워둬라 라고 이야기 하고싶다.


자신이 쓸 프로그램을 자신이 만든다는것은 얼마나 흥미로운 일인가? ^^



시간 출력과 상태 BAR를 연동하여 어디까지 출력되었는지 알 수 있도록 수정을 하였다.

아무리 봐도... 레이아웃의 이미지를 씌우지 않는 이상은 상용적인 다이어리 feel이 나지는 않을듯...




신고
Trackback 0 Comment 0
2009.02.28 23:04

Perl diary - 두번째 이야기



다이어리를 세부적으로 조금씩 고치고 있다.

하루에 시간을 정해서 몇개의 파일만 슥삭슥삭 고치고 있는데...

너무 많이 고쳐버리면 머리 아프니 적당한 선 까지만 수정하곤 한다.


이전에 MP3 Player 코드가 너무 막코딩이라

리팩토링.... 

이전의 코드를 뒤엎어서 다시 코딩을 했다.




외관적으로 별로 바뀐것은 없지만

세부적인 안의 내용들은 많은 변경이 있었다.

잘보면 메뉴도 떡하니 있는...


달력을 더블클릭을 하게 되면 해당 날짜로 접근해서 파일을 읽어오기까지!!

Information에 현재 Play 되고 있는 시간과 플레이가 끝나면 다음곡으로 넘어가는 것까지 구현!


완성도가 점점 높아지는듯... 

이제 메인창 구성에 대해서 신경써봐야 겠다.



ALL 수작업 중이지만 비주얼 베이직 삘이 나는 이유는 뭘까??

나중에 겉을 좀 이쁘게 꾸며야 고급스러워질 듯...
신고
Trackback 4 Comment 0
2009.02.26 02:19

Perl 다이어리??

Perl 다이어리를 하나 만드려고


예전에 손을 땠던 gtk를 다시 잡고 있다.

다시 감잡는데만 꾀 많은 시간을 투자 한 듯...


체크박스를 출력할 때 처음부터 출력한 형태로 나오게 하고 싶었는데...

막상 어떻게 해야할지 감이 오질 않았다.


gtk2에 대한 스터디북을 보면 예제와 설명밖에 없어.. 

버튼에 대한 레퍼런스를 이리저리 찾던 중 


사실;; 봐도 깅가밍가해서.. 하나씩 테스트를 시도했다.

윽.. 의외로 간단...

$check_button->set_active (TRUE);

이 TRUE를 몰라서 헤메다니.. 하아;;



그리고 달력을 넣으려니...



Gtk2::Calendar->new;

이런것이 떡하니 버티고 있으니 하하하 좋다~ㅋㅋ



휴;; 하루동안 열심히 달렸더니 대략의 틀은 나왔음...;




왠지.. 이제까지 만들었던것을 

합쳐놓은 듯한...조잡한 느낌이 든다...


새로운 것이라곤 캘린더 뿐 ㅡ.ㅠ

URL을 지워야 되는데 쳇;;

일단 구글 프로젝트에 커밋!!



padre 정말 좋네요~^^


번역해 주신 keedi님 감사합니다^^
신고
Trackback 0 Comment 0
2008.11.23 16:03

perl을 사용한 HTML Parser


얼마전에 KISC에 놀러갔더니 

카페 스텝분이신 이창민(miniuslab)님이 html_parser을

만드신 것을 보고 영감을 얻었다.



perl로 만들어도 괜찮겠다 싶어서...

어제 gtk를 사용하여 약 1시간정도만에 후다닥 만들어보았다 ㅋㅋ (나는 따라쟁이 ;;)

사실... 원리를 아시는 분에게는 이정도야 껌이라고 하실듯...

LWP::Simple 모듈을 사용하면... 금방 만들어 진다..

헤더정도 따위는 없....


처음 실행한 메인화면이다.

타이틀 아이콘 고르는것에 10분이상 투자를 했다.. 결국 파란 별을... ㅡㅡ;



gtk2_textview.pl 을 참고해서 만들었으며

Editable 같은 옵션들이 맘에들어 그대로 남겨 두었다.

나같은 경우에는 URL로 소스를 먼저 얻은 후에, 

정규식을 사용해서 다시 추출을 하도록 만들었는데...

한번 테스트를 해보자.



막상 만들고 보니 Entry 창을 너무 작게 만들어서 url이 짤리는것 것이 아쉽다.

정규표현식 문법이 틀리거나 , URL의 형식이 맞지않게 입력되면 경고창을 띄운다던지.. 

그런 세부적인 코드들은 따로 개선을 해야될 듯 하다.


약 200줄정도의 코드로 이런 프로그램을 만들 수 있는 perl이 대단하다. (더 줄일수도 있겠지만..)

C로 만들었으면...

상상이 안가는...1人...
신고
Trackback 0 Comment 0
2008.11.13 09:54

음악을 들어보자 #5


MP3 player을 만든다고 한지가 꾀 지난것 같은데...

미루고 미루다 어제 조금 손을 보았다.


골머리를 썩히던 label의 text 변경도.. 어제 대략적인 감을 잡고

볼륨조절과 Mp3 Name 변경도 가능하게 되어

대략적인 기능들은 구현이 모두 끝난듯 하다.

왠지 허전한 느낌이 들어 그림을 하나 넣어봤는데...

완소님을 넣어놔서 그런지..

보는 내가 더 암울 해지는구나 ㅠ.ㅠ

소스공개하려고 만든 프로그램이지만...

짜는 동안 귀차니즘에 빠져 막코딩으로 들어선 이유로...

공개할 마음이 사라졌....





사실 랜덤 모드는 훼이크 ;;


시간날 때 랜덤 모드를 조금 손봐야 할듯...
신고
Trackback 0 Comment 5
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
2008.10.16 21:15

음악을 들어보자 #4


간만에 시간이 남아서 Mp3player을 만드는 작업을 하였다

Keedi님의 조언대로 File::Find를 넣어서 작성

CPAN의 SYSNOPSYS의 코드를 이해 못해 고생을 했다.

    use File::Find;
    find(\&wanted, @directories_to_search);
    sub wanted { ... }

부족한 느낌이 들어 적절한 예제가 있는 코드로 탐색을 시작했다.


http://www.perlmonks.org/index.pl?node_id=217378

http://world.std.com/~swmcd/steven/perl/pm/find.html


영어의 압박이 있었지만 

위의 두 예제를 보면 File::Find에 대한 적절한 예제를 확인 할 수 있다.


수정된 모듈 버전이 0.2로 올랐다는... ㅡ_ㅡ;


- mp3list.pm

package mp3list;
use Exporter;
use strict;
use vars qw( @ISA @EXPORT_OK $VERSION ); 
use Cwd;
use File::Find;
@ISA = qw( Exporter );
@EXPORT_OK = qw(folder_name);
$VERSION = '0.2';

sub folder_name {
	my $folder = shift;
	my @list;
	my $cwd = fastcwd()."/$folder";
	find(\&findmp3,$cwd);
	sub findmp3{
		push @list,"$cwd/$_" if(m!.+\.mp3!);
	}	
	#print join "\n",@list; 
	return @list;
}

1;

folder_name함수는 인자값으로 폴더안의 파일들 중 

확장자가 mp3인  파일만 골라서 @list에 저장 후 리턴한다.




이전에 만들었던 전체틀을 바탕으로 재생버튼을 클릭하면 음악이 나오는 프로그램을

대략 구현은 되었지만... 실시간으로 재생시간이 나온다거나.. 

곡 리스트가 바뀌는 부분 등이 구현이 까다로워 미루고 미루고 있다..


조금 더 분발을...
신고
Trackback 0 Comment 0