Tkinter Python OOP: перемещение отдельных виджетов одновременно с canvas.move () - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу перевести свою процедурную программу «Прыгающий мяч» в ООП, чтобы немного обучить ООП.

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

import tkinter as tk
import time
import random

#Define root windows
root = tk.Tk()
root.geometry("800x800")
root.title("TkInter Animation Test")

#Define canvas that is inside the root window

canvas_width = 700
canvas_height = 700

canvas = tk.Canvas(root, width= canvas_width, height= canvas_height, bg="Black")
canvas.pack()


class Oval():

    #Oval creation inside the canvas
    def __init__(self, y1, x1, y2, x2, color):
        self.y1 = y1
        self.x1 = x1

        self.y2= y2
        self.x2= x2
        self.oval = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill=color)

    #Moving the Oval(ov1)
    def move(self):
        self.xd = random.randint(5,10)
        self.yd = random.randint(5,10)

        while True:
            canvas.move(self.oval, self.xd, self.yd)
            # print(self.yd, self.xd)
            self.coords = canvas.coords(self.oval)
            # print (self.coords)

            if self.coords[3] + self.yd >= 700 or self.coords[1] + self.yd <= 0:
                if self.yd < 0:
                    self.yd = random.randint(5,10)
                else:
                    self.yd = -(random.randint(5,10))

            if self.coords[2] + self.xd >= 700 or self.coords[0] + self.xd <= 0:
                if self.xd < 0:
                    self.xd = random.randint(5,10)
                else:
                    self.xd = -(random.randint(5,10))

            root.update()
            time.sleep(.01)

ov1 = Oval(10,10,40,40, "blue")
ov2 = Oval(80,80,120,120, "red")
ov3 = Oval(240,240,270,270, "Yellow")
ov4 = Oval(360,360,400,400, "Green")
ov5 = Oval(500,500,540,540, "white")


#Problem is that ov1.move() has a internal loop and ov2.move() will never be called
# ov1.move()
# ov2.move()
# ov3.move()
# ov4.move()
# ov5.move()

tk.mainloop()

1 Ответ

0 голосов
/ 04 сентября 2018

Решили это самостоятельно.

Я только что вынул из класса цикл While True: и назвал функцию в цикле ниже.

import tkinter as tk
import time
import random

#Define root windows
root = tk.Tk()
root.geometry("800x800")
root.title("TkInter Animation Test")

#Define canvas that is inside the root window

canvas_width = 700
canvas_height = 700



canvas = tk.Canvas(root, width= canvas_width, height= canvas_height, bg="Black")
canvas.pack()


class Oval():

    #Oval creation inside the canvas
    def __init__(self, y1, x1, y2, x2, color):
        self.y1 = y1
        self.x1 = x1

        self.y2= y2
        self.x2= x2
        self.oval = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill=color)

        self.xd = random.randint(5,10)
        # self.xd = 10
        self.yd = random.randint(5,10)
        # self.yd = 10

    #Moving the Oval(ov1)
    def move(self):

        canvas.move(self.oval, self.xd, self.yd)
        # print(self.yd, self.xd)
        self.coords = canvas.coords(self.oval)
        # print (self.coords)

        if self.coords[3] + self.yd >= 700 or self.coords[1] + self.yd <= 0:
            if self.yd < 0:
                self.yd = random.randint(5,10)
                # self.yd = 10
            else:
                self.yd = -(random.randint(5,10))
                # self.yd = -10

        if self.coords[2] + self.xd >= 700 or self.coords[0] + self.xd <= 0:
            if self.xd < 0:
                self.xd = random.randint(5,10)
                # self.xd = 10
            else:
                self.xd = -(random.randint(5,10))
                # self.xd = -10

        root.update()
        # time.sleep(.000000001)


ov1 = Oval(10,10,40,40, "blue")
ov2 = Oval(80,80,120,120, "red")
ov3 = Oval(240,240,270,270, "Yellow")
ov4 = Oval(360,360,400,400, "Green")
ov5 = Oval(500,500,540,540, "white")

while True:
    ov1.move()
    ov2.move()
    ov3.move()
    ov4.move()
    ov5.move()
    time.sleep(.01)


tk.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...