【问题标题】:How to control individual matplotlib subplots' x-axis scale in real time using tkinter?如何使用 tkinter 实时控制单个 matplotlib 子图的 x 轴比例?
【发布时间】:2014-11-03 23:54:16
【问题描述】:

第一次在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] 将为您提供特定子图的数据点;潜艇通常应保留在“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) 

【问题讨论】:

  • 另外,不用说我是 python 新手
  • 欢迎你,Luke,你可能会对 >>> stackoverflow.com/a/26268733/3666197 和贬低的例子感兴趣
  • 不幸的是,因为我被告知要构建其他人的代码基础架构,所以我仅限于修改已经摆在我面前的内容,这是非常严格的限制
  • 我不是 Tkinter 专家,但您的行为表明问题源于不保持 Scale 实例不同(您在循环中“覆盖”了 wScale 和 wScale2)。也许尝试形成和填充几个小部件列表?

标签: python matplotlib tkinter


【解决方案1】:

下面的示例没有问题,因此您的代码中一定有我无法复制的内容。当您说“画布”时,是画布对象上的滑块,或者只是一个比喻。还有,root[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()

【讨论】:

  • 澄清一下,滑块实际上是在画布对象上。 root 是一个根列表,即 Tkinter.Tk() Tkinter.Toplevel(),这样我就可以同时打开多个数据采集图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2019-01-06
  • 2019-05-09
相关资源
最近更新 更多