尝试使用Canvas.coords()修改对象坐标时,python的tkinter中的“_tkinter.TclError:错误的屏幕距离”

时间:2015-09-08 05:12:00

标签: python tkinter coordinates tkinter-canvas

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

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

count = 1
for part in self._createdpartlist:
    self.coords(part, self._partlist[count].coordinates)
    count += 1

self是我创建的Canvas对象。 withpartpartlist包含画布中已创建部件的id(所有4个边多边形),partlist是具有以[(x1,y1),(x2,y2),(x3,y3)形式返回的坐标的对象列表,(x4,y4)]

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

_tkinter.TclError: bad screen distance "340)]" 

(在这种情况下340是y4坐标)

我完全不知道屏幕距离不好意味着什么,并且无法弄清楚什么是错误的,或者我是否使用了coords功能不正确。

非常感谢任何帮助

编辑:当我创建一个仅包含此文件的新文件时,我收到此错误。

from tkinter import *

coordinates = [(330,230), (350,230), (350,340), (330,340)]
new_coords = [(340,245), (340,260), (400,260), (400,245)]

c = Canvas()

shape = c.create_polygon(coordinates)

c.coords(shape, new_coords)

错误出现“245)]”而不是“340)]”在这个例子中

2 个答案:

答案 0 :(得分:1)

你能试试吗?我不会在移动设备上试用它。

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))

答案 1 :(得分:0)

我在尝试Pypy3 5.5.0-alpha时遇到了_tkinter.TclError: bad screen distance

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