[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

"改进" pydict



也来凑个热闹吧

我不知道有多少人象我一样喜欢在console下工作
反正我觉得我用pydict的次数比stardict多,而且是在console下运行它

不过pydict在debian unstable上开始出现一些问题:
- 在python 2.3上会报告编码(encoding)问题――这是python 2.3的一个改动
- 在新的pygtk上import pygtk会报告Can't open display,而在老版本上没有这个问题
- console模式下的输入栏编辑功能很弱,也没有历史功能
- console模式下英翻中或者中翻英两个模式重入都会导致死循环(比如不小心在-c模式下又敲了一个-c)

(以下修改均针对源代码包打过debian patch之后进行)
第一个问题很好修正,看一下python 2.3的兼容性说明就知道了: 
在dict.py第二行加上字符串编码声明,我用的是ISO8859

#!/usr/bin/env python
# -*- coding: ISO8859 -*-
#-------------------------------------------------
# this is a program that utilize the library of xdict.
# Made by Daniel Gau <plateau@wahoo.com.tw>
#-------------------------------------------------

第二个问题俺是难得去深究到底pygtk哪里变化了,我学习gftp的做法将text版本和gtk分开了
由pydict.sh这个shell包装决定调用哪一个,当DISPLAY环境变量不为空时调用gtk版本,否则调用text版本:
#!/bin/sh
if [ "$DISPLAY" = "" ]; then
   exec pydict-text
else
   export PYTHON_PATH=/opt/gnome/lib/gnome-python:$PYTHON_PATH
   LANG=zh_CN.gbk LC_ALL=zh_CN.gbk exec pydict-gtk
fi 

第三个问题我们可以通过引入GNU readline库来增强,我们就拥有可以象bash命令行那样的编辑和历史功能了
它自带结合了GNU history库,readline的python版本是python自带的
问题在python里面import readline后用help(readline)看不到用于读取一行输入的readline()
翻了一下Python Standard Library,发现导入readline后input()和raw_input()就自动变为增强版本了!
于是只需要在dict.py前部添加一个import readline就搞定了
(当然我们还可以用readline.read_history_file()和readline.write_history_file()来在多次运行间保留历史)

最后一个问题应该是个bug, 将console_e_dict和console_c_dict两个函数里面
两处while	l段最后的inp = raw_input('word:')的缩进减小一层即可


Reply to: