0

データのリストから値が読み取られる 2 つのスライダー (最小値と最大値) に基づいて、キャンバス上に任意の数のドットをプロットするプログラムを作成しようとしています。

私が抱えている問題は、スライダーを操作するたびにキャンバスを新しいドットで更新することです。私がこれを機能させる唯一の方法は、スライダーが引っ張られるたびにキャンバス全体を再描画することです (以下のコード スニペットを参照)。キャンバスを静的なものにして、スライダーが操作されたときにリストからドットをプロットするだけです。

読みやすくするために一部を省略していますが、動作するサンプル コードをいくつか示します。

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()」に繰り返し出くわしましたが、機能していません。

何か案は?

4

1 に答える 1

0

私は最終的にそれを使用してそれを解決することができました

 matplotlib.animation

アニメートしたいものを空のドットとして定義する:

 dot=plot([],[])

次に、スライダーから値を取得し、ドットの座標を決定して関数から返します

 def animate(i):
      calculate stuff
      return dot

理由はわかりませんが、アニメーションで引数「i」が必要であることに気付くのに少し時間がかかりました。

于 2014-12-10T14:51:09.107 に答える