如何在tkinter中实时控制各个matplotlib子图的x轴刻度?

0 投票
1 回答
714 浏览
提问于 2025-04-30 16:33

这是我第一次在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轴比例,而不是所有子图一起控制呢?

更新

也许问题出在我的实时绘图模块上?

注意:dsets[Figure][subs][data]可以获取特定子图的数据点;subs通常应该保持为'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

下面的例子没有问题,所以你的代码里一定有我无法复制的地方。当你说“画布”时,滑块是在一个画布对象上,还是只是说说而已?另外,roots[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()

撰写回答