2013-05-22 39 views
5

Giả sử tôi có 2 mục nhập, 1 menu tùy chọn (danh sách thả xuống) và 1 nút trong tkinter. ? Làm thế nào tôi có thể thiết lập trạng thái nút widget để TÀN TẬT đến khi tất cả 3 widget được làm đầy bởi người sử dụng Đây là những gì tôi hiện đang có:Tkinter Python tắt nút cho đến khi tất cả các trường được điền

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

thử cách này, nhưng tôi không nghĩ rằng đây là cách chính xác để làm điều đó.

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

Trả lời

8

biến Tkinter có một phương pháp gọi là trace để thêm một người quan sát, do đó hàm callback được gọi khi thay đổi giá trị. Tôi nghĩ rằng đó là hiệu quả hơn so với 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

Hãy thử điều này:

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

ràng buộc trên '' yêu cầu người dùng di chuyển tiêu điểm trước khi trạng thái nút thay đổi. Đó không phải là một giải pháp tốt. Nút sẽ thay đổi trạng thái ngay khi tiện ích nhận được một số đầu vào. –

0

gì về validatevalidatecommand tính chất của nhập?

#!/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() 
Các vấn đề liên quan