Tkinter窗口在屏幕居中的问题

为了让程序窗口在不同的平台和计算机上都能良好的显示,需要考虑:

1. 窗口的大小

2. 窗口的位置

对于第一点,因为默认字体不同,应该尽量避免固定长宽,而让geometry manager(图形管理器)自己去计算所需的大小。但可以设置各个部件之间的间隙大小。

对于这一点,我还想提一下tkinter中的entry和text这两个widget,他们的height和width都是表示可以输入的英文字数,而不是像素值。只有这样,同样的文本内容,才可以在windows、linux下展现一致。而不会windows下在A处换行了,而ubuntu却在B处换行。

Tkinter的窗口屏幕居中有点烦人,没有现成的method,但我找到了一种可行的方法。简单说明:

1. 屏幕的分辨率是非常容易获取到的,直接通过root.winfo_screenwidth()、root.winfo_screenheight() 继续阅读Tkinter窗口在屏幕居中的问题

Tkinter在Ubuntu设置窗口图标遇到的问题

使用Tkinter Package来开发Python GUI程序是非常迅速的,但是它的一些细节不太完美。

在windows环境,设置窗口图标只需要一行代码:

root.iconbitmap(default='myicon.ico')

但这行代码在Ubuntu上无法正常工作,提示myicon.ico not defined。

实际上,我在ubuntu上将图标换成一个x bitmap,依然无法正常工作。

解决在Ubuntu和Mac上出现的这个问题:

1. 安装PIL(python imaging library),支持更多的图像格式,建议制作gif格式64×64做为图标

2. iconbitmap函数封装了tk的iconbitmap窗口消息,我们换成使用Tkinter一个未封装的iconphoto消息

3. windows和linux可以使用同样的代码,也可以根据os.name分支

 

安装PIL

PIL的地址是:http://www.pythonware.com/products/pil/,我选择的是最新的1.17

下载解压之后,还不能立即安装,执行:

apt-get install python-dev

apt-get install libjpeg-dev

前者提供需要的头文件,后者安装了所需的jpeg decoder。

然后,在setup.py中跳到214行

add_directory(library_dirs, "/usr/lib")

在它前面添加:

add_directory(library_dirs, "/usr/lib/i386-linux-gnu")

参考: http://stackoverflow.com/questions/8479344/pil-encoder-jpeg-not-available

随后即可正确安装:

./setup.py build

./setup.py install

我们的python代码可以这样写:

from ImageTk import PhotoImage
icon = PhotoImage(file='icon.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)

可以看到这里是发送的window message iconphoto。

windows下效果:

tkinter-icon-windows

Ubuntu VPS上截图:

tkinter-icon-ubuntu

尝试解决Google站长工具DNS错误提示

我的域名www.fachun.net,一直使用DNSpod的免费服务。

前些日子,google站长工具提示DNS错误,一直没有足够重视,那时候提示错误率5%。

后来发现Google蜘蛛来访、更新索引越来越慢、索引数量也不增长,终于意识到问题严重性。

这个网站在只有几万专辑、页面极简陋时,就曾经实现每天覆盖上百个国家的访客,Google索引超过60万个页面。

但现在Google却一周几乎不更新首页,索引仅仅2万个页面!

dns-error

在站长工具查看记录,发现DNS解析错误率最高的时候,竟然超过20%!

如果是做全球性的网站,最好考虑升级DNSpod收费服务,或者换其他的DNS服务商。

现在我临时更换免费的he.net试试,以观后效。

在  https://dns.he.net/ 注册,并且添加相应的A记录。

在entryDNS注册,并且添加A记录。 https://entrydns.net/

然后去修改域名首选DNS为ns1.he.net

fachun.net.dns

因为这个低端vps没有可用的IPv6地址,我也正在考虑新买一个linode VPS。

禁止YisouSpider访问站点

下午偶然发现有IP来访异常,如下图, 前面6个IP都被封过了:

yisou_spider

经查询,前面几个IP是阿里云的。

在apache的日志中查看对应IP的记录,发现user-agent是YisouSpider,属于阿里一个叫“一搜”的产品。

它是做电影搜索的,但我的网站: http://www.fachun.net只提供音乐内容。

这些爬虫的访问不会给我带来任何好处,还占用系统资源和带宽。可以禁止它抓取页面。

在robots.txt中编辑:

User-agent: YisouSpider   
Disallow: /

然后到urls.py中添加对应的url:

url(r'^robots.txt$', TemplateView.as_view(template_name="robots.txt",
content_type='text/plain; charset=UTF-8')),

重启apache即可。 http://www.fachun.net/robots.txt

实际上,更加自律的爬虫,一般都是晚上服务器空闲的时候,才会来大量抓取内容。

一搜的爬虫似乎应该更加自律一点。

Ubuntu VPS配置轻量级图形桌面LXDE和VNC

前几天我买了个Windows VPS,用于上传文件,1 TB流量很快就用尽了。

为了省钱,今天又买了一个Ubuntu VPS,有2TB的流量,价格比winVPS还便宜。

为了方便地用浏览器上传,而无需额外编码,需要安装图形桌面。

LXDE是首选,它占用资源很少,只需几十MB内存。

1. 配置lxde和vnc server

安装x window:

apt-get install xorg

安装lxde:

apt-get install lxde-core

安装svn server:

apt-get install tightvncserver

第一次运行vnc server生成配置文件,需要输入密码:

tightvncserver :1
tightvncserver -kill :1

编辑~/.vnc/xstartup文件,在尾部添加:

lxterminal &
/usr/bin/lxsession -s LXDE &

启用vnc server:

vncserver -geometry 800x600

2. 下载vnc viewer

在这里下载: http://www.realvnc.com/download/viewer/

打开客户端,输入IP:590x,这里x是x桌面的编号:

vnc-viewer

连接后输入密码,就可以进入桌面了。

3. 解决中文乱码

VPS默认locale是en,程序在创建文件和文件夹的时候会出现乱码。

cd /usr/share/locales
./install-language-pack zh_CN
apt-get install language-pack-zh-hans
apt-get install ttf-wqy-zenhei 
vi /etc/default/locale    
#修改为
#LANG="zh_CN.UTF-8"
#LANGUAGE="zh_CN:zh"

关闭putty,重新打开shell,执行locale,就可以看到语言设置是中文了

4. 接着解决putty中文乱码

在putty的选项中设置: window -> Appearance -> Font Settings
字体选择“新宋体”,脚本选择“中文GB2312”,
window -> Translation -> Remote Character Set选择 UTF-8,
勾选下面的两项:
1. Treate CJK …
2. Caps Lock …
在windows下写的python脚本,所有print输出编码为gbk的字符串,都应该修改为编码为utf8。
 

测试前面写的Django数据防爬程序

写一小段测试代码来测试前面写的数据防爬程序,不停访问某个页面:

实际上REMOTE_HOST是服务器根据自己DNS解析得到的,但我这里测试它能否直接在header中伪装:

import httplib  
import sys
import datetime
import random

headers = {'User-Agent': 'Googlebot/2.1 (+http://www.google.com/bot.html)',
           'Connection': 'keep-alive',
           'REMOTE_HOST': 'www.googlebot.com'}

while True:
    conn = httplib.HTTPConnection("www.fachun.net")
    conn.request(method='GET', url='/album/972-Nine%20Objects%20Of%20Desire/?' + str(random.random()), headers=headers)
    response = conn.getresponse()
    print response.status, datetime.datetime.now()
    if response.status == 403:
        print 'forbidden error, exit'
        sys.exit(-1)
    conn.close()

test-anti-spider-app
数据库中的内容: 继续阅读测试前面写的Django数据防爬程序