Сторнирование координат Y на холсте Tkinter и анимация нескольких объектов холста на основе многократного времени - PullRequest
0 голосов
/ 28 октября 2019

Я новичок в библиотеке Tkinter на python,

Я пытаюсь анимировать фактическое время и моделируемое время автомобиля на дороге. Сегменты дороги построены с использованием данных GPS. Например, ниже мой фрейм данных:

----------------------------------------------------
Easting   | Northing | ActualTime   | SimulatedTime
----------------------------------------------------
311257    | 6408368  |     5        |     4.5
311300    | 6408400  |     5        |      4
311305    | 6408410  |     5        |      4.2
......

У меня есть 2 вопроса: 1. Как изменить координату Y на холсте tkinter? 2. Как мне анимировать объекты, движущиеся с разным временем?

Ниже показано, что я сейчас делаю:

from tkinter import *
import pandas as pd
from sklearn import preprocessing

data = pd.read_csv('data.csv')
east = data[['Easting']].values
north = data[['Northing']].values
min_max_scaler = preprocessing.MinMaxScaler()
east_scaled = min_max_scaler.fit_transform(east)
north_scaled = min_max_scaler.fit_transform(north)
data['N_Easting'] = east_scaled 
data['N_Northing'] = north_scaled

data['shiftX'] = 0
data['shiftY'] = 0
for i in range(1, len(data)):
     data['shiftX'].loc[i] = data['N_Easting'].loc[i] - data['N_Easting'].loc[i-1]
     data['shiftY'].loc[i] = data['FNorthing'].loc[i] - data['FNorthing'].loc[i-1]

master = Tk()
canvas_width = 1100
canvas_height = 1100
w = Canvas(master, width = canvas_width, height = canvas_height)
w.pack()

# creating the road segment
for i in range (0, len(data)-1):
     b = w.create_line(data['N_Easting'].loc[i], data['N_Northing'].loc[i], data['N_Easting'].loc[i+1], data['N_Northing'].loc[i+1], width = 10)

a = w.create_oval(data['N_Easting'].loc[0]-5, data['N_Northing'].loc[0]-5, data['N_Easting'].loc[0]+5, data['N_Northing'].loc[0]+5, fill = 'red')
s = w.create_oval(data['N_Easting'].loc[0]-5, data['N_Northing'].loc[0]-5, data['N_Easting'].loc[0]+5, data['N_Northing'].loc[0]+5, fill = 'yellow')

for i in range(1, len(data)):
    w.move(s, data['shiftX'].loc[i], data['shiftY'].loc[i])
    master.update()
    time.sleep(data['ActualTime'].loc[i])

for i in range(1, len(data)):
    w.move(a, data['shiftX'].loc[i], data['shiftY'].loc[i])
    master.update()
    time.sleep(data['SimulatedTime'].loc[i])

mainloop()

Однако, выполняя приведенные выше сценарии, фактический объект движется иПройдите по дорожному стиху, после того как он завершит поездку, затем симулируемый объект начнет проходить. Кто-нибудь может мне помочь, чтобы два объекта двигались вместе, чтобы я мог анимировать и сравнить время в пути реального и смоделированного транспортного средства?

Заранее спасибо!

1 Ответ

0 голосов
/ 28 октября 2019

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

Заменить:

for i in range(1, len(data)):
    w.move(s, data['shiftX'].loc[i], data['shiftY'].loc[i])
    master.update()
    time.sleep(data['ActualTime'].loc[i])

for i in range(1, len(data)):
    w.move(a, data['shiftX'].loc[i], data['shiftY'].loc[i])
    master.update()
    time.sleep(data['SimulatedTime'].loc[i])

на:

import threading

def move_func(column):
    for i in range(1, len(data)):
        w.move(s, data['shiftX'].loc[i], data['shiftY'].loc[i])
        time.sleep(data[column].loc[i])

threading.Thread(target=move_func, args=('ActualTime',)).start()
threading.Thread(target=move_func, args=('SimulatedTime',)).start()
...