检查条目小部件是否有空白

时间:2015-08-21 20:37:32

标签: tkinter

我在窗口中的所有Entry小部件都有类似的行。如果所有条目都有一个条目,则会绘制一个按钮,如果有任何一个按钮,则不会绘制或删除该按钮。我希望用户输入特定的数字,而不是接受默认值。

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

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

1 个答案:

答案 0 :(得分: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()

我绑定“&lt; KeyRelease&gt;”而不是“&lt; KeyPress&gt;”,因为当两个条目只有一个字符时,它只会在下一个KeyPress事件中被检查,因为它似乎首先绑定了fire,然后是默认值(很可能是类绑定)。我在这里读了一篇帖子,其中Mr.Oakley(高技能的tkinter家伙)解释了绑定的解雇顺序。条目很可能是KeyPress绑定到它们,逻辑上你先按,然后再发布:)