您好我设计了一个迷宫,我想在“人”从一个单元格移动到另一个单元格时在单元格之间绘制路径。 因此,每次移动单元格时都会绘制一条线 我也在使用图形模块
图形模块是面向对象的库
我导入
from graphics import*
from maze import*
我的圈子是我的手机
center = Point(15, 15)
c = Circle(center, 12)
c.setFill('blue')
c.setOutline('yellow')
c.draw(win)
p1 = Point(c.getCenter().getX(), c.getCenter().getY())
这是我的循环
if mazez.blockedCount(cloc)> 2:
mazez.addDecoration(cloc, "grey")
mazez[cloc].deadend = True
c.move(-25, 0)
p2 = Point(p1.getX(), p1.getY())
line = graphics.Line(p1, p2)
cloc.col = cloc.col - 1
现在它说每次按键都没有定义getX是因为p2 ???
这是本部分模块中最重要的部分
def __init__(self, title="Graphics Window",
width=200, height=200, autoflush=True):
master = tk.Toplevel(_root)
master.protocol("WM_DELETE_WINDOW", self.close)
tk.Canvas.__init__(self, master, width=width, height=height)
self.master.title(title)
self.pack()
master.resizable(0,0)
self.foreground = "black"
self.items = []
self.mouseX = None
self.mouseY = None
self.bind("<Button-1>", self._onClick)
self.height = height
self.width = width
self.autoflush = autoflush
self._mouseCallback = None
self.trans = None
self.closed = False
master.lift()
if autoflush: _root.update()
def __checkOpen(self):
if self.closed:
raise GraphicsError("window is closed")
def setCoords(self, x1, y1, x2, y2):
"""Set coordinates of window to run from (x1,y1) in the
lower-left corner to (x2,y2) in the upper-right corner."""
self.trans = Transform(self.width, self.height, x1, y1, x2, y2)
def plot(self, x, y, color="black"):
"""Set pixel (x,y) to the given color"""
self.__checkOpen()
xs,ys = self.toScreen(x,y)
self.create_line(xs,ys,xs+1,ys, fill=color)
self.__autoflush()
def plotPixel(self, x, y, color="black"):
"""Set pixel raw (independent of window coordinates) pixel
(x,y) to color"""
self.__checkOpen()
self.create_line(x,y,x+1,y, fill=color)
self.__autoflush()
def draw(self, graphwin):
if self.canvas and not self.canvas.isClosed(): raise GraphicsError(OBJ_ALREADY_DRAWN)
if graphwin.isClosed(): raise GraphicsError("Can't draw to closed window")
self.canvas = graphwin
self.id = self._draw(graphwin, self.config)
if graphwin.autoflush:
_root.update()
def move(self, dx, dy):
"""move object dx units in x direction and dy units in y
direction"""
self._move(dx,dy)
canvas = self.canvas
if canvas and not canvas.isClosed():
trans = canvas.trans
if trans:
x = dx/ trans.xscale
y = -dy / trans.yscale
else:
x = dx
y = dy
self.canvas.move(self.id, x, y)
if canvas.autoflush:
_root.update()
class Point(GraphicsObject):
def __init__(self, x, y):
GraphicsObject.__init__(self, ["outline", "fill"])
self.setFill = self.setOutline
self.x = x
self.y = y
def _draw(self, canvas, options):
x,y = canvas.toScreen(self.x,self.y)
return canvas.create_rectangle(x,y,x+1,y+1,options)
def _move(self, dx, dy):
self.x = self.x + dx
self.y = self.y + dy
def clone(self):
other = Point(self.x,self.y)
other.config = self.config.copy()
return other
def getX(self): return self.x
def getY(self): return self.y
def __init__(self, p1, p2, options=["outline","width","fill"]):
GraphicsObject.__init__(self, options)
self.p1 = p1.clone()
self.p2 = p2.clone()
def _move(self, dx, dy):
self.p1.x = self.p1.x + dx
self.p1.y = self.p1.y + dy
self.p2.x = self.p2.x + dx
self.p2.y = self.p2.y + dy
def getP1(self): return self.p1.clone()
def getP2(self): return self.p2.clone()
def getCenter(self):
p1 = self.p1
p2 = self.p2
return Point((p1.x+p2.x)/2.0, (p1.y+p2.y)/2.0)
答案 0 :(得分:1)
您可以从交互式Python shell中尝试:
>>> import graphics
>>> help(graphics.Circle)
这应该告诉你Circle有什么属性。
答案 1 :(得分:1)
您尝试将getX()
和getY()
用作独立的功能:
p2 = Point(getX(), getY())
请注意,您将它们称为裸名称,不是限定名称 - 因此,作为函数,不作为方法。
然而你引用的文档说它们是方法 - 因此,必须将它们作为限定名称的一部分(“点后”......! - )和点之前调用必须是Point
的实例。
因此,您可能需要p1.getX()
和p1.getY()
而不是您正在使用的裸名称。 p1.getX
是限定名称(即带点的名称),表示对象getX
的方法或属性p1
。
这是非常基础的Python,我建议您在尝试使用Python制作或修改应用程序之前先学习official Python tutorial或其他更简单的介绍性文档。
答案 2 :(得分:0)
我不知道maze
如何解决这个谜题,所以我假设它就像一个生成器,yield
进行圆圈的下一步行动。有这样的效果:
while not this_maze.solved():
next_position = this_maze.next()
my_circle.move(next_position)
然后您需要做的就是跟踪当前的圆圈位置和前一个圆圈位置。
prev_position = this_maze.starting_point
while not this_maze.solved():
next_position = this_maze.next()
my_circle.clear()
draw_trail(prev_position, next_position)
my_circle.draw_at(next_position)
prev_position = next_position
显然,在与您的框架兼容的内容中更改此内容取决于您。 dir()
,help()
并阅读图书馆的资源将对您有所帮助。