首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据OptionMenu值更改tkinter输入框的状态

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

Stack Overflow用户
提问于 2014-09-08 08:11:05
回答 2查看 6.8K关注 0票数 1

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
TypeError: _disable_f2() takes exactly 1 argument (2 given)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-08 08:24:13

如果给_disable_f2两个论点,就让它得到它想要的。试试下面..。:)

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2014-09-08 09:12:40

如果您只接受另一个参数并打印它,您就可以找到由OptionMenu传递的参数是什么

代码语言:javascript
复制
def _disable_f2(self, arg):
    print arg

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

您可以将_disable_f2函数重写为:

代码语言:javascript
复制
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()等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25719865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档