perl模块推荐18-图形界面编程利器Tk

摘要

程序员要不要写图形界面,我认为是会写简单界面,没必要追求特效。而Tk作为一个经典的GUI库,具有学习简单,代码少,使用方便,界面简单简洁等特点,非常适用于行业软件的开发。

摘要

事件驱动编程是编程中的一种模式,区别于顺序执行。监控事件,如果事件发生,则触发函数。而GUI编程非常有利于帮助大家理解事件编程。
程序员要不要写图形界面,我认为是会写简单界面,没必要追求特效。而Tk作为一个经典的GUI库,具有学习简单,代码少,使用方便,界面简单简洁等特点,非常适用于行业软件的开发。

Tk 的安装

一个网友,装了好几天的Tk,没有安装上。作为一个经典模块,会有这样的问题实在可惜。
所有的模块都不推荐解压+拷贝的安装模式,这不能解决含c代码的模块以及模块的依赖性问题。
我推荐ppm+cpanm 这2种方式,如果安装不上,我就认为这个模块的作者不够负责,前提是你要配置好这2个环境。
如果懒得配置环境,推荐使用草莓Strawberry Perl ,自带cpanm.

cpanm Tk
就可以安装成功。

应用

帮花瓣下载,添加一个简单的界面。
界面如下,

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!perl -w
use strict;

use Encode qw(decode encode);
use Tk;

my $mainwin=new MainWindow;
$mainwin->title("HUABAN DOWNLOADER");


#在mainwin上添加一个Frame1
my $board_idF=$mainwin->Frame();
$board_idF->pack(-expand=>1,-fill=>"both",-side=>"top");
#在Frame1 上添加一个label
my $board_idL=$board_idF->Label(-text=>"The board id:",-width=>50,-anchor=>'w');
$board_idL->pack(-side=>"left");
#在Frame1 上添加一个文本框Entry
my $id_VAR=20194339;
my $id_Ent=$board_idF->Entry(-textvariable=>\$id_VAR);
$id_Ent->pack(-side=>'left');


#在mainwin上增加一个Frame ,存放下载图片数目
my $num_F=$mainwin->Frame();
$num_F->pack(-expand=>1,-fill=>'both',-side=>'top');
my $num_VAR=200;

$num_F->Label(-text=>"number of photos to downloaded:",-width=>50,-anchor=>'w')->pack(-side=>'left');
my $num_Ent=$num_F->Entry(-textvariable=>\$num_VAR);
$num_Ent->pack(-side=>'left');



#在mainwin上增加Frame2
my $dir_F=$mainwin->Frame();
$dir_F->pack(-expand=>1,-fill=>"both",-side=>"top");
#在Frame2 增加一个Label
$dir_F->Label(-text=>"Output Dictory:",-width=>50,-anchor=>'w')->pack(-side=>'left');
#Frame2 增加一个Button
my $dir="";
$dir_F->Button(-text=>"browse...",-width=>15, -command=>sub {&selectdic})->pack(-side=>'left');
#Frame2 增加一个Label
my $dirL=$dir_F->Label(-text=>"No dictory Selected.");
$dirL->pack(-side=>'left');

$mainwin->Button(-text=>"Download",-command=>sub{ &download($id_VAR,$num_VAR,$dirL->cget('-text')) })->pack(-side=>'top');
#在mainwin上增加一个bottomF,CONTACT
my $buttonF=$mainwin->Frame();
$buttonF->pack(-expand=>1,-fill=>"both",-side=>"top");
$buttonF->Label(-text=>"contact: perlcoder weixin gongzhonghao")->pack(-side=>'left');
sub selectdic
{
$dir = $mainwin->chooseDirectory();

if(defined $dir)
{
$dirL->configure(-text=>$dir)

}


}

sub download
{

my ($board_id,$num,$directory)=@_;

#print "$directory\n" x100;


use Mojo::UserAgent;

use Mojo::UserAgent::CookieJar;
my $ua = Mojo::UserAgent->new();
my $browser='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.2.2000 Chrome/30.0.1599.101 Safari/537.36';

$ua->transactor->name($browser);
my $cookie_jar = $ua->cookie_jar;

$ua = $ua->cookie_jar(Mojo::UserAgent::CookieJar->new);

my $num_pic=0;

my $starturl='http://huaban.com/boards/'.$board_id;
my $body;
my $jsonbody;
my ($pin_id,$key);
my ($pngurl,$pngfile);
my $baseurl='http://hbimg.b0.upaiyun.com/';
while(1)
{
$body=$ua->get($starturl)->res->body;
while($body=~/"pin_id":(\d+),.*?"key":"(\S+?)",/msg)
{
($pin_id,$key)=($1,$2);
print $pin_id,"\n";
$pngurl=$baseurl.$key.'_fw658';
#print "pngurl: $pngurl\n";
$pngfile=$pin_id.'.jpg';
if($directory=~/No directory/)
{



}
else
{

$pngfile=$directory.'/'.$pngfile;
}

# $pngfile=$directory?$pngfile:$directory.'/'.$pngfile;
print "$pngfile\n";
$ua->get($pngurl)->res->content->asset->move_to($pngfile);
$num_pic++;
if($num_pic>200)
{
print "you have download 200 Photos\n";
last;
}

}
if($starturl=~/limit/)
{
$starturl=~s/max=\d+/max=$pin_id/;
}
else
{
$starturl.='/?isiv0rfd&max=815376046&limit=20&wfl=1';
$starturl=~s/max=\d+/max=$pin_id/;
}
#print $starturl,"\n";


$ua = $ua->cookie_jar(Mojo::UserAgent::CookieJar->new);


if($num_pic>$num)
{
print "you have download 200 Photos\n";
last;

}
}

}

#让所有的widget 进入事件循环中,等待触发
MainLoop;
我的学习历程

我先学习了几年perl,然后学习了pyhon的tkinter,语言都是想通的。深入了一门语言,再去学其他语言就会轻松很多,
熟悉了一个模块的使用理念,不管该模块在哪个语言中,你都能很快掌握。

补充
书读百遍其义自现。书越读越新,不同的时间读相同的内容可以读出不一样的东西。念念不忘,必有回响。当你下定决心,学习新的知识,一定要全身心,长期投入,直到完全吃透为止。