【问题标题】:Tkinter spinbox textvariableTkinter spinbox 文本变量
【发布时间】: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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    我在这里测试了 tk.spinbox 并完美地作为您的布局,刚刚检查了您的代码,您没有遇到任何异常吗?

    #self.data = '/data/data', is this right?
    #'/data/data'['polaris_rawPositions']
    #also [:,0] using period, should use dots [:.0]
    self.xRaw = self.data['polaris_rawPositions'][trialNum][:,0]
    

    也可以用于调试 porpuse 尝试在其中放置一个打印件,以便您检查值

    trialNum = self.TrialNum.get()
    print(trialNum)
    

    抱歉,如果我遗漏了什么,我真的从未接触过 matplotlib 模块。

    【讨论】:

    • “/data/data”是消息/帖子的占位符。在我的电脑上,它是一本真正的字典,里面装满了 numpy 数组。我已经完成了 print(trialNum) 并且它总是给我 0 (或者我将变量的初始值设置为什么)。逗号对于 numpy 索引是正确的。嗯
    • 示例在这里看起来不错。你在哪个平台上?
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多