Условное отключение виджета - PullRequest
0 голосов
/ 24 ноября 2011

В следующем коде я пытался отключить виджет entry1 каждый раз, когда я выбираю 1 в поле со списком, и отключать entry2, когда я выбираю 2 в поле со списком.

это мой код:

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 ]

3 голосов
/ 24 ноября 2011

Кусок, который вам, похоже, не хватает, - это то, что вы можете изменить состояние с помощью метода 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()
0 голосов
/ 28 ноября 2011
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()
...