|

楼主 |
发表于 2017-7-14 09:36:56
|
显示全部楼层
作者:知乎用户
链接:https://www.zhihu.com/question/26532408/answer/37333098
来源:知乎
Mac 系统下的 IDLE 不能输入中文有两种情况:第一种情况是在 IDLE 下中文输入法失效,无法显示出中文输入法的选词框。在这种情况下打开 IDLE 时会显示一段警告:"WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable."<img src="https://pic3.zhimg.com/265fc4f59867ec7c2291307b525c4142_b.png" data-rawwidth="529" data-rawheight="29" class="origin_image zh-lightbox-thumb" width="529" data-original="https://pic3.zhimg.com/265fc4f59867ec7c2291307b525c4142_r.png">这是因为 IDLE 界面使用的 Tkinter 图形库需要依赖 Tcl/Tk,而 Mac 系统自带的 Tcl/Tk 版本太低,造成了不兼容的问题。(这是因为 IDLE 界面使用的 Tkinter 图形库需要依赖 Tcl/Tk,而 Mac 系统自带的 Tcl/Tk 版本太低,造成了不兼容的问题。(IDLE and tkinter with Tcl/Tk on Mac OS X)解决方法是下载安装新版本的 Tcl/Tk,下载地址:ActiveTcl Downloads。而如果有使用 Homebrew 的话,可以用 brew install tcl-tk 安装新版本的 Tcl/Tk(如果有用 Homebrew 来安装 Python,可以在安装时加上 --with-tcl-tk 选项来同时安装 Tcl/Tk:brew install python --with-tcl-tk)。第二种情况是在 IDLE 的交互模式里输入中文,会提示 "Unsupported characters in input"。根据 Typing UTF-8 characters in IDLE 所说,这是因为在交互模式下的 IDLE 里输入非 ascii 字符时,IDLE 会根据电脑上的语言环境设置来判断编码,然后用这个编码对输入的非 ascii 字符进行转换后才能运行。测试后发现,不管我把 Mac 系统的语言设置成中文还是英文,在直接运行 IDLE 的时候,这个编码一直是 'us-ascii',并不支持对非 ascii 的中文进行转换,于是就报错了。需要将其更改为 'utf-8' 编码才能支持输入中文。之前我在 StackOverflow 上找到了一个解决方法(python - UnicodeEncodeError with csvwriter),其通过在 IDLE 的源码中插入一行代码来使得 IDLE 在交互模式下使用的编码强制更改为 'utf-8' 。但后来我发现一个更为简单的方法,设置 IDLE 的环境变量 "LANG" 为 "en_US.UTF-8",就能使 IDLE 在交互模式下使用的编码更改为 'utf-8'。更改 IDLE 的环境变量有多个办法,而我采用的方法如下:1. 对 IDLE.app 程序文件右键打开包内内容,打开编辑其中的 IDLE.app/Contents/MacOS/IDLE 文件。2. 在大概第 24 行的 os.environ["PYTHONEXECUTABLE"] = executable 代码上方加入一行代码:os.environ["LANG"] = "en_US.UTF-8"
<img src="https://pic3.zhimg.com/58753ab82af3b7670e89f65cc060ca82_b.png" data-rawwidth="383" data-rawheight="79" class="content_image" width="383">3. 保存文件,重新打开 IDLE 就可以输入中文了。3. 保存文件,重新打开 IDLE 就可以输入中文了。(保存文件时可能会遇到权限问题,可以试下用 Sublime Text 等第三方编辑器来编辑这个文件,保存的时候应该会跳出窗口来让你输入用户密码,然后就能保存成功了。)我原来采用的更改 IDLE 源码的旧方法的步骤如下:1. 首先要找到你电脑上 IDLE 运行的 Python 的自带库的位置,可以通过以下命令获得 os.pyc 的路径,其所在文件夹就是 Python 自带库的位置。import os
print os.__file__
2. 在此路径下找到 idlelib 文件夹,打开其中的 IOBinding.py 文件。在大概第68行的 encoding = encoding.lower() 代码下方加入一行代码:encoding = "utf-8"
<img src="https://pic4.zhimg.com/6f570ad493d0792336638053f6e0364b_b.jpg" data-rawwidth="513" data-rawheight="231" class="origin_image zh-lightbox-thumb" width="513" data-original="https://pic4.zhimg.com/6f570ad493d0792336638053f6e0364b_r.jpg">3. 保存文件,重新打开 IDLE 就可以输入中文了。3. 保存文件,重新打开 IDLE 就可以输入中文了。 |
|