Холст Tkinter не обновляется в бесконечном цикле - PullRequest
0 голосов
/ 23 февраля 2019

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

import tkinter as tk

class ObjectHolder:
    def __init__(self, pos, velocity, radius, id):
        self.id = id                # the id of the canvas shape
        self.pos = pos              # the position of the object
        self.r = radius             # the radius of incluence of the object
        self.velocity = velocity    # the velocity of the object

    def moveobject(object):
        x = object.pos[0] + object.velocity[0]  # moves the object where
        y = object.pos[1] + object.velocity[1]  # 0=x and 1=y
        object.pos = (x, y)
        canvas.move(object, x, y)

class App():
    def __init__(self, canvas):
        self.canvas = canvas
        self.objects = []
        for i in range(0, 2):
            position = ((i+1)*100, (i+1)*100)
            velocity = (-(i+1)*10, -(i+1)*10)
            radius = (i + 1) * 20

            x1 = position[0]-radius
            y1 = position[1]-radius
            x2 = position[0]+radius
            y2 = position[1]+radius

            id = canvas.create_oval(x1, y1, x2, y2)
            self.objects.append(ObjectHolder(position, velocity, radius, id))
        self.symulation(self.objects)

    def symulation(self, objects):
        for object in objects:             # this moves each object
            ObjectHolder.moveobject(object)

        # This part doesn't work. It is supposed to update the canvas
        # and repeat forever.
        self.canvas.update()
        root.update()
        self.canvas.after(50, self.symulation, objects)

root = tk.Tk()
canvas = tk.Canvas(root, width=800, height=600, bg="light blue")
canvas.pack()
App(canvas)

1 Ответ

0 голосов
/ 23 февраля 2019

Существует ряд проблем с вашим кодом.Одним из важных моментов было то, как вы обновляли положение существующих объектов Canvas.метод move() хочет знать величину движения (изменение значений x и y), а не новую абсолютную позицию.

Когда я установил, что оказалось, что скорости слишком велики, я уменьшилони будут составлять только 10% от значений, которые вы имели.

Другая серьезная проблема заключалась в способе реализации класса ObjectHolder.С одной стороны, метод moveobject() не имеет аргумента self, который он должен был бы использовать вместо аргумента object.

Приведенный ниже код запускает и анимирует движение.

import tkinter as tk


class ObjectHolder:
    def __init__(self, pos, velocity, radius, id):
        self.id = id                # the id of the canvas shape
        self.pos = pos              # the position of the object
        self.r = radius             # the radius of incluence of the object
        self.velocity = velocity    # the velocity of the object

    def moveobject(self):
        x, y = self.pos
        dx, dy = self.velocity
        self.pos = (x + dx, y + dy)
        canvas.move(self.id, dx, dy)  # Amount of movement, not new position.


class App():
    def __init__(self, canvas):
        self.canvas = canvas
        self.objects = []
        for i in range(0, 2):
            position = ((i+1)*100, (i+1)*100)
#            velocity = (-(i+1)*10, -(i+1)*10)
            velocity = (-(i+1), -(i+1))  # Much slower speed...
            radius = (i + 1) * 20

            x1 = position[0]-radius
            y1 = position[1]-radius
            x2 = position[0]+radius
            y2 = position[1]+radius

            id = canvas.create_oval(x1, y1, x2, y2)
            self.objects.append(ObjectHolder(position, velocity, radius, id))

        self.simulation(self.objects)

    def simulation(self, objects):
        for object in objects:             # this moves each object
            object.moveobject()

        # This part doesn't work. It is supposed to update the canvas
        # and repeat forever.
#        self.canvas.update()  # Not needed.
#        root.update()  # Not needed.
        self.canvas.after(50, self.simulation, objects)

root = tk.Tk()
canvas = tk.Canvas(root, width=800, height=600, bg="light blue")
canvas.pack()
app = App(canvas)
root.mainloop()  # Added.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...