检查条目窗口小部件
问题描述:
我对窗口中的所有条目窗口小部件有类似的界限。如果全部都有条目,则绘制一个按钮,如果任何一个为空,则该按钮不被绘制或移除。我希望用户输入一个特定的号码,而不是接受默认值。检查条目窗口小部件
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可能会产生空值。有关如何更好地处理此问题的任何建议?
答
这是使用类编程,希望你知道它是如何工作的。如果不是,我建议学习它。
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绑定到他们,逻辑上你先按,稍后发布:)
完美!我不明白,也无法找到第三个参数(add ='+')的任何信息。你能解释一下还是指导我解释一个资料来源?附:我的示例没有反映,但我正在使用类结构。 –
添加绑定到此小部件的事件。通常,新绑定会替换相同事件序列的任何现有绑定。通过传入“+”作为第三个参数,新的回调被添加到现有的绑定中。来源:http://effbot.org/tkinterbook/widget.htm我在那里添加它,以确保我不与现有的默认绑定插件。 –