程序员要不要写图形界面,我认为是会写简单界面,没必要追求特效。而Tk作为一个经典的GUI库,具有学习简单,代码少,使用方便,界面简单简洁等特点,非常适用于行业软件的开发。
事件驱动编程是编程中的一种模式,区别于顺序执行。监控事件,如果事件发生,则触发函数。而GUI编程非常有利于帮助大家理解事件编程。
程序员要不要写图形界面,我认为是会写简单界面,没必要追求特效。而Tk作为一个经典的GUI库,具有学习简单,代码少,使用方便,界面简单简洁等特点,非常适用于行业软件的开发。
一个网友,装了好几天的Tk,没有安装上。作为一个经典模块,会有这样的问题实在可惜。 所有的模块都不推荐解压+拷贝的安装模式,这不能解决含c代码的模块以及模块的依赖性问题。 我推荐ppm+cpanm 这2种方式,如果安装不上,我就认为这个模块的作者不够负责,前提是你要配置好这2个环境。 如果懒得配置环境,推荐使用草莓Strawberry Perl ,自带cpanm.
cpanm Tk 就可以安装成功。
帮花瓣下载,添加一个简单的界面。 界面如下,
#!perl -wuse strict;use Encode qw(decode encode);use Tk;my $mainwin=new MainWindow;$mainwin->title("HUABAN DOWNLOADER");#在mainwin上添加一个Frame1my $board_idF=$mainwin->Frame();$board_idF->pack(-expand=>1,-fill=>"both",-side=>"top");#在Frame1 上添加一个labelmy $board_idL=$board_idF->Label(-text=>"The board id:",-width=>50,-anchor=>'w');$board_idL->pack(-side=>"left");#在Frame1 上添加一个文本框Entrymy $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上增加Frame2my $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 增加一个Buttonmy $dir="";$dir_F->Button(-text=>"browse...",-width=>15, -command=>{&selectdic})->pack(-side=>'left');#Frame2 增加一个Labelmy $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,CONTACTmy $buttonF=$mainwin->Frame();$buttonF->pack(-expand=>1,-fill=>"both",-side=>"top");$buttonF->Label(-text=>"contact: perlcoder weixin gongzhonghao")->pack(-side=>'left');{$dir = $mainwin->chooseDirectory();if(defined $dir){$dirL->configure(-text=>$dir)}}{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,语言都是想通的。深入了一门语言,再去学其他语言就会轻松很多, 熟悉了一个模块的使用理念,不管该模块在哪个语言中,你都能很快掌握。