2013-04-09 5 views
0

Моя цель - создать программу, которая имитирует скачки, моя проблема - когда я рисую с помощью Tkinter, я получаю пустой холст. Я уверен, что это очевидная ошибка, но я не могу ее найти. Любая помощь?Проблемы с рисованием с моим классом python

class Horse(): 

    def __init__ (self, color, number, slot): 
     self.xPos = 0 
     self.yPos = self.xPos - 59 
     self.move = 0 
     self.slot = slot 
     self.size = 40 
     self.color = color 
     self.number = number 

    def horseMove (self): 
     self.Erase() 
     self.move= random.randint(20,80) 
     self.xPos = self.xPos + self.move 
     self.Draw() 
     myCanvas.update() 
     return self.xPos 

    def Erase (self): 
     myCanvas.create_rectangle (self.xPos, self.yPos, self.xPos + 75, self.yPos + 40, fill = 'white', outline ='white') 

    def Draw (self): 
     myCanvas.create_oval (self.xPos, self.yPos, self.xPos + 75, self.yPos + 40, fill = color) 
     myCanvas.create_text (self.xPos + 35, self.yPos, text = self.number, fill = 'blue', font = ("Times","17")) 
     time.sleep (0.5) 

Это мой код класса

Horses= [] 
slot=0 
for i in range (0,3): 
    number=input("what is the horses number: ") 
    color=input("what is the horses color: ") 
    slot += 1 
    animal=Horse(color, number, slot) 
    Horses.append(animal) 

import random 
from tkinter import * 
import time 
root = Tk() 
myCanvas = Canvas (root, width =1000, height=1000, background='white') 
myCanvas.pack() 

while True: 
    for i in range (0,len(Horses)): 
     animal.horseMove() 

Это мой магистральный

+0

У вас есть немало проблем, т.е. 'myCanvas' не определен в классе Horse, бесконечный цикл, который закроет вашу программу, и' for i in range (0, len (Horses)): 'loop, который не использует' i'. Начните с чего-то более простого. –

ответ

1

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

self.yPos = self.xPos - 59 

self.xPos равна нулю, так self.yPos является -59, но по умолчанию верхняя координата y равна 0, поэтому вы снимаете экран.

В коде есть много других проблем. Больше всего беспокоит то, что вы звоните time.sleep, который делает именно то, что вы думаете, что он делает - это заставляет всю вашу программу спать. Вы должны никогда позвонить time.sleep в основной поток графического интерфейса.

Вы пытаетесь удалить и воссоздать объекты для каждого момента гонки. Тем не менее, вы на самом деле ничего не стираете, вы просто скрываете это. Чтобы удалить объекты, вы должны вызвать метод canvas delete. Кроме того, знаете ли вы, что у canvas есть метод move, который можно использовать для перемещения элементов? Таким образом, вам не нужно удалять и воссоздавать их - просто нарисуйте лошадь один раз, затем вызовите move, чтобы переместить его по экрану.

Наконец, вы делаете бесконечный цикл и в этом цикле вызывают update. Хотя это обычно работает для такой простой программы, это неправильный подход к анимации с Tkinter. Хорошее эмпирическое правило состоит в том, что вы никогда не должны напрямую вызывать update если вы не знаете, почему вы никогда не должны вызывать update (и даже тогда, это редко бывает, что нужно делать)

Вместо while True цикла, вы должны написать функция, которая перемещает все один раз, затем организует вызов ее раз в секунду (или половину секунды, независимо от того). Картина выглядит примерно так:

def draw_one_frame(): 
    <do whatever you need to do to move each item once> 
    root.after(500, self.draw_one_frame) 

Обычно у вас есть какое-то функция «старт», который вызывает этот раз, а затем после того, как она вызывает сам быть вызвана снова. Обычно у вас будет кнопка «Стоп», которая вызывает функцию для установки флага, и вы проверяете этот флаг, чтобы в конечном итоге остановить анимацию. Таким образом, окончательный вариант выглядит более как:

def start(): 
    running = True 
    draw_one_frame() 
def stop(): 
    running = False 
def draw_one_frame(): 
    if running: 
     <do whatever...> 
     root.after(500, self.draw_one_frame) 

(конечно, я выступаю за более подход ОО-стиль, но я оставил это, чтобы держать вещи простыми)

+0

Как работает метод перемещения? есть ли учебник, который вы могли бы связать? –

+0

@ArkAngel: нет ничего. Вы просто называете это, рассказывая, какой элемент использовать и сколько двигаться в направлении X и Y. –

Смежные вопросы