2015-08-21 60 views
0

我对窗口中的所有条目窗口小部件有类似的界限。如果全部都有条目,则绘制一个按钮,如果任何一个为空,则该按钮不被绘制或移除。我希望用户输入一个特定的号码,而不是接受默认值。检查条目窗口小部件

any_entry = ttk.Entry(...) 
any_entry.bind('<Key>', is_empty) 

这是处理程序:

def is_empty(event): 
    for child in window.winfo_children(): 
     if child.winfo_class() == 'TEntry': 
      if child.get() == '': 
       calc_btn.grid_remove() 
       return 
    calc_btn.grid() 

我遇到的问题是,该处理器被调用任何按键,但存储在widget textvariable值不直到下一次按键更新或小部件失去焦点。如果我在每个Entry小部件中放入一个数字,则会显示calc_button。如果我专注于任何条目并删除条目,则在另一个键按下或移动焦点之前,该按钮不会被删除。这允许用户单击calc_button,暴露出道路上可能出现的异常或错误,因为一个Entry可能会产生空值。有关如何更好地处理此问题的任何建议?

回答

1

这是使用类编程,希望你知道它是如何工作的。如果不是,我建议学习它。

from tkinter import * 



class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     self.entry1 = Entry(self) 
     self.entry1.pack() 
     self.entry2 = Entry(self) 
     self.entry2.pack() 
     self.entry1.bind("<KeyRelease>", self.check, add = "+") 
     self.entry2.bind("<KeyRelease>", self.check, add = "+") 
     self.button = Button() 
    def check(self, event): 
     if not self.entry1.get() == "" and not self.entry2.get() == "": 
      self.button.pack()  
     else: 
      self.button.pack_forget() 
root = App() 
root.mainloop() 

我绑定“< KeyRelease>”,而不是“<按键响应>”,因为当这两个项目都只有一个字,它只有在接下来的KeyPress事件检查,因为它似乎手动首先结合火,然后默认(这很可能是一个类绑定)。我在这里读过一篇关于SO的帖子,奥克利先生(高技能的tkinter人)解释了绑定的解除顺序。而且条目最有可能KeyPress绑定到他们,逻辑上你先按,稍后发布:)

+0

完美!我不明白,也无法找到第三个参数(add ='+')的任何信息。你能解释一下还是指导我解释一个资料来源?附:我的示例没有反映,但我正在使用类结构。 –

+0

添加绑定到此小部件的事件。通常,新绑定会替换相同事件序列的任何现有绑定。通过传入“+”作为第三个参数,新的回调被添加到现有的绑定中。来源:http://effbot.org/tkinterbook/widget.htm我在那里添加它,以确保我不与现有的默认绑定插件。 –

相关问题