前言:

笔者不过是一个刚立下flag要学习Python的小白,

(这也是笔者的第一篇网文、知乎文,如果没用,求轻虐),

为此还冲动傻傻地配了一台2019款13寸的MacBook Pro。

电脑配置(作为参考)如下:

MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)

系统:macOS Catalina 10.15.4

处理器:2.4 GHz 四核Intel Core i5

内存:16 GB 2133 MHz LPDDR3

显卡:Intel Iris Plus Graphics 655 1536 MB

-------------------------------分割线-------------------------------

正文:

我们开始这次撞墙之旅吧~~~

事情的经过是这样的,笔者为了学习Python,在网上翻了很多论坛和帖子,配置好了基本环境。

笔者的环境基本是这样:

1、用Homebrew来管理软件。

2、用iTerm2 + Oh My Zsh代替苹果自带的终端。

3、用pyenv来安装管理Python版本,然后安装了Python3.8.2。

4、用PyCharm来当IDE(集成开发环境)。【懵懵懂懂的笔者看了推荐网文,也偷偷安装了VSCode来假装会用】

随后就天真烂漫地开始了Python400集的视频教程。

万万没想到!!!

到了第5课《Python程序格式_缩进_行注释_段注释》时,笔者就卡住了!!!

这节课的标题看起来没啥问题吧?还只是基础理论的讲解。

可偏偏里面老师讲课时用了这段代码来示范,而且还要学生自己敲一遍。

#导入海龟绘图模块
import turtle
t = turtle.Pen()
#这是一个循坏
for x in range(360):t.forward(x)t.left(59)
'''
测试一下段注释
'''

没错,当笔者用PyCharm敲完代码,run一下,呵呵,报错了。

但大致的跟这个差不多:(当时报错的日志没保存,没想过要写这篇文章哈哈哈哈)

Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 36, in <module>import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

重点是提示这个:(大概意思就是缺少一个叫tkinter的模块)

ModuleNotFoundError: No module named '_tkinter'

当时笔者是崩溃的,明明照着老师的来敲,怎么就报错了。

笔者不死心,直接复制课件里面的代码,再run一遍,呵呵,还是报错了。

笔者就更加崩溃了,不过遇到问题,只能迎刃而上啊!

于是开始全网搜这个报错的解决办法。

这才发现原来这不是笔者一个人的问题啊,简直是所有人的问题啊!!!

随后笔者跟着网帖的各种教程去弄,还是不行。

期间还出现了新的报错:(当时报错的日志也没保存)

Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 4552, in _testroot = Tk()File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2263, in __init__self._loadtk()File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2279, in _loadtkraise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)"
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)

这个报错的重点是:(大概意思就是tk版本不匹配)

RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)

翻了很多论坛和帖子才发现造成问题的原因有很多,结果笔者中招的应该是最多的。

笔者总结网上的三大原因(中间还有很多配置原因就不说了):

1、苹果自带的Python2.7.16和tk8.5版本跟另外安装Python3.8.2不匹配。

2、pyenv能安装管理不同版本的Python,但没有管理tcl-tk的功能。

3、安装Python3.8.2后才安装tcl-tk。

-------------------------------分割线-------------------------------

寻求解决方案期间笔者崩溃了好多次,过程很心酸,就不多说了,直接上干货吧!

解决方案:(大家按照步骤一步步来,应该可以解决,心里还是没自信嘻嘻嘻)

1、确保环境是干净的,不管三七二十一,在终端或iTerm里按顺序执行下面的命令吧。

如果你没有安装过任何东西,只是第一次配置环境,可以跳过第一步。(但执行一下也不会有影响,而且来看这篇文章的应该都已经中超了吧红红火火恍恍惚惚)

pyenv versions

#查看已安装的Python版本

pyenv uninstall <version>

#卸载版本号为<version>的Python,把前面查询到的除了system以外的版本都卸载干净

brew uninstall pyenv

#卸载pyenv

rm -rf ~/.pyenv

#清理pyenv残留文件

brew uninstall tcl-tk

#卸载tcl-tk

rm -rf ~/.tcl-tk

#清理tcl-tk残留文件

brew uninstall zlib

#卸载zlib

rm -rf ~/.zlib

#清理zlib残留文件

brew uninstall python

#卸载通过Homebrew安装的Python版本

brew cleanup

#删除程序,所有程序老版删除

至此,电脑的环境应该是干净的了,至少笔者当时就是操作了这么多来确保干净。

2、保证其他软件更新至最新版本

brew update

#更新软件,把所有的Formula目录更新,并且会对本机已经安装并有更新的软件用*标明。

3、安装zlib并设置配置文件的环境变量

brew install zlib

#安装zlib

设置配置文件的环境变量的方法有两种:

第一种:用vi编辑配置文件,手动添加

vi ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,编辑.bashrc配置文件

vi ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,编辑.zshrc配置文件

打开~/.bashrc或者~/.zshrc配置文件后,在文件最后添加以下命令

# For compilers to find zlib you may need to set:
export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib"
export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"# For pkg-config to find zlib you may need to set:
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"

编辑添加后,按esc键,然后手动输入:wq(冒号:也需要输入),以保存并推出编辑模式。

第二种:在苹果自带的终端或iTerm里用以下命令直接添加至配置文件

echo '# For compilers to find zlib you may need to set:
export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib"
export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"# For pkg-config to find zlib you may need to set:
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"' >> ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,把设置zlib的环境变量的命令添加至.bashrc配置文件中

echo '# For compilers to find zlib you may need to set:
export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib"
export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"# For pkg-config to find zlib you may need to set:
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"' >> ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,把设置zlib的环境变量的命令添加至.zshrc配置文件中

#设置zlib的环境变量的命令,具体含义笔者不懂!!!只知道很有用!!!

添加完毕后,执行以下命令或者关闭终端、iTerm窗口重新打开。

source ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,使刚才设置的环境变量命令生效

source ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,使刚才设置的环境变量命令生效

至此,已经安装并设置好zlib的环境变量,至少笔者看到网文的教程是这样的。

4、安装tcl-tk并设置配置文件的环境变量

brew install tcl-tk

#安装tcl-tk(这个就是前面一直说的tk,非常重要!!!)

设置配置文件的环境变量的方法同样有两种:(但只笔者推荐使用第一种)

第一种:用vi编辑配置文件,手动添加

vi ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,编辑.bashrc配置文件

vi ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,编辑.zshrc配置文件

打开~/.bashrc或者~/.zshrc配置文件后,在文件中开头部分(这个最好是放在开头,因为读取配置文件时会先运行,所以不建议使用第二种方法,因为命令添加只会添加至文件最后)添加以下命令

#If you need to have tcl-tk first in your PATH run:
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"#For compilers to find tcl-tk you may need to set:
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"#For pkg-config to find tcl-tk you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"

编辑添加后,按esc键,然后手动输入:wq(冒号:也需要输入),以保存并推出编辑模式。

第二种:在苹果自带的终端或iTerm里用以下命令直接添加至配置文件(不建议使用这个方法,因为命令添加只会添加至文件最后,当然笔者没试过放在最后效果怎么样)

echo '#If you need to have tcl-tk first in your PATH run:
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"#For compilers to find tcl-tk you may need to set:
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"#For pkg-config to find tcl-tk you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"' >> ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,把设置tcl-tk的环境变量的命令添加至.bashrc配置文件中

echo '#If you need to have tcl-tk first in your PATH run:
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"#For compilers to find tcl-tk you may need to set:
export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"#For pkg-config to find tcl-tk you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"' >> ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,把设置tcl-tk的环境变量的命令添加至.zshrc配置文件中

#设置tcl-tk的环境变量的命令,具体含义笔者也不懂!!!只知道很有用!!!

添加完毕后,执行以下命令或者关闭终端、iTerm窗口重新打开。

source ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,使刚才设置的环境变量命令生效

source ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,使刚才设置的环境变量命令生效

至此,已经安装并设置好tcl-tk的环境变量,至少笔者看到网文的教程就是这样的。(记得添加的位置最好在开头部分,提醒四次应该都看到了吧?)

5、安装pyenv并设置配置文件的环境变量

brew install pyenv

#安装pyenv

设置配置文件的环境变量的方法同样有两种:

第一种:用vi编辑配置文件,手动添加

vi ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,编辑.bashrc配置文件

vi ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,编辑.zshrc配置文件

打开~/.bashrc或者~/.zshrc配置文件后,在文件最后添加以下命令

#For Define environment variable PYENV_ROOT to point to the path where pyenv repo is cloned and add $PYENV_ROOT/bin to your $PATH for access to the pyenv command-line utility:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"#For Add pyenv init to your shell to enable shims and autocompletion. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization:
if command -v pyenv 1>/dev/null 2>&1; theneval "$(pyenv init -)"
fi

编辑添加后,按esc键,然后手动输入:wq(冒号:也需要输入),以保存并推出编辑模式。

第二种:在苹果自带的终端或iTerm里用以下命令直接添加至配置文件

echo '#For Define environment variable PYENV_ROOT to point to the path where pyenv repo is cloned and add $PYENV_ROOT/bin to your $PATH for access to the pyenv command-line utility:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"#For Add pyenv init to your shell to enable shims and autocompletion. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization:
if command -v pyenv 1>/dev/null 2>&1; theneval "$(pyenv init -)"
fi' >> ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,把设置pynev的环境变量的命令添加至.bashrc配置文件中

echo '#For Define environment variable PYENV_ROOT to point to the path where pyenv repo is cloned and add $PYENV_ROOT/bin to your $PATH for access to the pyenv command-line utility:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"#For Add pyenv init to your shell to enable shims and autocompletion. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization:
if command -v pyenv 1>/dev/null 2>&1; theneval "$(pyenv init -)"
fi' >> ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,把设置pynev的环境变量的命令添加至.zshrc配置文件中

#设置pynev的环境变量的命令,具体含义笔者都不懂!!!只知道很有用!!!

添加完毕后,执行以下命令或者关闭终端、iTerm窗口重新打开。

source ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,使刚才设置的环境变量命令生效

source ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,使刚才设置的环境变量命令生效

至此,已经安装并设置好pynev的环境变量,至少笔者看到GitHub的pyenv安装说明就是这样的。

6、安装Python3.8.2(截止笔者写完本文的最新版本)并设置默认Python版本

pyenv install -l

#查看可安装的Python版本

pyenv install 3.8.2

# 安装版本号为3.8.2的Python,查看可安装的Python版本后自行选择版本,笔者安装的是Python3.8.2

pyenv global 3.8.2

#通过全局变量设置默认的python版本为3.8.2

至此,已经安装并设置默认Python版本,至少笔者能成功解决Python3.8.2的这个问题。

7、检查环境

(1)

pyenv version

#检查默认的python版本,如果返回以下值即成功

3.8.2 (set by /Users/username/.python-version)

(2)

which python

#检查实际上能够运行命令而不必指定的Python路径,如果返回以下值即成功

/Users/username/.pyenv/shims/python

(3)

python -V

#检查当前使用的Python版本号(注意要用大写的V),如果返回以下值即成功

Python 3.8.2

(4)

which pip

#检查实际上能够运行命令而不必指定的pip路径,如果返回以下值即成功

/Users/username/.pyenv/shims/pip

(5)

pip -V

#检查当前使用的pip版本号(注意要用大写的V),如果返回以下值即成功

pip 20.1.1 from /Users/username/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pip (python 3.8)

pip的版本截止笔者写完本文的最新是20.1.1,如果低于这个版本可以执行以下命令来更新。

pip install --upgrade pip

重点来了!!!重点来了!!!重点来了!!!

干货中的干货!!!干货中的干货!!!干货中的干货!!!

这是笔者最后一个掉进的坑,免得大家也掉坑!!!

笔者翻遍各种论坛和帖子都没有提过这一点,本来看到返回的值不一样时简直面如死灰,但不知道哪里来的灵感让笔者意外操作了这一点,然后所有问题终于迎刃而解了!!!

如果以上检查环境的其中一步或者全部返回的值并不是我们期望的,那么请你再一次执行以下命令。

source ~/.bashrc

#如果用苹果自带的终端,请执行这个命令,使前面我们设置的所有环境变量命令生效

source ~/.zshrc

#如果用iTerm2 + Oh My Zsh,请执行这个命令,使前面我们设置的所有环境变量命令生效

没错!!!干货中的干货只是再一次执行使环境变量命令生效而已!!!

随后笔者再一次检查环境,所有返回的值都正确了。

至此,环境已经检查完毕了。

8、检查tkinter模块运行

idle

#运行IDLE,如果IDLE窗口像下图那样没有任何警告和以红色字体打印的返回的值即成功

python -m tkinter -c "tkinter._test()"

#运行tcl-tk测试窗口,如果看到下图这样的测试窗口显示Tcl/Tk version 8.6即成功

至此,恭喜你,你已经成功正确安装tcl-tk和Python3.8.2了!!!

笔者随后为了验证实际效果,在PyCharm中再一次run这段代码:

#导入海龟绘图模块
import turtle
t = turtle.Pen()
#这是一个循坏
for x in range(360):t.forward(x)t.left(59)
'''
测试一下段注释
'''

终于可以跑这个图形代码了!!!

这不正是感动的感觉吗???

简直要哭好吗!!!

终于可以继续看视频学习啦!!!

紧接而来的想法就是,笔者要记下来,不仅为了笔者自己,也为了其他可能会掉坑里的人。

于是这篇知乎文就诞生了,但也在这里结束了。

感谢前人走出来的路和经验,解决这次的问题也参考了很多老前辈的经验,文章末尾会列出帮助过笔者的帖子和文章。

感谢大家的耐心阅读,希望这个方法对你有帮助。

P.S.

可以留意的事项:

1、想要成功,安装前的环境要足够干净!

2、必须先安装好tcl-tk再安装Python!!

3、让配置文件bashrc和zshrc生效非常重要!!!

参考资料:

西毒:iTerm2 + Oh My Zsh 打造舒适终端体验​zhuanlan.zhihu.com

Mac上安装Homebrew及常用命令​www.jianshu.com

Mac OS下使用pyenv管理Python版本​www.jianshu.com

Unable to install tkinter with pyenv Pythons on MacOS​stackoverflow.com

pyenv install doesn't work with homebrew installed tcl-tk · Issue #1375 · pyenv/pyenv​github.com

MacOS homebrew python 3.8.1 with tcl-tk (properly)​gist.github.comInstalled Python 3 on Mac OS X but its still Python 2.7​stackoverflow.com

Tkinter import error for pyenv Pythons #94​github.comPython not configured for Tk​stackoverflow.com

[SOLVED] Cannot make pyenv work properly · Issue #427 · pyenv/pyenv​github.com

Clarify instructions in readme #481​github.compyenv/pyenv​github.com

path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...相关推荐

  1. mac下查看redis安装路径_干货!win10环境下Redis安装、启动教程

    " 本文详细介绍win10环境下Redis的安装.启动方法." 01 - 下载 Redis项目不正式支持Windows.但是,Microsoft开放技术小组开发和维护一个Windo ...

  2. 有jar包直接加密tcp请求报文_干货 | 终于有人能把TCP/IP 协议讲明白了!

    原标题:干货 | 终于有人能把TCP/IP 协议讲明白了! 如果你还对各类协议归属.作用也都傻傻分不清,那么你有必要详尽了解下 TCP/IP协议了. 一图看完本文 一. 计算机网络体系结构分层 计算机 ...

  3. odp.net连接oracle9i 出错解决_机电工程老出错?机电安装质量通病防治手册,解决常见多发问题...

    机电工程老出错?机电安装质量通病防治手册,解决常见多发问题 近几年来,随着现代的工程数量不断增多,机电安装工程施工内容逐渐增多,工期进度要求异常紧张,但是项目质量管控意识却在逐步下降,机电安装常见性质 ...

  4. 解决在Mac上用pyenv安装python3失败的问题

    背景 前段时间在本地Mac系统上要跑一个python3写的压测脚本. Mac默认安装的是python2, 而且很多软件依赖的也是python2. 为了不影响现有系统其它软件, 当时安装了pyenv来实 ...

  5. qq语音按住ctrl就静音怎么解决_干货!PS超实用去水印方法汇总(图文教程),可解决99%水印烦恼...

    一.内容识别 可以利用"仿制图章工具""修补工具""污点修复画笔工具"等方法可以去掉的水印,我们都可以用"内容识别"功能 ...

  6. 外部表不是预期的格式怎么解决_干货分享|同学,你的论文格式有点不太对啊!...

    转眼又到老师催交毕业论文的日子了, 你的毕业论文怎么样了??? 由于疫情的影响,大家不得不在家里开工 偷偷告诉我,你是不还在对着电脑一坐一天, 抓耳挠腮,发现一天只磨出了几个字 还没开始写的胖友,相信 ...

  7. preparing automatic repair怎么解决_单一窗口插卡登录频繁提示安装IC卡控件的终极解决办法...

    单一窗口插入IC卡登录一直失败,并提示安装最新IC卡控件,很多企业表示已经安装了最新版仍然会出现,如下图: 问题:登录"单一窗口"标准版时,页面出现如图1和图2所示的"请 ...

  8. 不同模块下包重名怎么解决_口臭怎么解决?|盘点不同类型口臭的去除方法

    很多人生活中被口臭困扰,如果患上口臭,很容易影响我们的社交,甚至接吻都会被亲近的人嫌弃.而且有些口臭并不仅仅是单纯的嘴里有味,更有可能是身体健康隐患的信号灯. 口臭其实分两大种,生理性口臭和病理性口臭 ...

  9. win10计算机启动慢,win10启动缓慢如何解决_两种解决win10启动缓慢的方法

    大家是否遇到过win10开机启动缓慢的问题,每回开机有几分钟左右才进入系统,感觉启动速度缓慢,有什么办法给电脑系统一个流畅的操作体验?其实只需要简单设置一下,就可以解决win10启动缓慢的问题,接下来 ...

最新文章

  1. unit2--unit4单元文档
  2. java中接口什么时候用_我什么时候应该在java中使用接口?
  3. Mac配置Java环境变量等
  4. activity的启动窗口
  5. concurrent(四)Condition
  6. 理解 Azure AD 安全默认值设置
  7. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题...
  8. Copy: 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密
  9. 信息学奥赛一本通C++语言——1022: 整型与布尔型的转换
  10. C++ map转为vector
  11. 《圈圈教你玩USB》 第三章 USB鼠标的实现——看书笔记( 2 )
  12. h3c防火墙服务器ip修改,H3C防火墙常用配置命令
  13. 资源下载网站整站资源|建站6万资源数据32G整站下载
  14. 《平衡掌控者 游戏数值战斗设计》学习笔记(一)游戏研发概要
  15. 智能电话机器人--基于 UniMRCP 实现讯飞 TTS MRCP Server
  16. 了解 云原生 和 边缘计算
  17. setStyle 方法封装
  18. 数理统计与数据分析第三版习题 第3章 第5题
  19. 安装 Adblock plus 插件彻底屏蔽Chrome 浏览器上的广告 以及Adblock plus 的使用教程(亲测有效)
  20. 嵌入式单片机基础篇(一)之stm32F1GPIO详解

热门文章

  1. 历久弥新 - 微软万亿市值背后的文化支撑(下)|DevOps案例研究
  2. 坚持一个好习惯该有多难?
  3. C# Memory Cache 踩坑记录
  4. 从明面上学习ASP.NET Core
  5. Metrics, tracing 和 logging 的关系
  6. .NET下使用HTTP请求的正确姿势
  7. .NET Core log4net 使用
  8. Python FastApi:post文件与数据/本地端测试
  9. PHP根据指定url生成二维码图片
  10. Windows之Fiddler抓HTTP和HTTPS请求