Python Tkinter坐标画布错误

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

我在这里完全是初学者。我想知道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.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就是这样工作的。你现在完全否定了人们喜欢花时间写的答案。如果你有其他问题,请问另一个问题(先研究这个新问题!)。请不要将原始问题编辑为与原来完全不同的内容。我已将您的编辑回滚到原始问题。