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

1 投票
2 回答
7847 浏览
提问于 2025-04-20 09:48

我正在使用 Python 2.7,想根据一个下拉菜单(OptionMenu)的选项来改变一个输入框(entry box)的状态。我在网上找到一个示例,虽然是针对 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 个回答

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'时,你禁用了选项菜单,但我猜你是想禁用输入框,对吧?这段代码就是这么做的。

另外,如果你使用from Tkinter import *,你就不需要写Tkinter.StringVar(),可以直接用StringVar()Entry(...)OptionMenu(...)Tk()也是一样的。不过我建议你使用import Tkinter as tk,然后用tk.StringVar()等等。

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()

撰写回答