2013-05-22 55 views
5

假设我有2个入口小部件,1个选项菜单(下拉列表)和1个tkinter按钮。 ?我怎样才能按钮控件状态设置为禁用,直到所有的3个部件是由用户填写这是我目前:Python tkinter禁用按钮,直到所有的字段填充

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() 

- 编辑 -

试过这种方法,但我不认为这是做这件事的正确方法。

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() 

回答

8

Tkinter的变量有一个叫trace添加一个观察者方法,所以调用回调函数的值更改时。我认为这是远远超过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

试试这个:

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

绑定在''上需要用户在按钮状态改变之前移动焦点。这不是一个好的解决方案。一旦小部件获得一些输入,该按钮应该改变状态。 –

0

什么validate和入境validatecommand属性?

#!/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() 
相关问题