【发布时间】:2012-02-14 21:53:02
【问题描述】:
我正在尝试在 Tkinter 中创建一个简单的 GUI 来显示一些 xy 数据。数据按试验排列,目标是有一个旋转框,允许您选择要查看的试验。我不明白为什么,但在下面的代码中 textvariable 的值没有更新,所以我总是最终查看相同的试验。我有什么明显的遗漏吗?代码如下。 Tk.IntVar 在 init 中设置,与 spinbox(最底部)关联并在 updateDataToPlot 中使用。
#graphing stuff
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from matplotlib.lines import Line2D
import Tkinter as Tk
import numpy as np
import matplotlib.pyplot as plt
from scipy import randn
from collections import defaultdict
class DataPlotter:
def __init__(self, ax, data):
self.ax = ax
self.canvas = ax.figure.canvas
self.data = data
self.xRaw = []
self.yRaw = []
self.lineRaw = Line2D(self.xRaw, self.yRaw, animated=True, marker = None, color = 'black')
self.ax.add_line(self.lineRaw)
self.background = None
self.canvas.mpl_connect('draw_event', self.updateBackground)
self.ax.set_ylim(-3,3)
self.ax.set_xlim(-3,3)
self.ax.set_xlabel('X Pos (mm)')
self.ax.set_ylabel('Y Pos (mm)')
self.TrialNum = Tk.IntVar()
self.TrialNum.set(0)
def updateBackground(self, event):
self.background = self.canvas.copy_from_bbox(self.ax.bbox)
def updateDataToPlot(self):
trialNum = self.TrialNum.get()
print trialNum
self.xRaw = self.data['polaris_rawPositions'][trialNum][:,0]
self.yRaw = self.data['polaris_rawPositions'][trialNum][:,1]
self.updateView()
def updateView(self):
if self.background is None: return True
self.ax.figure.canvas.draw()
self.canvas.restore_region(self.background)
self.lineRaw.set_data(self.xRaw, self.yRaw)
self.ax.draw_artist(self.lineRaw)
self.canvas.blit(self.ax.bbox)
data = defaultdict(list)
for i in range(100):
data['polaris_rawPositions'].append(randn(200,2))
root = Tk.Tk()
root.wm_title("Data Explorer")
f = Figure()
ax = f.add_subplot(111)
canvas = FigureCanvasTkAgg(f, master=root)
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
canvas.show()
Plotter = DataPlotter(ax, data)
spinbox = Tk.Spinbox(master=root, textvariable = Plotter.TrialNum, command = Plotter.updateDataToPlot, fg= 'black', from_ = 0, to = 100, increment = 1)
spinbox.pack(side=Tk.BOTTOM, anchor='e', padx = 5)
root.mainloop()
【问题讨论】: