毛毛那个熊 2021-10-18 12:05 采纳率: 100%
浏览 304
已结题

Python 用matplotlib的ginput()获取鼠标点击坐标,关闭figure窗口时报tkinter错误,try except都跳不过

一个很诡异的错误,我并没有导入tkinter模块,并且这个错误try except都跳不过
事情一开始是这样的,我想在matplotlib里实现示鼠标单击来移动光标的功能,百度搜了下发现了一个ginput()完美契合需求,把示例代码复制下来一运行也不都正常不会报错。第二天早上把代码带到公司的电脑上,运行也一直都是没有问题,但是到了下午快下班时又运行了一遍,运行的时候是正常的,但是关闭figure窗口时突然报错了。然后回家后在自己电脑上试,发现自己电脑上运行时,关闭figure窗口时也开始报错(代码还是原封不动的),然后折腾一晚上就是不行,回不去刚查示例代码那会儿的样子。然后第三天,还是保持公司电脑自己电脑都会报错,再到第四天,公司电脑上运行它又好了,但是自己电脑上运行还是报错(公司电脑和自己电脑上python版本一致,vscode版本和设置一致)。
并且我咨询过其他人,同样的代码他们的电脑上都不报错,所以没办法帮我复现问题,为此我重装python重装vscode甚至重装我的win10系统都搞错,都不行,就很难…

代码和错误详情如下,这是我把和错误不相关的代码剔除掉之后剩下的代码:

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(10)
y=np.random.rand(10)
print(x, y)
plt.plot(x, y)

pos=plt.ginput(3) # 连续取3个点,返回其坐标
print(pos)

就一个plt.plot()和ginput(),ginput(n)的作用是鼠标连续取n个点后返回这n个点的坐标值。正常情况是这样的,运行到ginput()时会自动显示图形,不需要show(),然后等你把点取完图形就自动关闭了。
我现在遇到的异常是,点取完了窗口不会自动关闭,且点击右上角的叉叉手动关闭时弹出报错,报的是tkinter错误,并且残留一个小窗口还需要再点一次关闭。由于这个错误不是在运行代码是报的,而是在点击关闭figure窗口时报的,我试了连try except都没用。

img


又过了两天之后,我自己的电脑上又变成了,单独写这个ginput()不会报错,但是把它写在while()循环里就又报跟之前一样的错误(但是我公司的电脑上还是不报)
这是写在循环里的代码:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0,10,0.5)
y = np.random.rand(x.shape[0])

plt.plot(x,y)
cursor1 = plt.axhline(y=0.5,ls='-.',lw=0.8,c="black")#初始化水平光标

while(1):
    try:
        ylevel = plt.ginput(1)[0][1]    # 鼠标取点
        # 用取的点的y坐标更新光标
        cursor1.remove()                
        cursor1 = plt.axhline(y=ylevel,ls='-.',lw=0.8,c="black")
    except:
        break

这是报错时的错误代码:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python39\lib\tkinter_init.py", line 1892, in call
return self.func(*args)
File "C:\Python39\lib\tkinter_init
.py", line 814, in callit
func(*args)
File "C:\Python39\lib\site-packages\matplotlib\backends_backend_tk.py", line 476, in delayed_destroy
self.window.destroy()
File "C:\Python39\lib\tkinter_init.py", line 2311, in destroy
for c in list(self.children.values()): c.destroy()
File "C:\Python39\lib\tkinter_init
.py", line 2583, in destroy
Misc.destroy(self)
File "C:\Python39\lib\tkinter_init_.py", line 640, in destroy
self.tk.deletecommand(name)
_tkinter.TclError: can't delete Tcl command"

  • 写回答

2条回答 默认 最新

  • CSDN专家-黄老师 2021-10-18 12:36
    关注

    这个是模块的bug,你试试降低matplotlib版本试试

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月19日
  • 已采纳回答 10月18日
  • 创建了问题 10月18日

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办