Движущиеся шары в холсте Ткинтер
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:330 плюса
попробуйте вместо self.canvas.move(self.ball, 2, 1)
использования
self.canvas.move(ALL, 2, 1)
Все это используется для перемещения всех объектов на холсте
Автор: sundar nataraj Размещён: 21.08.2014 04:10Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- animation Имейте reloadData для анимации UITableView при изменении
- animation Как лучше всего сдвинуть панель в WPF?
- animation Плавная анимация с использованием GTK +
- animation Математическое уравнение для расчета различных скоростей для затухающей анимации
- animation Как заставить выполнение приостановить, поспать, подождать X секунд в R?
- animation Как запустить две анимации jQuery одновременно?
- tkinter Как закрыть окно tkinter?
- tkinter Как мне обработать событие закрытия окна в Tkinter?
- tkinter Как вы запускаете свой собственный код вместе с циклом событий Tkinter?
- tkinter Удаление значка TK в окне Tkinter
- tkinter Как остановить Tkinter Frame от сжатия, чтобы соответствовать его содержанию?