【问题标题】:Reversing y coordinates on Tkinter canvas and animation of multiple canvas object based on multiple time反转Tkinter画布上的y坐标和基于多个时间的多个画布对象的动画
【发布时间】:2019-10-27 22:46:24
【问题描述】:

我对 python 上的库 Tkinter 有点陌生,

我正在尝试为道路上车辆的实际时间和模拟时间设置动画。路段是使用 GPS 数据构建的。例如,下面是我的数据框:

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

我有两个问题: 1. 如何在 tkinter 画布上反转 y 坐标? 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()

但是,通过执行上面的脚本,实际对象正在移动并遍历道路诗句,当它完成行程后,模拟对象开始遍历。谁能帮我让两个物体一起移动,我可以制作动画并比较实际和模拟车辆的行驶时间?

提前致谢!

【问题讨论】:

    标签: python-3.x tkinter tkinter-canvas tkinter-scale


    【解决方案1】:

    不确定我是否理解正确,但您似乎希望两个 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()
    

    【讨论】:

    • 这正是我想要的。非常感谢。欣赏它
    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2015-07-18
    • 1970-01-01
    • 2014-09-22
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多