Обновление холста в Python3/tkinter аналогично MATLAB, держись

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

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

Некоторый пример кода, который работает, хотя я сократил части для удобства чтения:

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 ()», но у меня не получилось.

Любые идеи?


person Halldinz0r    schedule 09.12.2014    source источник
comment
Вы хотите использовать блиттинг.   -  person tacaswell    schedule 09.12.2014
comment
Спасибо за ответ. Буду признателен, если немного уточните.   -  person Halldinz0r    schedule 10.12.2014
comment
Извините, я немного погуглил, и кажется, что я должен немного углубиться в matplotlib.animation. Я попробую это и вернусь, если мне удастся заставить его работать.   -  person Halldinz0r    schedule 10.12.2014


Ответы (1)


Наконец-то мне удалось решить эту проблему, используя

 matplotlib.animation

Определение того, что я хочу анимировать, как пустую точку:

 dot=plot([],[])

А затем получить значение от ползунков, определив координаты точки и передав их обратно из функции

 def animate(i):
      calculate stuff
      return dot

Мне потребовалось некоторое время, чтобы понять, что вам нужен аргумент «i» в анимации, хотя я не знаю, почему.

person Halldinz0r    schedule 10.12.2014