2013-05-22 9 views
5

私は2つのエントリウィジェット、1つのオプションメニュー(ドロップダウンリスト)と1つのボタンをtkinterとしましょう。 ?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() 

--EDIT--

がこのようにしようとしたが、すべて3つのウィジェットは、ユーザーが満たされるまで、私はDISABLEDにボタンウィジェットの状態を設定することができますどのようにこれは私が現在持っているものです私はこれが正しい方法だとは思わない。

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() 
関連する問題