&引用_tkinter.TclError:屏幕距离错误“;在python中';尝试使用Canvas.coords()修改对象坐标时,请执行以下操作

&引用_tkinter.TclError:屏幕距离错误“;在python中';尝试使用Canvas.coords()修改对象坐标时,请执行以下操作,python,tkinter,coordinates,tkinter-canvas,Python,Tkinter,Coordinates,Tkinter Canvas,我正在尝试用一些可以移动和旋转的项目制作一个画布,为此,我有修改坐标的功能,但是我在移动对象时遇到了问题。我试图使用coords函数来更改每个对象的坐标 引发错误的当前代码位为: count=1 对于self.\u createdpartlist中的部件: self.coords(零件,self.\u零件列表[count].坐标) 计数+=1 self是我创建的画布对象。createdpartlist包含画布中已创建零件的id(所有四边形),partlist是具有以[(x1,y1)、(x2,y

我正在尝试用一些可以移动和旋转的项目制作一个画布,为此,我有修改坐标的功能,但是我在移动对象时遇到了问题。我试图使用coords函数来更改每个对象的坐标

引发错误的当前代码位为:

count=1
对于self.\u createdpartlist中的部件:
self.coords(零件,self.\u零件列表[count].坐标)
计数+=1
self是我创建的画布对象。createdpartlist包含画布中已创建零件的id(所有四边形),partlist是具有以[(x1,y1)、(x2,y2)、(x3,y3)、(x4,y4]形式返回的坐标的对象列表

然而,当我试图运行它时,我得到了错误

_tkinter.TclError: bad screen distance "340)]" 
(在这种情况下,340是y4坐标)

我不知道屏幕距离差到底是什么意思,也不知道到底出了什么问题,或者我是否错误地使用了coords函数

非常感谢您的帮助

编辑:当我创建一个只包含此内容的新文件时,会出现此错误

从tkinter导入*
坐标=[(330230)、(350230)、(350340)、(330340)]
新坐标=[(340245)、(340260)、(400260)、(400245)]
c=画布()
形状=c.创建多边形(坐标)
c、 坐标(形状、新坐标)

在本例中,错误出现的是“245)],而不是“340)],

您能试试吗?我以后不在手机上时会试试

import itertools
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk


# from itertools recipes: https://docs.python.org/2/library/itertools.html
def flatten(list_of_lists):
    """Flatten one level of nesting"""
    return itertools.chain.from_iterable(list_of_lists)


coordinates = [(330,230), (350,230), (350,340), (330,340)]
new_coords = [(340,245), (340,260), (400,260), (400,245)]
c = tk.Canvas()
shape = c.create_polygon(coordinates)
c.coords(shape, *flatten(new_coords))
如果可行,请尝试:

for i, part in enumerate(self._createdpartlist):
    self.coords(part, *flatten(self._partlist[i+1].coordinates))

我在尝试Py3 5.5.0-alpha时遇到了
\u tkinter.TclError:屏幕距离不好


将坐标列表更改为元组会有所帮助。

看起来您的坐标存储为字符串。在您的循环中,您可以尝试打印(self.\u partlist[count].coordinates)
并查看它是什么吗?当我搜索错误时,这似乎是大多数问题。然而,代码中没有任何东西被指定为字符串,我可以调用相同的坐标列表,并在pythonshell中测试时将它们用作数字,所以我不相信它们是字符串。当打印出来的时候[(330,230),(350,230),(350,340),(330,340)]可能它们被意外地转换了?你试过调查循环中的数据吗?我知道错误的格式可能很奇怪,但看起来好像有什么东西将元组列表转换成了字符串,可能会用逗号拆分。我已经查看了坐标生成时所使用的所有函数,但找不到任何内容,甚至无法打印出self。\u partlist[0]。坐标返回数字坐标列表,所以我能理解它们变成字符串的唯一方法是在coords函数中。哦,根据你所指的循环,for循环只是上面写的,所以在tkinter main循环中没有其他任何事情发生,坐标直接作为数字输入,然后由我检查过的函数修改,这样它们就不会变成字符串。你是一个图例,我之前尝试过将其展平,但结果证明我需要在参数之前添加*。非常感谢!如果有人读到这篇文章时感到奇怪,
*…
将序列解压,这样它就相当于调用
coords(part,x0,y0,x1,y1)
,而不是
coords(part,(x0,y0,x1,y1))