Python 如何使用Tkinter可视化时间序列数据?
我试图使用Tkinter来可视化一些时间序列数据。我的数据是2D矩阵的形式,行表示块,列表示特定时间段。所有值都在0和1之间 我想使用Tkinter创建一个python脚本,它创建一个窗口,以正方形矩阵显示块,第一列确定每个块的亮度,然后在预定的时间量后,根据数据中的连续列更改块的亮度 到目前为止,我已经创建了一个精简版本:Python 如何使用Tkinter可视化时间序列数据?,python,tkinter,Python,Tkinter,我试图使用Tkinter来可视化一些时间序列数据。我的数据是2D矩阵的形式,行表示块,列表示特定时间段。所有值都在0和1之间 我想使用Tkinter创建一个python脚本,它创建一个窗口,以正方形矩阵显示块,第一列确定每个块的亮度,然后在预定的时间量后,根据数据中的连续列更改块的亮度 到目前为止,我已经创建了一个精简版本: #!/usr/bin/python import sys import os.path import Tkinter as tk import math # progr
#!/usr/bin/python
import sys
import os.path
import Tkinter as tk
import math
# program constants
WINDOW_WIDTH = 900
# function to change the colours of the blocks based on current period
def redrawPeriod(t):
for b in xrange(len(blocks)):
luminance = int(blocks[b][t] * 255)
colour = "#%x%x%x" % (luminance,luminance,luminance)
canvas.itemconfig(block_ids[b],fill=colour)
# sample data (4 blocks 4 periods)
blocks = [
[0.0, 0.2, 0.5, 0.8],
[0.3, 0.0, 0.4, 0.0],
[0.5, 0.7, 0.0, 1.0],
[0.0, 0.0, 0.3, 0.6],
[1.0, 0.5, 0.2, 0.9]
]
# get number of blocks and periods
nB = len(blocks)
nT = len(blocks[0])
n_cols = int(math.sqrt(nB))
n_rows = n_cols
# if not perfect square number of blocks, add extra row
if (nB % n_rows != 0):
n_rows = n_rows + 1
# calculate block size
BLOCK_SIZE = WINDOW_WIDTH / n_cols
WINDOW_HEIGHT = BLOCK_SIZE * n_rows
# initialise Tkinter
root = tk.Tk()
# initialise canvas
canvas = tk.Canvas(root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT, background="#002080")
# open canvas
canvas.pack()
# container for block objects
block_ids = []
x = 0
y = -1*BLOCK_SIZE
# initialise block objects
for b in xrange(nB):
if (b % n_cols == 0):
x = 0
y = y + BLOCK_SIZE
luminance = int(blocks[b][0] * 255)
colour = "#%x%x%x" % (luminance,luminance,luminance)
id = canvas.create_rectangle(x, y, x+BLOCK_SIZE, y+BLOCK_SIZE, outline="",fill = colour)
block_ids.append(id)
x = x + BLOCK_SIZE
for t in xrange(nT):
root.after(1000, redrawPeriod,t)
root.mainloop()
这似乎是我想要它做的,但是它每次都直接跳到最后一帧-即,它不画一帧,暂停,画另一帧,再次暂停,等等
有人能帮我找出我做错了什么吗?你的问题是当你打电话时:
for t in xrange(nT):
root.after(1000, redrawPeriod,t)
root.after()
在Tkinter中运行动画的常用方法是编写一个动画方法,该方法在延迟后调用自身(有关更多信息,请参阅和)
在您的情况下,您可以这样做:
# Create all widgets
...
# Store the period indices to be redrawn ([0, 1, 2, ..., nT-1])
periods = range(nT)
# Define the animation method
def animation_loop(delay):
# Check if there are still periods to be drawn
if len(periods) > 0:
t = periods[0]
redrawPeriod(t)
# Remove the period that was just drawn from the list of periods
del periods[0]
# Call the animation_loop again after a delay
root.after(delay, animation_loop, delay)
# Start the animation loop
animation_loop(1000)
# Launch the app
root.mainloop()
谢谢,效果很好。我假设'root.after()'调用暂停了执行。但显然不是这样!再次感谢。。