Движущиеся шары в холсте Ткинтер

python animation tkinter

18032 просмотра

4 ответа

Это очень простая программа, с помощью которой я хочу сделать два движущихся шара, но на самом деле движется только один из них.

Я также попробовал некоторые варианты, но не могу заставить двигаться второй шар; другой связанный вопрос - некоторые люди используют move(object)метод, чтобы достигнуть этого, в то время как другие делают, delete(object)а затем перерисовывают его. Какой я должен использовать и почему?

Это мой код, который анимирует / перемещает только один шар:

from Tkinter import *

class Ball:
    def __init__(self, canvas, x1, y1, x2, y2):
    self.x1 = x1
    self.y1 = y1
    self.x2 = x2
    self.y2 = y2
    self.canvas = canvas
    self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red")

    def move_ball(self):
        while True:
            self.canvas.move(self.ball, 2, 1)
            self.canvas.after(20)
            self.canvas.update()

# initialize root Window and canvas
root = Tk()
root.title("Balls")
root.resizable(False,False)
canvas = Canvas(root, width = 300, height = 300)
canvas.pack()

# create two ball objects and animate them
ball1 = Ball(canvas, 10, 10, 30, 30)
ball2 = Ball(canvas, 60, 60, 80, 80)

ball1.move_ball()
ball2.move_ball()

root.mainloop()
Автор: dlohse Источник Размещён: 12.11.2019 09:44

Ответы (4)


12 плюса

Вы никогда не должны помещать бесконечный цикл в программу с графическим интерфейсом - там уже работает бесконечный цикл. Если вы хотите, чтобы ваши шарики двигались независимо, просто выньте цикл и попросите move_ballметод сделать новый вызов для себя в цикле событий. При этом ваши шары будут продолжать двигаться вечно (что означает, что вы должны поставить какую-то проверку там, чтобы этого не произошло)

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

from Tkinter import *
from random import randint

class Ball:
    def __init__(self, canvas, x1, y1, x2, y2):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.canvas = canvas
        self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red")

    def move_ball(self):
        deltax = randint(0,5)
        deltay = randint(0,5)
        self.canvas.move(self.ball, deltax, deltay)
        self.canvas.after(50, self.move_ball)

# initialize root Window and canvas
root = Tk()
root.title("Balls")
root.resizable(False,False)
canvas = Canvas(root, width = 300, height = 300)
canvas.pack()

# create two ball objects and animate them
ball1 = Ball(canvas, 10, 10, 30, 30)
ball2 = Ball(canvas, 60, 60, 80, 80)

ball1.move_ball()
ball2.move_ball()

root.mainloop()
Автор: Bryan Oakley Размещён: 21.08.2014 04:49

2 плюса

Эта функция кажется виновником

def move_ball(self):
    while True:
        self.canvas.move(self.ball, 2, 1)
        self.canvas.after(20)
        self.canvas.update()

Вы сознательно ставите себя в бесконечный цикл, когда вызываете это.

ball1.move_ball()    # gets called, enters infinite loop
ball2.move_ball()    # never gets called, because code is stuck one line above
Автор: CoryKramer Размещён: 21.08.2014 03:58

2 плюса

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

Ваша программа буквально застряла на линии:

ball1.move_ball()

И это никогда не попадет в строку:

ball2.move_ball()

Потому что нет предела тому, где должен заканчиваться цикл.

В противном случае ответ "sundar nataraj" сделает это.

Автор: Donald Размещён: 21.08.2014 04:33

0 плюса

попробуйте вместо self.canvas.move(self.ball, 2, 1)использования

self.canvas.move(ALL, 2, 1)

Все это используется для перемещения всех объектов на холсте

Автор: sundar nataraj Размещён: 21.08.2014 04:10
Вопросы из категории :
32x32