根据OptionMenu值更改tkinter输入框状态
我正在使用 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()