根据OptionMenu的值更改tkinter输入框的状态

时间:2014-09-08 08:11:05

标签: python tkinter

我正在使用python 2.7并尝试根据OptionMenu小部件的值更改tkinter输入框的状态。我找到了一个如何在线进行here的例子,它是针对python 3的,但我不认为这是问题(如果我错了,请纠正我)。下面是一些示例代码,

from Tkinter import *

class App:

    def _disable_f2(self):
        if self.filt.get() == 'bandpass':
            self.filter_menu.configure(state='normal')
        else:
            self.filter_menu.configure(state='disabled')



    def __init__(self, master):



        self.f2var = Tkinter.StringVar()
        self.f2var.set('5.0')
        self.f2_entry = Tkinter.Entry(master, textvariable=self.f2var,
                                      width=5)

        self.f2_entry.pack()

        self.filt = Tkinter.StringVar()
        self.filt.set('bandpass')

        self.filter_menu = Tkinter.OptionMenu(master, self.filt, 
                                              'bandpass', 'lowpass ', 
                                              'highpass', 
                                              command=self._disable_f2)        

        self.filter_menu.pack(ipadx=50)

root = Tk()
app = App(root)
root.mainloop()

但是,即使我没有传递两个参数,我仍然会收到以下错误。谁知道原因是什么?

TypeError: _disable_f2() takes exactly 1 argument (2 given)

2 个答案:

答案 0 :(得分:1)

如果您只接受另一个参数并打印它,您可以找出OptionMenu传递的参数:

def _disable_f2(self, arg):
    print arg

您将看到它打印OptionMenu的新值。因为这个参数被传递了,你需要接受它的函数,并且你实际上正在使用它(使用self.filt.get()),所以它传递得很好。

您可以将_disable_f2功能重写为:

def _disable_f2(self, option):
    if option == 'bandpass':
        self.f2_entry.configure(state='normal')
    else:
        self.f2_entry.configure(state='disabled')

在原始代码中,当选项不是'bandpass'时,您禁用了optionmenu,但我认为您要禁用该条目吗?这就是这段代码的作用。

此外,如果您使用from Tkinter import *,则不必使用Tkinter.StringVar(),但可以使用StringVar()Entry(...)OptionMenu(...)Tk()也是如此。 尽管我建议使用import Tkinter as tk,并使用tk.StringVar()等。

答案 1 :(得分:0)

如果给_disable_f2两个参数,让它拥有它想要的东西..尝试下面...... :)

from Tkinter import *

class App:

    def _disable_f2(self, master):
        if self.filt.get() == 'bandpass':
            self.filter_menu.configure(state='normal')
        else:
            self.filter_menu.configure(state='disabled')



    def __init__(self, master):



        self.f2var = StringVar()
        self.f2var.set('5.0')
        self.f2_entry = Entry(master, textvariable=self.f2var,
                                      width=5)

        self.f2_entry.pack()

        self.filt = StringVar()
        self.filt.set('bandpass')

        self.filter_menu = OptionMenu(master, self.filt, 
                                              'bandpass', 'lowpass ', 
                                              'highpass', 
                                              command=self._disable_f2)        

        self.filter_menu.pack(ipadx=50)

root = Tk()
app = App(root)
root.mainloop()