2017-01-20 3 views
-1

Я здесь начинаю здесь. Я хотел бы знать координаты x1, пока он движется, поэтому он будет продолжать обновляться.Ошибка Python Tkinter canvas

Вот мой код.

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

Любая помощь будет оценена.

+0

Вы не объявленную 'self.canvas' в своем классе' Car'. –

+0

Если бы я объявил 'self.canvas' в моем классе' Car', не было бы другого холста? Я имел в виду, что они (автомобиль и дорога) должны находиться на одном холсте. – CPG

+0

Вещь 'self.canvas' - это ошибка (потому что в ней говорится, что' Car' не имеет атрибута 'canvas'), но я не коснулся tkinter через некоторое время. –

ответ

0

Ваш автомобиль не имеет доступа к объекту Example. Я передал бы свой пример в свой автомобиль по адресу init, чтобы он мог получить доступ к его контексту. например

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

В этом примере, объекты автомобилей имеют доступ к холсту, который вы создаете в вашем примере класса, так что они могут сделать сами, и т.д.

+0

класс 'Автомобиль: Защиту __init __ (само, x1, y1, x2, y2, Vx, Vy, цвет, пример): self.x1 = x1 self.y1 = у1 self.x2 = х2 self.y2 = у2 self.vx = ъй self.vy = VY self.color = цвет self.Example = Пример защиту DrawIt (сам): self.Example.canvas.create_rectangle (x1, y1, x2, y2, цвет) mycar = Автомобиль (60, 60, 125, 90,3,0, «красный», пример) mycar.DrawIt() '' Теперь сообщение об ошибке AttributeError: объект типа «Пример» не имеет атрибута «canvas'' – CPG

1

У вас есть некоторые основные недопонимания того, как классы и объекты работы. Вместо того, чтобы сделать это:

my_canvas = Example(root) 
my_canvas.pack(fill="both", expand=True) 
mycar = Car(60, 60, 125, 90,3,0,"red",Example) 

(обратите внимание: вы также должны вызвать pack на отдельной линии, где создается виджет и присваивается переменной См https://stackoverflow.com/a/1101765/7432.)

Вы должны сделать это:

my_canvas = Example(root).pack(fill="both", expand=True) 
mycar = Car(60, 60, 125, 90,3,0,"red", my_canvas) 

Вам необходимо пройти в например из Example (например: my_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) 
+0

Теперь сообщение об ошибке уподобиться этой' AttributeError: „NoneType“ объект не имеет атрибута»canvas'' Мне нужно уточнить, передать класс, если я использую «пример»? – CPG

+0

@CPG: это другая проблема, и здесь был дан ответ: http://stackoverflow.com/a/1101765/7432. Я обновил свой ответ, чтобы описать это. –

+0

отредактировал исходный код. – CPG