条件性禁用小部件

0 投票
2 回答
3116 浏览
提问于 2025-04-17 06:59

在下面的代码中,我一直在尝试每次选择下拉框中的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()

我想要根据条件来启用和禁用小部件。我的条件通常是:

下拉框中的选择
单选按钮的选择

请给我一些建议,我该怎么做。

2 个回答

4

你似乎漏掉了一点,就是你可以用 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()
-1
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()

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答