在Python3 / tkinter中刷新画布类似于MATLABs“坚持”

时间:2014-12-09 08:59:51

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

我尝试创建一个程序,根据两个滑块(最小值和最大值)在画布上绘制任意数量的点,其中从数据列表中读取值。

我遇到的问题是每次操作滑块时都会用新点刷新画布。我唯一能让它工作的方法是每次拉动滑块时重绘整个画布(如下面的代码片段所示),但这似乎相当无效,它也会产生烦人的闪烁。我希望画布有点静态,然后在操作滑块时绘制列表中的点。

一些有效的示例代码,虽然我有可读性的缩写部分:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg

from tkinter import *
from matplotlib.figure import Figure

import tkinter as Tk

list1=[0,1000,3000,5000,10000] #these lists are read from a file, but
list2=[25,50,75,100,120] #I've shortened that part down to make it compact

def slide(*args):
  slidervalue1=var.get()
  slidervalue2=var2.get()
  f = Figure(figsize=(10,8), dpi=75)
  a = f.add_subplot(111)
  a.plot(list1[slidervalue1:slidervalue2],list2[slidervalue1:slidervalue2],'.', color='k')
  canvas = FigureCanvasTkAgg(f, master=root)
  canvas.get_tk_widget().grid(row=1,column=0, sticky='nw')

root = Tk.Tk()

var=IntVar()
var2=IntVar()

f = Figure(figsize=(10,8), dpi=75)
a = f.add_subplot(111)

canvas = FigureCanvasTkAgg(f, master=root)
canvas.get_tk_widget().grid(row=1,column=0, sticky='w')

toolbar = NavigationToolbar2TkAgg(canvas,root)
toolbar.update()
toolbar.grid(row=0,column=0,sticky='w')

slider=Scale(master=root,from_=1,to=len(perctp),variable=var,orient='horizontal', command=slide)
slider2=Scale(master=root,from_=1,to=len(perctp),variable=var2,orient='horizontal')
slider.grid(row='3', column='0', sticky='w')
slider2.grid(row='3', column='0',sticky='w',padx='150')

Tk.mainloop() 

我一直在寻找这个主题,我反复遇到过" update_idletasks()"但我还没有把它发挥出来。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我终于通过

设法解决了这个问题
 matplotlib.animation

将我想要动画的内容定义为空点:

 dot=plot([],[])

然后从滑块获取值,确定点的坐标并将其从函数传回

 def animate(i):
      calculate stuff
      return dot

我花了一段时间才意识到你需要有一个论点"我"在动画中,不知道为什么会这样。