2013-05-22 5 views
5

Diciamo che ho 2 widget di voci, 1 menu di opzioni (elenco a discesa) e 1 pulsante in tkinter. ? Come posso impostare lo stato widget di pulsante per disabilitato fino a quando tutti e 3 i widget sono riempiti da parte dell'utente Questo è quello che ho attualmente:Python tkinter disabilita il pulsante fino a quando tutti i campi sono riempiti

import Tkinter as tk 

root = tk.Tk() 

entry1=tk.Entry(root,width=15).grid(row=1,column=1) 
entry2=tk.Entry(root,width=15).grid(row=1,column=2) 

choices=('a','b','c') 
var=tk.StringVar(root) 
option=tk.OptionMenu(root,var,*choices) 
option.grid(row=1,column=3) 

button=tk.Button(root,text="submit") 
button.grid(row=1,column=4) 

root.mainloop() 

--EDIT--

provato in questo modo, ma non penso che questo sia il modo corretto per farlo.

import Tkinter as tk 

root = tk.Tk() 
def myfunction(event): 
    x=var.get() 
    y=entry1.get() 
    z=entry2.get() 
    print len(x),":",len(y),":",len(z) 
    if len(y)>0 and len(x)>0 and len(z)>0: 
     button.config(state='normal') 
    else: 
     button.config(state='disabled') 
entry1=tk.Entry(root,width=15) 
entry1.grid(row=1,column=1) 
entry2=tk.Entry(root,width=15) 
entry2.grid(row=1,column=2) 

choices=('a','b','c') 
var=tk.StringVar(root) 
option=tk.OptionMenu(root,var,*choices) 
option.grid(row=1,column=3) 

button=tk.Button(root,text="submit") 
button.grid(row=1,column=4) 

root.bind("<Enter>", myfunction) 
root.mainloop() 

risposta

8

variabili Tkinter hanno un metodo chiamato trace aggiungere un osservatore, per cui la funzione di callback viene chiamata quando il valore cambia. Penso che sia molto più efficiente di root.bind("<Enter>", myfunction):

import Tkinter as tk 

root = tk.Tk() 

def myfunction(*args): 
    x = var.get() 
    y = stringvar1.get() 
    z = stringvar2.get() 
    if x and y and z: 
     button.config(state='normal') 
    else: 
     button.config(state='disabled') 

stringvar1 = tk.StringVar(root) 
stringvar2 = tk.StringVar(root) 
var = tk.StringVar(root) 

stringvar1.trace("w", myfunction) 
stringvar2.trace("w", myfunction) 
var.trace("w", myfunction) 

entry1 = tk.Entry(root, width=15, textvariable=stringvar1) 
entry1.grid(row=1,column=1) 
entry2 = tk.Entry(root, width=15, textvariable=stringvar2) 
entry2.grid(row=1,column=2) 

choices = ('a','b','c') 
option = tk.OptionMenu(root, var, *choices) 
option.grid(row=1,column=3) 

button = tk.Button(root,text="submit") 
button.grid(row=1, column=4) 

root.mainloop() 
-1

Prova questo:

import Tkinter as tk 

root = tk.Tk() 
def myfunction(*event): 
    x=var.get() 
    y=entry1.get() 
    z=entry2.get() 
    print len(x),":",len(y),":",len(z) 
    if len(y)>0 and len(x)>0 and len(z)>0: 
     button.config(state='normal') 
    else: 
     button.config(state='disabled') 
entry1=tk.Entry(root,width=15) 
entry1.grid(row=1,column=1) 
entry2=tk.Entry(root,width=15) 
entry2.grid(row=1,column=2) 

choices=('a','b','c') 
var=tk.StringVar(root) 
option=tk.OptionMenu(root,var,*choices) 
option.grid(row=1,column=3) 

button=tk.Button(root,text="submit") 
button.grid(row=1,column=4) 
button.config(state='disabled') 

root.bind_class("Entry","<FocusOut>",myfunction) 
var.trace('w', myfunction) 
root.mainloop() 
+0

associazione su "" richiede che l'utente sposti lo stato attivo prima che lo stato del pulsante cambi. Questa non è una buona soluzione. Il pulsante dovrebbe cambiare stato non appena un widget riceve un input. –

0

Che dire validate e validatecommand proprietà di ingresso?

#!/usr/bin/env python3 

import tkinter 


class App: 

    def __init__(self): 
     self.root = tkinter.Tk() 
     self.variables = {} 
     self.entries = {} 
     self.vcmd = (self.root.register(self.observer), '%W', '%P') 

     self.make_entry('fname') 
     self.make_entry('sname') 
     self.make_submit_button('Send') 

    def make_entry(self, name): 
     self.variables[name] = tkinter.StringVar() 
     self.entries[name] = tkinter.Entry(
      self.root, 
      textvariable=self.variables[name], 
      validate='all', 
      validatecommand=self.vcmd) 
     self.entries[name].pack(side=tkinter.TOP) 

    def make_submit_button(self, text): 
     self.submit_button = tkinter.Button(
      self.root, 
      text=text, 
      state=tkinter.DISABLED) 
     self.submit_button.pack(side=tkinter.BOTTOM) 

    def observer(self, id_, value): 
     id_ = int(id_[1:]) 
     self.update_submit_button_state(entry_exclude=(value and id_ or None)) 
     return True 

    def update_submit_button_state(self, entry_exclude=None): 
     if all(
      var.get() 
      for name, var in self.variables.items() 
      if id(self.entries[name]) != entry_exclude 
     ): 
      self.submit_button.config(state=tkinter.NORMAL) 
     else: 
      self.submit_button.config(state=tkinter.DISABLED) 


App().root.mainloop()