一个很诡异的错误,我并没有导入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都没用。
又过了两天之后,我自己的电脑上又变成了,单独写这个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"