Функция «Переместить объект», привязанная к клавише в Tkinter, может заставить перемещаться только один объект за раз, как сделать так, чтобы одновременно перемещалось больше объектов? - PullRequest
0 голосов
/ 25 апреля 2019

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

С помощью моего кода, нажав 'c', я создаю новый овалслучайным образом размещается на холсте и сохраняется в словаре.Каждый новый овал сохраняется с приращениями key = 'compteur', 'compteur' для каждого нового созданного овала, чтобы убедиться, что каждый овал не создан поверх предыдущего существующего.Нажав «m», я хочу делать новый овальный ход каждый раз, когда нажимаю клавишу, без остановки предыдущей.

from tkinter import *
import time
from random import *
import time

compteur = 0
dic = {}

w = Tk()
w.geometry('400x400')

c = Canvas(w, width = 400, height = 400)
c.pack()

dic[compteur] = c.create_oval(200,150,250,200,fill = 'pink')
compteur += 1

def create(event):

    global compteur
    b = randrange(300)
    dic[compteur] = c.create_oval(200,b,250,(b+50),fill = 'pink')
    compteur += 1

def move(event):

    rond = dic[randrange(len(dico))]

    if c.coords(rond)[0] == 200:

        for x in range (15):

            c.move(rond,-10,0)
            w.update()
            time.sleep(0.15)         

w.bind('<m>', move)
w.bind('<c>',create)
w.mainloop()

Я явно что-то упускаю, но, поскольку я новичок,Я понятия не имею, почему только один овал может двигаться за один раз.И как ни странно, как только второй овал заканчивает свой курс, первый начинает снова заканчивать свой курс.

Спасибо за вашу помощь:)

1 Ответ

1 голос
/ 25 апреля 2019

Я использую список, чтобы сохранить все круги.

В move() Я перемещаю последний круг из списка, только когда нажимаю <m>

В move_other() я перемещаю все круги, кроме последнего, и использую after() для запуска move_other() через 100 мс (0,1 с), поэтому он будет двигаться все время.

from tkinter import *
from random import *

# --- fucntions ---

def create(event):
    b = randrange(300)
    circles.append(c.create_oval(200, b, 250, (b+50), fill='pink'))

def move(event):
    item = circles[-1]
    c.move(item, -10, 0)

def move_other():
    for item in circles[:-1]:
        c.move(item, -10, 0)

    w.after(100, move_other)

# --- main ---

circles = []

w = Tk()
w.geometry('400x400')

c = Canvas(w, width=400, height=400)
c.pack()

circles.append(c.create_oval(200, 150, 250, 200, fill='pink'))

move_other() # start moving other circles

w.bind('<m>', move)
w.bind('<c>', create)

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