我开始根据以下网站上的代码编写GUI:effbot.org/tkinterbook/menu.htm.
理想情况下,每次我点击采样率级联上的一个命令,如图2所示,freq
变量都会更新,并使用freqflag
函数将其值打印到终端。相反,当我运行代码时,每次初始化"采样率"级联上的命令时,似乎都会调用freqflag
函数。
from Tkinter import *
import ttk
root = Tk()
def hello():
print 'hello'
def freqflag(freq):
print "frequency = %3.5f kHz" %(freq)
freq = 0
freqs = [1, 2, 3, 4]
content = ttk.Frame(root)
content.grid(column=0, row=0)
frame = ttk.Frame(content, borderwidth=5, relief="sunken")
menubar = Menu(root)
menubar.add_command(label = "Hello", command=hello)
menubar.add_command(label = "Quit", command=root.quit)
freqmenu = Menu(menubar, tearoff=0) #here, the menubar is parent
for freq in freqs:
freqmenu.add_command(label=str(freqs[freq-1]), command=freqflag(freqs[freq-1]))
menubar.add_cascade(label = "sample rate", menu = freqmenu)
root.config(menu=menubar)
root.mainloop()
生成的GUI
我发现特别奇怪的是,"Hello"one_answers"Quit"命令的初始化并没有分别调用Hello()函数或导致根GUI退出。我使用的是python 2.7。
欢迎对我在这里可能做错的地方提出任何建议。
编写时:
freqmenu.add_command(label=str(freqs[freq-1]), command=freqflag(freqs[freq-1]))
str()和freqflag()的结果被分配给label和command。若要将命令绑定到一个方法(而不是结果),则必须生成一个闭包(一个返回方法的方法)或lambda表达式。
Lambda
freqmenu.add_command(..., command=lambda: freqflag(freqs[freq-1]))
关闭
def freqflag(freq):
def inner():
print "frequency = %3.5f kHz" %(freq)
return inner
freqmenu.add_command(..., command=freqflag(freqs[freq-1]))