当Tk命令被添加到菜单级联时执行的Python函数,而不是当用户选择命令时执行的



我开始根据以下网站上的代码编写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]))

最新更新