Python Tkinter坐标画布错误
我在这里完全是初学者。我想知道x1移动时的坐标,所以它会不断更新 这是我的密码Python Tkinter坐标画布错误,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我在这里完全是初学者。我想知道x1移动时的坐标,所以它会不断更新 这是我的密码 from tkinter import * import tkinter as tk import time import random class Example(tk.Frame): def __init__(self,parent): tk.Frame.__init__(self)` #create a canvas self.canvas = tk
from tkinter import *
import tkinter as tk
import time
import random
class Example(tk.Frame):
def __init__(self,parent):
tk.Frame.__init__(self)`
#create a canvas
self.canvas = tk.Canvas(width=600, height=250)
self.canvas.pack()
self.road()
self.crossing()
def road(self):
Line1 = self.canvas.create_line(50, 50, 450, 50)
Line2 = self.canvas.create_line(50, 100, 450, 100)
def crossing(self):
CLine1 = self.canvas.create_line(350, 50, 350, 100)
CLine2 = self.canvas.create_line(375, 50, 375, 100)
class Car:
def __init__(self,x1,y1,x2,y2,vx,vy,color,Example):
self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
self.vx = vx
self.vy = vy
self.color=color
self.Example = Example
def drawit(self):
self.Example.canvas.create_rectangle(x1,y1,x2,y2,color)
def moveit(self,vx,vy):
self.Example.canvas.move(vx,vy)
if __name__ == "__main__":
root = tk.Tk()
my_canvas = Example(root).pack(fill="both", expand=True)
mycar = Car(60, 60, 125, 90,3,0,"red",Example)
mycar.drawit()
mycar.moveit()
print (mycar.x1)
root.mainloop()
以下是错误消息:
AttributeError: type object 'Example' has no attribute 'canvas'
进程已完成,退出代码为1
任何帮助都将不胜感激。您的汽车无法访问示例对象。我会在init上将我的示例传递给我的汽车,以便它可以访问其上下文。e、 g
class Car:
def __init__(self, x, y, example):
...
self.example=example
def do_stuff(self):
self.example.canvas.draw(whatever)
example = Example(args)
car = Car(3,4,example)
car.do_stuff()
在本例中,汽车对象可以访问您在示例类中创建的画布,以便它们可以自己绘制,等等。您对类和对象的工作方式有一些基本的误解。而不是这样做:
my_canvas = Example(root)
my_canvas.pack(fill="both", expand=True)
mycar = Car(60, 60, 125, 90,3,0,"red",Example)
(注意:您还需要在创建小部件并将其分配给变量的另一行上调用pack
。请参阅)
您需要这样做:
my_canvas = Example(root).pack(fill="both", expand=True)
mycar = Car(60, 60, 125, 90,3,0,"red", my_canvas)
您需要传入的是Example
(例如:myu canvas
)的实例,而不是类(例如:Example
)。另外,Car
需要使用如下示例:
class Car:
def __init__(self,x1,y1,x2,y2,vx,vy,color,example):
...
self.example=example
def drawit(self):
self.example.canvas.create_rectangle(x1,y1,x2,y2,color)
def moveit(self,vx,vy):
self.example.canvas.move(vx,vy)
你没有在你的
Car
类中声明self.canvas
。如果我在我的Car
类中声明self.canvas
,会不会有另一个画布?我的意思是它们(汽车和道路)应该在同一块画布上。self.canvas
的东西就是错误所在(因为它说car
没有属性canvas
),但我已经有一段时间没碰tkinter了。Copy+paste
一些代码,然后问“为什么不工作?”你忘记了成员的状态my_canvas=Example(root).pack(fill=“both”,expand=True)
比my_canvas.canvas…..
或将示例类复制到车内类。我真的不知道如何启动它,所以我尝试复制并理解它class Car(示例)
像这样吗?或者如何?感谢您的帮助class Car:def uuuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuo(self,x1,y1,y1,vx,vy,vy,color,Example):self.x1=x1-self=y1-self.x2=x2-self.y2=y2-self=vx-vx-self.vy=vy=vy.color=color-self.Example=de(x1,y1,x2,y2,颜色)mycar=Car(60,60,125,90,3,0,“红色”,示例)mycar.drawit()
现在错误消息是AttributeError:type对象“Example”没有属性“canvas”
现在错误消息变成这样AttributeError:“NoneType”对象没有属性“canvas”
我需要澄清,如果我使用“Example”,我是否传递类示例?@CPG:这是一个不同的问题,这里已经给出了答案:。我已经更新了我的答案来解决这个问题。@CPG:stackoverflow就是这样工作的。你现在完全否定了人们喜欢花时间写的答案。如果你有其他问题,请问另一个问题(先研究这个新问题!)。请不要将原始问题编辑为与原来完全不同的内容。我已将您的编辑回滚到原始问题。