我正在使用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)
答案 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()