bug 经历
今天又遇到了一个奇怪的 bug,因为在前几天我都能正常使用 matplotlib
进行画图,但是今天却不行了,我还很好奇是不是我的代码有问题,就想着运行以下前两天写的画图代码,发现也报错了,报错信息如下:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier'
为什么只有这一行呢?因为我现在想复现那个bug又复现不了了(复现之后它变成了别的bug了),不过大致报错信息可以看:https://github.com/matplotlib/matplotlib/issues/24374
,应该是差不多的,可能有的小伙伴上不了 github
,我这里也把 github 上的报错信息复制过来:
Traceback (most recent call last):
File "dt.py", line 14, in <module>
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 2817, in scatter
__ret = gca().scatter(
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 2272, in gca
return gcf().gca(**kwargs)
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 865, in gcf
return figure()
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 809, in figure
FigureClass=FigureClass, **kwargs)
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 324, in new_figure_manager
_warn_if_gui_out_of_main_thread()
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 314, in _warn_if_gui_out_of_main_thread
if (_get_required_interactive_framework(_get_backend_mod())
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 217, in _get_backend_mod
switch_backend(dict.__getitem__(rcParams, "backend"))
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 262, in switch_backend
switch_backend(candidate)
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 282, in switch_backend
class backend_mod(matplotlib.backend_bases._Backend):
File "C:\Python37\Lib\site-packages\matplotlib\pyplot.py", line 283, in backend_mod
locals().update(vars(importlib.import_module(backend_name)))
File "C:\Python37\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\Python37\Lib\site-packages\matplotlib\backends\backend_qtagg.py", line 12, in <module>
from .backend_qt import (
File "C:\Python37\Lib\site-packages\matplotlib\backends\backend_qt.py", line 76, in <module>
for mod, key in [
File "C:\Python37\Lib\site-packages\matplotlib\backends\backend_qt.py", line 76, in <listcomp>
for mod, key in [
TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier'
经过不断查阅资料,终于发现了问题所在,那就是我昨天新装了一个第三方库:PySide6
,这是个做关于 GUI 界面的库,新版的 PySide6
不兼容我的 matplotlib
版本,那么最容易想到的就是降版本了。
解决方案
以下两种方案任选其一,推荐第一种方法:降 PySide6 的版本。
1. 降 PySide6 的版本
对于降 PySide6 的版本,我也没有一个个试,在 Github 上有人说降到 6.4.0
以下就可以了,但是我降到 6.3.0
还是不行,到 6.2.0
就可以了。
关于降低第三方库的版本命令,大家可以自行搜索,我是直接用 PyCharm
里面降的,个人感觉这个比较方便。过程如下;
-
进入设置界面(也可以直接使用快捷键打开:
Ctrl
+Alt
+s
): -
进入你的Python环境:
-
搜索你要升级或者降级的第三方库:
-
安装(更新):
-
等待安装完成(要出现
Package 'xxx' installed successfully
才表示安装成功!):
安装成功后,点击右上角的 X 退出此界面进入下面那个界面~
- 最后点击
ok
或者Apply
就结束了:
2. 在源代码中加入语句
或者在源代码上加上这两行代码:
import matplotlib
matplotlib.use('QtAgg')
如果还是报错,比如以下报错信息的话:
Traceback (most recent call last):
File "signature_bootstrap.py", line 77, in bootstrap
File "signature_bootstrap.py", line 93, in find_incarnated_files
File "C:\Program Files\Python38\lib\pathlib.py", line 1033, in __new__
self = cls._from_parts(args, init=False)
File "C:\Program Files\Python38\lib\pathlib.py", line 674, in _from_parts
drv, root, parts = self._parse_args(args)
File "C:\Program Files\Python38\lib\pathlib.py", line 658, in _parse_args
a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType
Fatal Python error: could not initialize part 2
Python runtime state: initialized
Current thread 0x00000598 (most recent call first):
File "<frozen importlib._bootstrap>", line 219 in _call_with_frames_removed
File "<frozen importlib._bootstrap_external>", line 1101 in create_module
File "<frozen importlib._bootstrap>", line 556 in module_from_spec
File "<frozen importlib._bootstrap>", line 657 in _load_unlocked
File "<frozen importlib._bootstrap>", line 975 in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 991 in _find_and_load
File "<frozen importlib._bootstrap>", line 219 in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1042 in _handle_fromlist
File "C:\Program Files\Python38\lib\site-packages\PySide6\__init__.py", line 64 in _setupQtDirectories
File "C:\Program Files\Python38\lib\site-packages\PySide6\__init__.py", line 124 in <module>
File "<frozen importlib._bootstrap>", line 219 in _call_with_frames_removed
File "<frozen importlib._bootstrap_external>", line 783 in exec_module
File "<frozen importlib._bootstrap>", line 671 in _load_unlocked
File "<frozen importlib._bootstrap>", line 975 in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 991 in _find_and_load
File "C:\Users\ASUS\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\qt_compat.py", line 98 in _setup_pyqt5plus
File "C:\Users\ASUS\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\qt_compat.py", line 137 in <module>
File "<frozen importlib._bootstrap>", line 219 in _call_with_frames_removed
File "<frozen importlib._bootstrap_external>", line 783 in exec_module
File "<frozen importlib._bootstrap>", line 671 in _load_unlocked
File "<frozen importlib._bootstrap>", line 975 in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 991 in _find_and_load
File "C:\Users\ASUS\AppData\Roaming\Python\Python38\site-packages\matplotlib\backends\backend_qtagg.py", line 9 in <module>
File "<frozen importlib._bootstrap>", line 219 in _call_with_frames_removed
File "<frozen importlib._bootstrap_external>", line 783 in exec_module
File "<frozen importlib._bootstrap>", line 671 in _load_unlocked
File "<frozen importlib._bootstrap>", line 975 in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 991 in _find_and_load
File "<frozen importlib._bootstrap>", line 1014 in _gcd_import
File "C:\Program Files\Python38\lib\importlib\__init__.py", line 127 in import_module
File "C:\Users\ASUS\AppData\Roaming\Python\Python38\site-packages\matplotlib\pyplot.py", line 289 in backend_mod
File "C:\Users\ASUS\AppData\Roaming\Python\Python38\site-packages\matplotlib\pyplot.py", line 288 in switch_backend
File "C:\Users\ASUS\AppData\Roaming\Python\Python38\site-packages\matplotlib\__init__.py", line 1144 in use
......
那就将上面的两句话改成下面这两句话:
import matplotlib
matplotlib.use('TkAgg')
这个时候应该都能解决了!
总结
遇到bug的时候多上网找,尤其是在 GitHub 上基本上都有相应的解决方案,因为你不可能是第一个遇到这个问题的人,除非你用的是最新的语言。可能有时候 GitHub 需要梯子才能快速访问,那你可以先在 百度 或者 CSDN 上搜,也会有相应的解答,但是我觉得质量肯定还是没 GitHub 的好~