如何使用tkinter实时控制单个matplotlib子图的x轴刻度?

时间:2014-10-30 17:47:16

标签: python matplotlib tkinter

第一次发布到stackoverflow,所以我会尝试做到这一点......

我在python中运行数据采集模块,输入数据流是不同python模块的输出。 Tkinter滑块用于控制:绘图的x轴刻度(绘制输入数据)和“生成速度”:

for axisnum in range( len( subplots ) ):
    wScale  = Tkinter.Scale( master = roots[root],
                             label  = "View Width on Plot %s:" % ( axisnum ),
                             from_  = 3, to = 1000,
                             orient = Tkinter.HORIZONTAL,
                             sliderlength   = 30,
                             length = subplots[axisnum].get_frame().get_window_extent().width,
                             )
    wScale2 = Tkinter.Scale( master = roots[root],
                             label  = "Generation Speed for Plot %s:" % ( axisnum ),
                             from_  = 1, to = 200,
                             orient = Tkinter.HORIZONTAL,
                             sliderlength   = 30,
                             length = subplots[axisnum].get_frame().get_window_extent().width
                             )
    wScale2.pack( side = Tkinter.BOTTOM )
    wScale.pack(  side = Tkinter.BOTTOM )
    wScale.set(   100 )
    wScale2.set(  wScale2['to'] - 3 )

问题在于,虽然这会在画布上创建所有'n'对滑块小部件,但只有第一对实际上是活动的,而且还充当同时控制所有'n'子图的“主滑块”。

轻微修改导致'x和y数据必须长度相同'。

那么关于如何创建tkinter滑块的任何建议都可以控制单个图上各个子图的x轴的比例?

更新

也许问题出现在我的RealtimePlotter中?

注意dsets [Figure] [subs] [data]将为您提供特定子图的数据点; sub通常应保留为'0'。

    def RealtimePlotter():
      global dsets, wScalesList, wScales2List
      for i in range(len(Figures_List)):
          for Scale in wScalesList:
             Samples = min(len(dsets[i][0][0]),Scale[0].get())
             XAxis = pylab.arange(len(dsets[i][0][0])-Samples, 
                                  len(dsets[i][0][0], 1
                                  )
             for t in range(len(linenum)-1):
             #we choose lineax and axnum[1] because [0] is just the figure number
                 (lineax[t+1])[i].set_data(XAxis,pylab.array(dsets[i][0][t][-Samples:])
                 (axinfo[t+1]).axis([XAxis.min(),Xaxis.max(),-1.5,1.5])
          for canvas in range(len(canvasList)):
              canvasList[canvas].draw()
          for root in range(len(roots)):
              roots[root].after(100,RealtimePlotter) 

1 个答案:

答案 0 :(得分:0)

以下示例没有问题,因此您的代码中必定存在我无法复制的内容。当你说“画布”是画布对象上的滑块或者只是一个语言。另外,哪种类型的对象是根[root]。

“只有第一个实际上是活动的,而且还充当'主滑块'同时控制所有'n'子图” 我认为唯一可行的方法是它们都指向同一个对象。

import Tkinter
root=Tkinter.Tk()
root.geometry("225x150")

for slide_length in (200, 150):
    wScale  = Tkinter.Scale( master = root,
                         label  = "View Width on Plot ",
                         from_  = 3, to = 1000,
                         orient = Tkinter.HORIZONTAL,
                         sliderlength   = 30,
                         length = slide_length)
    wScale.pack(side = Tkinter.BOTTOM)
root.mainloop()