TypeError: int() argument must be a string, a bytes-like object or a number, not ‘KeyboardModifier‘

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 里面降的,个人感觉这个比较方便。过程如下;

  1. 进入设置界面(也可以直接使用快捷键打开:Ctrl + Alt + s

    在这里插入图片描述

  2. 进入你的Python环境

    在这里插入图片描述

  3. 搜索你要升级或者降级的第三方库

    在这里插入图片描述

  4. 安装(更新)

    在这里插入图片描述

  5. 等待安装完成(要出现 Package 'xxx' installed successfully 才表示安装成功!)

在这里插入图片描述
安装成功后,点击右上角的 X 退出此界面进入下面那个界面~

  1. 最后点击 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 的好~

  • 37
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值