【问题标题】:Conditional disabling of widget有条件地禁用小部件
【发布时间】:2011-11-24 08:52:32
【问题描述】:

在下面的代码中,我每次在组合框中选择 1 时都尝试禁用 entry1 小部件,当我在组合框中选择 2 时禁用 entry2。

这是我的代码:

from Tkinter import *
import ttk

def refresh():
    if v.get() == 'A':
        entry1.state(['disabled'])
        entry2.state(['!disabled'])
    elif v.get() == 'B':
        entry2.state(['disabled'])
        entry1.state(['!disabled'])




root = Tk()
v = StringVar()
var = StringVar()

entry1 = ttk.Entry (root, textvariable= var)
entry1.grid(row=2, column=2, sticky=(E,W))

entry2 = ttk.Entry (root, textvariable= var)
entry2.grid(row=4, column=2, sticky=(E,W))


v_list=['A','B']
v.set(v_list[1])
v_optionmenu = apply(OptionMenu, (root,v) + tuple(v_list))
v_optionmenu.grid(column=4,row=11,sticky=(W,E))

var = v
root.bind('<Return>', lambda e: refresh)

root.mainloop()

我想创建基于条件的小部件启用和禁用。 我的条件通常是:

在组合框中选择 选择单选按钮

请告诉我如何去做。

【问题讨论】:

  • 你的代码不完整,你在哪里声明de vfault选项?如果您可以在网络上发布您的整个代码或指向它的链接,那将会很有帮助。
  • @dex19dt 我很抱歉这个错误。现在已经更正了。感谢您指出,可能让其他人感到困惑。

标签: python user-interface tkinter ttk


【解决方案1】:

您似乎缺少的部分是您可以使用configure 方法更改状态。此外,您可以在变量上设置跟踪,以便在值更改时调用函数。既然您说您想根据组合框更改状态,那么这就是您将使用的技术。您可以使用单选按钮执行类似的技巧,但单选按钮也有一个 command 选项,可以用来代替跟踪。

这是一个示例,展示了如何在组合框更改时触发“刷新”功能:

import Tkinter as tk
import ttk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.choiceVar = tk.StringVar()

        self.e1 = ttk.Entry(self)
        self.e2 = ttk.Entry(self)
        self.cb = ttk.Combobox(self, textvariable=self.choiceVar,
                               values=["Enable 1 only", "Enable 2 only"])
        self.cb.set(self.cb.cget("values")[0])

        self.cb.pack(side="top")
        self.e1.pack(side="top")
        self.e2.pack(side="top")

        self.choiceVar.trace("w", self.on_trace_choice)
        self.refresh()

    def on_trace_choice(self, name, index, mode):
        self.refresh()

    def refresh(self):
        choice = self.cb.get()
        if choice == "Enable 1 only":
            self.e1.configure(state="normal")
            self.e2.configure(state="disabled")
        else:
            self.e1.configure(state="disabled")
            self.e2.configure(state="normal")

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

【讨论】:

  • 感谢您的回复。幸运的是,我在周末想出了一个答案。您的代码对我仍然有用,因为它将帮助我使过程更加通用。我要感谢你的努力:)
【解决方案2】:
def refresh(*args):

    if  v.get() == 'Disable' :
        fb_entry.state(['disabled'])
        fw_entry.state(['disabled'])
        fb.set('')
        fw.set('')
    elif v.get() == 'Enable' :
        fb_entry.state(['!disabled'])
        fw_entry.state(['!disabled'])


root = Tk()
v = StringVar()
var = StringVar()

entry1 = ttk.Entry (root, textvariable= var)
entry1.grid(row=2, column=2, sticky=(E,W))

entry2 = ttk.Entry (root, textvariable= var)
entry2.grid(row=4, column=2, sticky=(E,W))


v_list=['Disable','Enable']
v.set(v_list[1])
v_optionmenu = apply(OptionMenu, (root,v) + tuple(v_list))
v_optionmenu.grid(column=4,row=11,sticky=(W,E))

var = v

root.bind('<Enter>',refresh_widget)
root.mainloop()

【讨论】:

  • 这段代码是不完整的,更重要的是没有遵循上一个例子的相同库命名。请注意,人们经常来这里寻找答案,为此,连贯性是一件好事。
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多