使用 StringVar() 更新 TKinter (Python) 标签 - 变量未定义错误(可能是范围问题?)
Updating TKinter (Python) label with StringVar() - Variable not defined error (possible scope issue?)
好的,所以我正在尝试,每次用户更新输入框中的值时,根据输入计算一个新值并用标签显示它。
然而,我遇到了一些问题,不管我是怎么做的,方法是将 StringVar() 变量绑定到标签并通过 .set() 方法更新它。或者通过使用标签本身的 .config(text="") 方法。它向我抛出一个错误,提示我的 stringVar() 变量尚未定义或标签未定义。
这是我的代码的简化版本:
def calculateFreqResolution ():
#calculate stuff from user input
N=numSamplesTxt.get() # number of samples
Fs=freqTxt.get() #sampling frequency
N=int(N) #cast them as ints
Fs=int(Fs)
res=Fs/N
###After done calculating display it
freqRes.set(res) #DOESN'T LIKE THIS LINE
def callbackNumSamples (numSamples):
##code here validates input into entry box, if valid then calculates then calls calculateFreqResolution()
calculateFreqResolution()
def callbackFreq (frequency):
##code here validates input into entry box, if valid then calculates then calls calculateFreqResolution()
calculateFreqResolution()
root=Tk()
freqRes=StringVar()
freqRes.set(1)
freqResCalcLabel=Label(root, textvariable=freqRes)
freqResCalcLabel.grid(row=5, column=1, pady=2, padx=6)
frequency=StringVar()
frequency.trace("w", lambda name, index, mode, frequency=frequency: callbackFreq(frequency))
freqTxt=Entry(root,textvariable=frequency, justify=CENTER)
freqTxt.insert(0, 1000)
numSamples=StringVar()
numSamples.trace("w", lambda name, index, mode, numSamples=numSamples: callbackNumSamples(numSamples))
numSamplesTxt=Entry(root, textvariable=numSamples, justify=CENTER)
numSamplesTxt.insert(0,1000)
root.mainloop()
我得到的错误是 'freqRes' 尚未定义,尽管我已按照此处的定义进行了定义。
在这个简化版本的代码中,它还给我一个错误,指出 'numSamplesTxt' 在尝试使用 .get() 方法时未定义。我不知道为什么它适用于我的主要代码而不是这段代码,但我假设这是一个类似的问题,它与对象的范围有关?
问题是您在初始化所有变量之前设置跟踪。将痕迹移到脚本的底部:
...
frequency=StringVar()
numSamples=StringVar()
freqTxt=Entry(...)
numSamplesTxt=Entry(...)
...
frequency.trace("w", ...)
numSamples.trace("w", ...)
root.mainloop()
好的,所以我正在尝试,每次用户更新输入框中的值时,根据输入计算一个新值并用标签显示它。
然而,我遇到了一些问题,不管我是怎么做的,方法是将 StringVar() 变量绑定到标签并通过 .set() 方法更新它。或者通过使用标签本身的 .config(text="") 方法。它向我抛出一个错误,提示我的 stringVar() 变量尚未定义或标签未定义。
这是我的代码的简化版本:
def calculateFreqResolution ():
#calculate stuff from user input
N=numSamplesTxt.get() # number of samples
Fs=freqTxt.get() #sampling frequency
N=int(N) #cast them as ints
Fs=int(Fs)
res=Fs/N
###After done calculating display it
freqRes.set(res) #DOESN'T LIKE THIS LINE
def callbackNumSamples (numSamples):
##code here validates input into entry box, if valid then calculates then calls calculateFreqResolution()
calculateFreqResolution()
def callbackFreq (frequency):
##code here validates input into entry box, if valid then calculates then calls calculateFreqResolution()
calculateFreqResolution()
root=Tk()
freqRes=StringVar()
freqRes.set(1)
freqResCalcLabel=Label(root, textvariable=freqRes)
freqResCalcLabel.grid(row=5, column=1, pady=2, padx=6)
frequency=StringVar()
frequency.trace("w", lambda name, index, mode, frequency=frequency: callbackFreq(frequency))
freqTxt=Entry(root,textvariable=frequency, justify=CENTER)
freqTxt.insert(0, 1000)
numSamples=StringVar()
numSamples.trace("w", lambda name, index, mode, numSamples=numSamples: callbackNumSamples(numSamples))
numSamplesTxt=Entry(root, textvariable=numSamples, justify=CENTER)
numSamplesTxt.insert(0,1000)
root.mainloop()
我得到的错误是 'freqRes' 尚未定义,尽管我已按照此处的定义进行了定义。
在这个简化版本的代码中,它还给我一个错误,指出 'numSamplesTxt' 在尝试使用 .get() 方法时未定义。我不知道为什么它适用于我的主要代码而不是这段代码,但我假设这是一个类似的问题,它与对象的范围有关?
问题是您在初始化所有变量之前设置跟踪。将痕迹移到脚本的底部:
...
frequency=StringVar()
numSamples=StringVar()
freqTxt=Entry(...)
numSamplesTxt=Entry(...)
...
frequency.trace("w", ...)
numSamples.trace("w", ...)
root.mainloop()